spb/traite-evaluation-qc
Public
1#!/usr/bin/env python32"""Ch. 34, figure « exemple de calcul TAL » : composantes de l'augmentation mensuelle du logement 103 du cas 3 (DONNÉES3SYNTHÉTIQUES) selon la méthode en vigueur depuis le 1er janvier 2026 (pourcentages 2026), variante A (données du dossier) et4variante B (illustrative : taxes +8 %, assurances +10 %, immobilisations 85 000 $), avec l'écart au loyer de marché en repère.5Sortie : ch34-fig-calcul-tal.pdf."""6from __future__ import annotations7import sys, pathlib8sys.path.insert(0, str(pathlib.Path(__file__).resolve().parents[1]))9import numpy as np10import matplotlib.pyplot as plt11from traite.style import setup, palette, savefig, LARGEUR12from cases import ch34_tal as c1314def main():15 setup()16 ex = c.exemple_fixation(103)17 comp = [("Pourcentage de base\n(3,1 % × 728 $)", "base"), ("Taxes municipales\n(au-delà de 3,1 %)", "m_taxes_mun"), ("Taxes scolaires\n(au-delà de 3,1 %)", "m_taxes_scol"),18 ("Assurances\n(au-delà de 3,1 %)", "m_assurances"), ("Dépenses d'immobilisation\n(5 % × part)", "m_immobilisations"), ("Total avant arrondi", "total_brut")]19 fig, ax = plt.subplots(figsize=(LARGEUR, 3.2))20 ys = np.arange(len(comp)); h = 0.3621 for k, (nom, col, lab) in enumerate((("A", palette.cat[0], "variante A — données du dossier (taxes et assurances en baisse, aucune immobilisation)"),22 ("B", palette.cat[1], "variante B — illustrative (taxes +8 %, assurances +10 %, travaux de 85 000 $)"))):23 vals = [ex[nom][key] for _, key in comp]24 bars = ax.barh(ys + (0.5 - k) * h, vals, h, color=col, label=lab)25 for bar, v in zip(bars, vals):26 ax.text(v + 0.5, bar.get_y() + bar.get_height() / 2, f"{v:.2f} $".replace(".", ","), va="center", fontsize=7, color=palette.ink)27 ax.set_yticks(ys); ax.set_yticklabels([n for n, _ in comp], fontsize=7.5); ax.invert_yaxis()28 ax.set_xlabel("Augmentation mensuelle (dollars par mois)")29 ax.set_xlim(0, 62)30 ax.text(61, 0.05, f"Repère : écart au loyer de marché du logement 103 = {ex['ecart_marche']:.0f} $/mois ({ex['ecart_marche_pct']*100:.1f} % du loyer), hors échelle.".replace(".", ","),31 ha="right", va="top", fontsize=7, color=palette.ink2)32 ax.legend(loc="lower right", fontsize=7)33 savefig(fig, "ch34/ch34-fig-calcul-tal.pdf")3435if __name__ == "__main__":36 main()37