SPB Git
2.7 KB · 42 lines python
1#!/usr/bin/env python32"""Figure ch43 — carte schématique des 48 immeubles du cas 4 (DONNÉES SYNTHÉTIQUES, coordonnées fictives autour des six RMR) :3taille ∝ valeur 2026, immeubles en zone inondable et terrains contaminés mis en évidence ; aucun fond de carte.4Sortie : assets/figures/ch43/ch43-fig-carte-cas4.pdf"""5import sys, pathlib6ROOT = pathlib.Path(__file__).resolve().parents[3]7sys.path.insert(0, str(ROOT / "analysis/python")); sys.path.insert(0, str(ROOT / "analysis/python/cases"))8import numpy as np, matplotlib.pyplot as plt9from traite.style import setup, palette, savefig, LARGEUR10from traite import cas4111213def main():14    setup()15    pf = cas4.charger()["portefeuille"]16    fig, ax = plt.subplots(figsize=(LARGEUR, 3.9))17    s = np.sqrt(pf["valeur_2026"] / 1e6) * 3818    base = pf[(pf["zone_inondable"] == 0) & (pf["contamination_sol"] == 0)]19    ax.scatter(base["lon"], base["lat"], s=s[base.index], color=palette.cat[0], alpha=0.55, linewidths=0, label="immeuble sans risque déclaré")20    fl = pf[pf["zone_inondable"] == 1]21    ax.scatter(fl["lon"], fl["lat"], s=s[fl.index], facecolor="none", edgecolor=palette.cat[1], linewidths=1.8, label="zone inondable (3)", zorder=4)22    so = pf[pf["contamination_sol"] == 1]23    ax.scatter(so["lon"], so["lat"], s=s[so.index], facecolor="none", edgecolor=palette.cat[2], linewidths=1.8, linestyle="--", label="contamination du sol (2)", zorder=4)24    decal = {"P20": (-62, 22), "P21": (-62, 40), "P41": (-62, -22), "P36": (9, 4), "P43": (9, -10)}25    for _, r in pf[(pf["zone_inondable"] == 1) | (pf["contamination_sol"] == 1)].iterrows():26        ax.annotate(f"{r['id_immeuble']} · {r['valeur_2026']/1e6:.1f} M$", (r["lon"], r["lat"]), xytext=decal[r["id_immeuble"]], textcoords="offset points", fontsize=7, color=palette.ink,27                    arrowprops=dict(arrowstyle="-", color=palette.ink2, lw=0.6, shrinkA=0, shrinkB=3))28    centres = {"Montréal": (45.52, -73.60), "Québec": (46.81, -71.22), "Gatineau": (45.47, -75.70), "Sherbrooke": (45.40, -71.89), "Trois-Rivières": (46.35, -72.55), "Saguenay": (48.43, -71.07)}29    for nom, (la, lo) in centres.items():30        g = pf[pf["rmr"] == nom]31        dx, dy, ha = (-0.25, -0.05, "right") if nom == "Saguenay" else ((0.0, -0.42, "center") if nom == "Montréal" else (0.0, 0.22, "center"))32        ax.text(lo + dx, la + dy, f"{nom}\n{len(g)} imm. · {g['valeur_2026'].sum()/1e6:.0f} M$", ha=ha, fontsize=7.5, color=palette.ink2)33    ax.set_xlabel("Longitude (°, coordonnées fictives)"); ax.set_ylabel("Latitude (°)")34    ax.set_xlim(-76.4, -70.4); ax.set_ylim(44.9, 49.1); ax.set_aspect(1.35)35    ax.legend(loc="upper left", fontsize=7.5, markerscale=0.6)36    fig.tight_layout()37    savefig(fig, "ch43/ch43-fig-carte-cas4.pdf")383940if __name__ == "__main__":41    main()42
Files · fd7f44c8789c8b7d81811c1898b290bc997b5c13
Menu

Theme