SPB Git
4.3 KB · 60 lines python
1#!/usr/bin/env python32"""Figure ch11 — frise INDICATIVE des pathologies et matériaux à risque selon la période de construction (Québec).3Les bornes de périodes sont des repères de connaissances générales du métier (matériaux en usage, dates d'interdiction4ou de normalisation) et non des statistiques : elles sont arrondies et signalées comme indicatives dans la légende.5Les seules dates vérifiées sur une source publique sont marquées « (v) » dans le libellé : interdiction de la MIUF (déc. 1980,6RNCan), interdiction de l'amiante (30 déc. 2018, Canada.ca), vermiculite Libby/Zonolite 1920-1990 (RNCan), fin du Programme7pyrrhotite (30 sept. 2026, Québec.ca), Code de construction fondé sur le CNB 2020 modifié Québec (17 avril 2025, RBQ).8Sortie : assets/figures/ch11/ch11-fig-frise-pathologies.pdf"""9import sys, pathlib10ROOT = pathlib.Path(__file__).resolve().parents[3]11sys.path.insert(0, str(ROOT / "analysis/python"))12import textwrap13import matplotlib.pyplot as plt14from traite.style import setup, palette, savefig, LARGEUR1516# (libellé, début, fin, famille) — période pendant laquelle le matériau ou la pratique à risque était couramment mis en place17FRISE = [18    ("Plomberie d'alimentation en acier galvanisé", 1900, 1960, "Plomberie"),19    ("Entrées d'eau en plomb (petits diamètres)", 1900, 1955, "Plomberie"),20    ("Fils électriques à boutons et tubes ; fusibles", 1900, 1950, "Électricité"),21    ("Isolants contenant de l'amiante (tuyaux, plâtre, carreaux) — interdiction 2018 (v)", 1920, 1985, "Isolation et air intérieur"),22    ("Vermiculite Zonolite (mine de Libby) — vente 1920-1990 (v)", 1920, 1990, "Isolation et air intérieur"),23    ("Réservoirs de mazout souterrains ou extérieurs d'origine", 1945, 1980, "Chauffage"),24    ("Filage de cuivre sans mise à la terre (deux fils)", 1945, 1962, "Électricité"),25    ("Filage d'aluminium (circuits de dérivation)", 1965, 1976, "Électricité"),26    ("Mousse isolante d'urée-formaldéhyde (MIUF) — interdite déc. 1980 (v)", 1970, 1980, "Isolation et air intérieur"),27    ("Remblai sous dalle susceptible de contenir de la pyrite (région de Montréal)", 1970, 1999, "Fondations et sols"),28    ("Tuyauterie de polybutylène (gris)", 1978, 1995, "Plomberie"),29    ("Fenêtres à simple vitrage ou à châssis de bois non étanches", 1900, 1980, "Enveloppe"),30    ("Toitures et drains français sans membrane ni cheminées de nettoyage (ocre)", 1900, 1995, "Fondations et sols"),31    ("Granulats à pyrrhotite dans le béton (Mauricie) — programme SHQ clos le 30 sept. 2026 (v)", 1996, 2008, "Fondations et sols"),32    ("Pare-vapeur et pare-air déficients, condensation dans les combles", 1975, 1995, "Enveloppe"),33    ("Construction sous le chapitre I fondé sur le CNB 2020 modifié Québec (v)", 2025, 2026, "Normes"),34]35FAMILLES = ["Fondations et sols", "Enveloppe", "Isolation et air intérieur", "Plomberie", "Électricité", "Chauffage", "Normes"]363738def main():39    setup()40    coul = {f: palette.cat[i] for i, f in enumerate(FAMILLES[:-1])}; coul["Normes"] = palette.ink241    ordre = sorted(FRISE, key=lambda r: (FAMILLES.index(r[3]), r[1]))42    fig, ax = plt.subplots(figsize=(LARGEUR, 5.2))43    for k, (lib, d, f_, fam) in enumerate(ordre):44        ax.barh(k, f_ - d, left=d, height=0.62, color=coul[fam], alpha=0.9)45    ax.set_yticks(range(len(ordre))); ax.set_yticklabels(["\n".join(textwrap.wrap(r[0], 46)) for r in ordre], fontsize=6.3)46    ax.set_ylim(-0.7, len(ordre) - 0.3); ax.invert_yaxis()47    ax.set_xlim(1900, 2030); ax.set_xticks(range(1900, 2031, 20)); ax.tick_params(axis="x", labelsize=7)48    ax.set_xlabel("Période de mise en place (repères indicatifs arrondis ;\ndates marquées (v) : vérifiées sur une source publique)", fontsize=7.5)49    ax.axvline(1998, color=palette.brand, lw=0.9, ls="--"); ax.text(1996.5, len(ordre) - 0.6, "sujet cas 1 : 1998", fontsize=7, color=palette.brand, va="center", ha="right")50    ax.grid(axis="y", visible=False)51    from matplotlib.patches import Patch52    fig.legend(handles=[Patch(color=coul[f], label=f) for f in FAMILLES], loc="lower center", ncol=4, fontsize=6.6, frameon=False, bbox_to_anchor=(0.5, -0.01))53    ax.spines["left"].set_visible(False)54    fig.tight_layout(rect=(0, 0.06, 1, 1))55    out = savefig(fig, "ch11/ch11-fig-frise-pathologies.pdf"); print("OK", out)565758if __name__ == "__main__":59    main()60
Files · d49e547b9b0535e034d80fed31849741adb255e2
Menu

Theme