spb/traite-evaluation-qc
Public
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 for _, r in pf[(pf["zone_inondable"] == 1) | (pf["contamination_sol"] == 1)].iterrows():25 ax.annotate(f"{r['id_immeuble']} · {r['valeur_2026']/1e6:.1f} M$", (r["lon"], r["lat"]), xytext=(7, 5), textcoords="offset points", fontsize=7, color=palette.ink)26 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)}27 for nom, (la, lo) in centres.items():28 g = pf[pf["rmr"] == nom]29 ax.text(lo, la + 0.22, f"{nom}\n{len(g)} imm. · {g['valeur_2026'].sum()/1e6:.0f} M$", ha="center", fontsize=7.5, color=palette.ink2)30 ax.set_xlabel("Longitude (°, coordonnées fictives)"); ax.set_ylabel("Latitude (°)")31 ax.set_xlim(-76.4, -70.4); ax.set_ylim(44.9, 49.1); ax.set_aspect(1.35)32 ax.legend(loc="upper left", fontsize=7.5, markerscale=0.6)33 fig.tight_layout()34 savefig(fig, "ch43/ch43-fig-carte-cas4.pdf")353637if __name__ == "__main__":38 main()39