#!/usr/bin/env python3 """Figure ch43 — carte schématique des 48 immeubles du cas 4 (DONNÉES SYNTHÉTIQUES, coordonnées fictives autour des six RMR) : taille ∝ valeur 2026, immeubles en zone inondable et terrains contaminés mis en évidence ; aucun fond de carte. Sortie : assets/figures/ch43/ch43-fig-carte-cas4.pdf""" import sys, pathlib ROOT = pathlib.Path(__file__).resolve().parents[3] sys.path.insert(0, str(ROOT / "analysis/python")); sys.path.insert(0, str(ROOT / "analysis/python/cases")) import numpy as np, matplotlib.pyplot as plt from traite.style import setup, palette, savefig, LARGEUR from traite import cas4 def main(): setup() pf = cas4.charger()["portefeuille"] fig, ax = plt.subplots(figsize=(LARGEUR, 3.9)) s = np.sqrt(pf["valeur_2026"] / 1e6) * 38 base = pf[(pf["zone_inondable"] == 0) & (pf["contamination_sol"] == 0)] 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é") fl = pf[pf["zone_inondable"] == 1] 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) so = pf[pf["contamination_sol"] == 1] 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) decal = {"P20": (-62, 22), "P21": (-62, 40), "P41": (-62, -22), "P36": (9, 4), "P43": (9, -10)} for _, r in pf[(pf["zone_inondable"] == 1) | (pf["contamination_sol"] == 1)].iterrows(): 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, arrowprops=dict(arrowstyle="-", color=palette.ink2, lw=0.6, shrinkA=0, shrinkB=3)) 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)} for nom, (la, lo) in centres.items(): g = pf[pf["rmr"] == nom] 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")) 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) ax.set_xlabel("Longitude (°, coordonnées fictives)"); ax.set_ylabel("Latitude (°)") ax.set_xlim(-76.4, -70.4); ax.set_ylim(44.9, 49.1); ax.set_aspect(1.35) ax.legend(loc="upper left", fontsize=7.5, markerscale=0.6) fig.tight_layout() savefig(fig, "ch43/ch43-fig-carte-cas4.pdf") if __name__ == "__main__": main()