#!/usr/bin/env python3 """Figure ch13 — composition de l'évaluation imposable uniformisée 2026 (MAMH, richesse foncière uniformisée, CC BY 4.0 ; données RÉELLES, data/raw/mamh_rfu_2026/RFU-2026.csv) pour Montréal, Québec et Gatineau. Sortie : assets/figures/ch13/ch13-fig-rfu.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 import ch13_sources as cas def main(): setup() rf = cas.rfu_2026(); villes = ["Montréal", "Québec", "Gatineau"] cats = list(cas.POSTES_RFU.values()) fig, ax = plt.subplots(figsize=(LARGEUR, 2.6)) left = np.zeros(len(villes)) for i, c in enumerate(cats): vals = np.array([rf["villes"][v]["parts_pct"][c] for v in villes]) ax.barh(villes, vals, left=left, color=palette.cat[i], label=c, height=0.6) for y, (l, v) in enumerate(zip(left, vals)): if v >= 6: ax.text(l + v / 2, y, f"{v:.0f} %", ha="center", va="center", fontsize=7.5, color=palette.ink if i in (1, 2, 5) else "white") left += vals for y, v in enumerate(villes): ax.text(101, y, f"{rf['villes'][v]['imposable_uniformise']/1e9:.0f} G$", va="center", fontsize=7.5, color=palette.ink2) ax.set_xlim(0, 112); ax.set_xlabel("Part de l'évaluation imposable uniformisée 2026 (%)") ax.invert_yaxis(); ax.legend(fontsize=7, ncol=3, loc="upper center", bbox_to_anchor=(0.5, -0.28), frameon=False) ax.grid(axis="y", visible=False) out = savefig(fig, "ch13/ch13-fig-rfu.pdf"); print("OK", out) if __name__ == "__main__": main()