spb/traite-evaluation-qc
Public
1#!/usr/bin/env python32"""Ch. 30, figure « surface » : valeur DCF du cas 3 (DONNÉES SYNTHÉTIQUES) selon le taux d'actualisation r (lignes) et le3taux de capitalisation terminal R_T (colonnes). Sortie : ch30-fig-surface.pdf."""4from __future__ import annotations5import sys, pathlib6sys.path.insert(0, str(pathlib.Path(__file__).resolve().parents[1]))7import numpy as np, matplotlib.pyplot as plt8from matplotlib.patches import Rectangle9from traite.style import setup, palette, savefig, LARGEUR10from cases import ch30_dcf as c1112def main():13 setup()14 r = c.base(); S = c.surface_r_Rt(r); h = r["hyp"]15 M = S.values / 100016 fig, ax = plt.subplots(figsize=(LARGEUR, 3.9))17 im = ax.imshow(M, cmap=palette.cmap_seq(), aspect="auto", origin="upper")18 ax.set_xticks(range(len(S.columns))); ax.set_xticklabels([f"{x*100:.2f}".replace(".", ",") for x in S.columns])19 ax.set_yticks(range(len(S.index))); ax.set_yticklabels([f"{x*100:.2f}".replace(".", ",") for x in S.index])20 ax.set_xlabel("Taux de capitalisation terminal $R_T$ (%)"); ax.set_ylabel("Taux d'actualisation $r$ (%)")21 ax.grid(False)22 vmin, vmax = M.min(), M.max()23 for i in range(M.shape[0]):24 for j in range(M.shape[1]):25 v = M[i, j]; col = "white" if (v - vmin) / (vmax - vmin) > 0.45 else palette.ink26 ax.text(j, i, f"{v:,.0f}".replace(",", " "), ha="center", va="center", fontsize=7, color=col)27 i0 = int(np.argmin([abs(x - h["taux_actualisation"]) for x in S.index])); j0 = int(np.argmin([abs(x - h["taux_terminal"]) for x in S.columns]))28 ax.add_patch(Rectangle((j0 - 0.5, i0 - 0.5), 1, 1, fill=False, ec=palette.cat[1], lw=2))29 ax.text(j0, i0 - 0.62, "base", ha="center", va="bottom", fontsize=7.5, color=palette.cat[1], fontweight="bold")30 cb = fig.colorbar(im, ax=ax, fraction=0.035, pad=0.02); cb.set_label("Valeur $V_0$ (milliers de \\$)"); cb.outline.set_visible(False)31 savefig(fig, "ch30/ch30-fig-surface.pdf")3233if __name__ == "__main__":34 main()35