#!/usr/bin/env python3 """Figure ch02 — cas 3 (DONNÉES SYNTHÉTIQUES) : (a) revenu net d'exploitation projeté avec les baux en place (droit du locateur) et libre de baux (loyers de marché dès l'année 1) ; la surface entre les deux est le revenu cédé aux locataires ; (b) valeur agrégée des baux pour les locataires (V_pleine − V_locateur) selon le nombre de logements reloués par an et le taux. Sortie : assets/figures/ch02/ch02-fig-decomposition-droits.pdf""" import sys, pathlib ROOT = pathlib.Path(__file__).resolve().parents[3] sys.path.insert(0, str(ROOT / "analysis/python")); sys.path.insert(0, str(ROOT / "analysis/python/cases")) import numpy as np, matplotlib.pyplot as plt from traite.style import setup, palette, savefig, LARGEUR, fmt_dollars import ch02_droits as cas def main(): setup() res = cas.main(verbose=False) base, sens = res["base"], res["sensibilite"] pc, pm = base["proj_contrat"], base["proj_marche"] fig, (a, b) = plt.subplots(1, 2, figsize=(LARGEUR, 3.2), gridspec_kw={"width_ratios": [1.1, 1]}) yrs = pc["exercice"].values a.plot(yrs, pm["rne"] / 1000, color=palette.cat[1], marker="s", ms=3, label="libre de baux (loyers de marché)") a.plot(yrs, pc["rne"] / 1000, color=palette.cat[0], marker="o", ms=3, label="baux en place (droit du locateur)") a.fill_between(yrs, pc["rne"] / 1000, pm["rne"] / 1000, where=pm["rne"] >= pc["rne"], color=palette.cat[1], alpha=0.18, lw=0) a.annotate("revenu cédé\naux locataires", xy=(yrs[1], (pc["rne"].iloc[1] + pm["rne"].iloc[1]) / 2000), xytext=(yrs[3] + 0.3, 96), fontsize=7.5, color=palette.ink, arrowprops=dict(arrowstyle="-", color=palette.ink2, lw=0.6)) a.set_xlabel("Exercice"); a.set_ylabel("Revenu net d'exploitation (milliers de $)"); a.set_xticks(yrs[::2]) a.legend(loc="upper left", fontsize=7.4); a.set_title("(a) RNE projeté, deux faisceaux de droits", loc="left") # (b) sensibilité for k, r in enumerate(cas.TAUX): s = sens[np.isclose(sens["taux"], r)].sort_values("rotation") b.plot((s["rotation"] * 12).round(0), s["V_locataires"] / 1000, marker="o", ms=3.5, color=palette.cat[k], label=f"$r$ = {r*100:.2f} %") b.set_yscale("log"); b.set_yticks([5, 10, 25, 50, 100, 250, 500]); b.set_yticklabels(["5", "10", "25", "50", "100", "250", "500"]) b.set_xticks([0, 1, 2, 3, 6]); b.set_xlabel("Logements reloués au marché par an (sur 12)") b.set_ylabel("$V_{\\mathrm{pleine}} - V_{\\mathrm{locateur}}$ (milliers de dollars, éch. log.)") b.axvline(2, color=palette.ink2, lw=0.7, ls=":"); b.text(2.15, 200, "hypothèse\ndu cas 3", fontsize=7, color=palette.ink2) b.legend(loc="lower left", fontsize=7.4); b.set_title("(b) Valeur agrégée des baux pour les locataires", loc="left") fig.tight_layout(w_pad=2.2) out = savefig(fig, "ch02/ch02-fig-decomposition-droits.pdf"); print("OK", out) if __name__ == "__main__": main()