spb/traite-evaluation-qc
Public
1#!/usr/bin/env python32"""Figure ch21 — décomposition du coût neuf du sujet du cas 1 par corps de métier (DONNÉES SYNTHÉTIQUES, graine 20261031).3Sortie : assets/figures/ch21/ch21-fig-decomposition-corps.pdf"""4import sys, pathlib5ROOT = pathlib.Path(__file__).resolve().parents[3]6sys.path.insert(0, str(ROOT / "analysis/python")); sys.path.insert(0, str(ROOT / "analysis/python/cases"))7import matplotlib.pyplot as plt8from traite.style import setup, palette, savefig, LARGEUR, fmt_dollars9import ch21_cout_neuf as cas1011def main():12 setup()13 devis, sujet = cas.charger(); g = cas.regrouper(devis); cn = cas.cout_neuf_sujet(devis)14 noms = list(g.index) + ["Incitatif de l'entrepreneur (10 %)"]15 vals = list(g["montant"]) + [cn["incitatif"]]16 couleurs = [palette.cat[0]] * 6 + [palette.cat[1], palette.cat[3]]17 ordre = sorted(range(len(vals)), key=lambda i: vals[i])18 fig, ax = plt.subplots(figsize=(LARGEUR, 3.4))19 y = range(len(ordre))20 ax.barh(list(y), [vals[i] for i in ordre], color=[couleurs[i] for i in ordre], height=0.68)21 ax.set_yticks(list(y)); ax.set_yticklabels([noms[i] for i in ordre])22 tot = cn["total"]23 for k, i in enumerate(ordre):24 ax.text(vals[i] + 1200, k, f"{fmt_dollars(vals[i])} ({vals[i]/tot*100:.1f} %)", va="center", ha="left", fontsize=8, color=palette.ink)25 ax.set_xlim(0, max(vals) * 1.42)26 ax.xaxis.set_major_formatter(plt.FuncFormatter(fmt_dollars))27 ax.set_xlabel("Montant (dollars de 2026)")28 ax.grid(axis="y", visible=False)29 ax.set_title(f"Coût neuf total : {fmt_dollars(tot)} — directs {cn['direct']/tot*100:.1f} %, indirects {cn['indirects']/tot*100:.1f} %, incitatif {cn['incitatif']/tot*100:.1f} %",30 loc="left", fontsize=8.5, color=palette.ink)31 from matplotlib.patches import Patch32 ax.legend(handles=[Patch(color=palette.cat[0], label="Coûts directs (six corps de métier)"), Patch(color=palette.cat[1], label="Coûts indirects (cinq postes)"),33 Patch(color=palette.cat[3], label="Incitatif de l'entrepreneur")], loc="upper center", bbox_to_anchor=(0.42, -0.16), ncol=3, fontsize=7.5)34 out = savefig(fig, "ch21/ch21-fig-decomposition-corps.pdf"); print("OK", out)3536if __name__ == "__main__":37 main()38