#!/usr/bin/env python3 """Ch. 30, figure « surface » : valeur DCF du cas 3 (DONNÉES SYNTHÉTIQUES) selon le taux d'actualisation r (lignes) et le taux de capitalisation terminal R_T (colonnes). Sortie : ch30-fig-surface.pdf.""" from __future__ import annotations import sys, pathlib sys.path.insert(0, str(pathlib.Path(__file__).resolve().parents[1])) import numpy as np, matplotlib.pyplot as plt from matplotlib.patches import Rectangle from traite.style import setup, palette, savefig, LARGEUR from cases import ch30_dcf as c def main(): setup() r = c.base(); S = c.surface_r_Rt(r); h = r["hyp"] M = S.values / 1000 fig, ax = plt.subplots(figsize=(LARGEUR, 3.9)) im = ax.imshow(M, cmap=palette.cmap_seq(), aspect="auto", origin="upper") ax.set_xticks(range(len(S.columns))); ax.set_xticklabels([f"{x*100:.2f}".replace(".", ",") for x in S.columns]) ax.set_yticks(range(len(S.index))); ax.set_yticklabels([f"{x*100:.2f}".replace(".", ",") for x in S.index]) ax.set_xlabel("Taux de capitalisation terminal $R_T$ (%)"); ax.set_ylabel("Taux d'actualisation $r$ (%)") ax.grid(False) vmin, vmax = M.min(), M.max() for i in range(M.shape[0]): for j in range(M.shape[1]): v = M[i, j]; col = "white" if (v - vmin) / (vmax - vmin) > 0.45 else palette.ink ax.text(j, i, f"{v:,.0f}".replace(",", " "), ha="center", va="center", fontsize=7, color=col) 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])) ax.add_patch(Rectangle((j0 - 0.5, i0 - 0.5), 1, 1, fill=False, ec=palette.cat[1], lw=2)) ax.text(j0, i0 - 0.62, "base", ha="center", va="bottom", fontsize=7.5, color=palette.cat[1], fontweight="bold") 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) savefig(fig, "ch30/ch30-fig-surface.pdf") if __name__ == "__main__": main()