#!/usr/bin/env python3 """Figure ch24 — composantes de courte durée du sujet du cas 1 : coût neuf et dépréciation ventilée par composante (fiche d'état du ch. 11, DONNÉES SYNTHÉTIQUES, graine 20261031). Sortie : assets/figures/ch24/ch24-fig-composantes.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 matplotlib.pyplot as plt from matplotlib.patches import Patch from traite.style import setup, palette, savefig, LARGEUR, fmt_dollars import ch24_depreciation as cas def main(): setup() d = cas.charger() var = cas.variantes_physique(d["cn"], d["fiche"], d["travaux"]) ve = var["ventilee"]; f = d["fiche"].set_index("composante") noms = list(ve["courte_duree"].keys()) couts = [float(f.loc[n, "cout_neuf"]) for n in noms]; deps = [ve["courte_duree"][n] for n in noms] ordre = sorted(range(len(noms)), key=lambda i: couts[i]) fig, ax = plt.subplots(figsize=(LARGEUR, 4.3)) y = list(range(len(ordre))) ax.barh(y, [couts[i] for i in ordre], color=palette.seq[0], height=0.7) ax.barh(y, [deps[i] for i in ordre], color=palette.cat[1], height=0.7) etiquettes = [n.replace(" (brique et fibrociment)", "").replace(" (entrée 200 A, filage cuivre, éclairage)", "").replace(" (PVC, double vitrage)", " (PVC)") .replace("Ventilateur récupérateur de chaleur (VRC)", "VRC").replace(" (2 salles de bain)", "").replace(" (bardeaux d'asphalte)", "") for n in noms] ax.set_yticks(y); ax.set_yticklabels([etiquettes[i] for i in ordre], fontsize=7.5) for k, i in enumerate(ordre): ax.text(couts[i] + 500, k, f"{fmt_dollars(deps[i])} ({deps[i]/couts[i]*100:.0f} %)".replace("$", r"\$"), va="center", fontsize=7, color=palette.ink) ax.set_xlim(0, max(couts) * 1.35); ax.xaxis.set_major_formatter(plt.FuncFormatter(fmt_dollars)) ax.set_xlabel("Coût neuf de la composante (dollars de 2026) et dépréciation imputée"); ax.grid(axis="y", visible=False) tot_c = sum(couts); tot_d = sum(deps) ax.set_title(f"18 composantes : coût neuf {fmt_dollars(tot_c)}, dépréciation {fmt_dollars(tot_d)} ({tot_d/tot_c*100:.1f} %)".replace("$", r"\$"), loc="left", fontsize=8.5) ax.legend(handles=[Patch(color=palette.seq[0], label="Coût neuf (devis majoré)"), Patch(color=palette.cat[1], label="Dépréciation (âge effectif / vie utile)")], loc="lower right", fontsize=7.5) out = savefig(fig, "ch24/ch24-fig-composantes.pdf"); print("OK", out) if __name__ == "__main__": main()