SPB Git
2.2 KB · 38 lines python
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
Files · 66a30b7f12cdbf4da142dea3e146d765bc5bf70e
Menu

Theme