From 32ee291469529458eee8223225b789f5c0a73d83 Mon Sep 17 00:00:00 2001
From: Poulard Christine <christine.poulard@irstea.fr>
Date: Thu, 20 May 2021 22:43:11 +0000
Subject: [PATCH] =?UTF-8?q?La=20variable=20"p"=20pour=20nombre=20de=20crue?=
 =?UTF-8?q?s=20a=20=C3=A9t=C3=A9=20remplac=C3=A9e=20par=20k=20pour=20ne=20?=
 =?UTF-8?q?pas=20risquer=20de=20confondre=20avec=20une=20probabilit=C3=A9?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../ProbaCruesMaxAn_SurNannees_stairs.py      | 114 +++++++++---------
 1 file changed, 57 insertions(+), 57 deletions(-)

diff --git a/Programmes en Python/ProbaCruesMaxAn_SurNannees_stairs.py b/Programmes en Python/ProbaCruesMaxAn_SurNannees_stairs.py
index ab644fc..4fa12da 100644
--- a/Programmes en Python/ProbaCruesMaxAn_SurNannees_stairs.py	
+++ b/Programmes en Python/ProbaCruesMaxAn_SurNannees_stairs.py	
@@ -8,11 +8,9 @@ coté "Python" : mettre en oeuvre deux widgets de matplotlib (Button et Slider),
 """
 
 from matplotlib import pyplot as plt
-import matplotlib.gridspec as gridspec
 from matplotlib.widgets import Slider, Button   # widgets du module matplotlib !
 from matplotlib import ticker
 from scipy.special import comb
-import numpy as np
 
 # CONSTANTE
 
@@ -24,37 +22,38 @@ TRACE_PAR_PLOT = False # False
 # FONCTIONS
 #
 # trois fonctions correspondant chacune à une manière de définir un échantillon de nb valeurs
-def proba_crue(n, p, f):
-    """  Probabilité d’avoir exactement p crues de fréquence f en n années : C(n,p)*f^p*(1-f)^(N-p)
+def proba_crue(n, k, f):
+    """  Probabilité d’avoir exactement p crues de fréquence f en n années : C(n,k)*f^k*(1-f)^(N-k)
     """
-    return comb(n, p) * (f ** p) * ((1 - f) ** (n - p))
+    return comb(n, k) * (f ** k) * ((1 - f) ** (n - k))
 
 
-def afficher_probas(nb, n, p, f):
-    nb = max(nb, p)
-    if p < 2:
-        texte = "crue supérieure"
-    else:
-        texte = "crues supérieures"
-    print(
-        f"proba d'avoir exactement p {texte} à la crue de période de retour {1 / f:.0f} (= fréquence {f:.02f] }en {n} années ")
-    for p in range(nb):
+def afficher_probas(kmax, n, f):
+    kmax = max(n, kmax)
+    print(f" pour k variant de 0 à {kmax}"
+        f"proba d'avoir exactement 'k crue(s)' supérieures à la crue de période de retour {1 / f:.0f} (= fréquence {f:.02f})  en {n} années ")
+
+    for k in range(kmax+1):
+        if k < 2:
+            texte = "crue supérieure"
+        else:
+            texte = "crues supérieures"
 
-        print(f"    exactement {p} {texte} :  {proba_crue(n, p, f):.2f)*100:.2f}%")
+        print(f"    exactement {k} {texte} :  {proba_crue(n, k, f):.2f)*100:.2f}%")
 
 def calcul_courbes(n,f):
     cumul_au_plus = 0
     liste_probas_exactement=[]
     liste_probas_auplus = []
-    p= 0
+    k= 0
     while cumul_au_plus < 0.999:
-        proba = proba_crue(n,p,f)
+        proba = proba_crue(n,k,f)
         liste_probas_exactement.append(proba)
         cumul_au_plus += proba
         liste_probas_auplus.append(cumul_au_plus)
-        p+=1
-
-    return p-1, liste_probas_exactement, liste_probas_auplus
+        k+=1
+    # on retourne k-1 car on a effectué le dernier calcul pour p-1
+    return k-1, liste_probas_exactement, liste_probas_auplus
 
 def stair_plot(x,y, couleur, label=None):
     x = [*x, x[-1]]  # duplicate last  to draw last line
@@ -68,15 +67,15 @@ def update_graphique_plot(val):
     n = int(slider_n.val)
     T = int(slider_T.val)
 
-    p, liste_probas_exactement, liste_probas_auplus = calcul_courbes(n,1/T)
-    fig.suptitle(f"Démo : probabilité d'avoir p crues > T={T}ans en {n} années")
+    k_dernier, liste_probas_exactement, liste_probas_auplus = calcul_courbes(n,1/T)
+    fig.suptitle(f"Démo : probabilité d'avoir k crues > T={T}ans en {n} années")
 
-    courbe_exactement.set_data(range(p + 1), liste_probas_exactement)
-    courbe_cumul.set_data(range(p + 1), liste_probas_auplus)
+    courbe_exactement.set_data(range(k_dernier + 1), liste_probas_exactement)
+    courbe_cumul.set_data(range(k_dernier + 1), liste_probas_auplus)
 
-    ax.set_xlim(0, p + 1)
+    ax.set_xlim(0, k_dernier + 1)
 
-    if p > 15:
+    if k_dernier > 15:
         ax.xaxis.set_major_locator(plt.MultipleLocator(5))
         ax.xaxis.set_minor_locator(plt.MultipleLocator(1))
     else:
@@ -90,43 +89,48 @@ def update_graphique_stairs(val):
     n = int(slider_n.val)
     T = int(slider_T.val)
 
-    p, liste_probas_exactement, liste_probas_auplus = calcul_courbes(n, 1 / T)
-    fig.suptitle(f"Démo : probabilité d'avoir p crues > T={T}ans en {n} années")
+    k_dernier, liste_probas_exactement, liste_probas_auplus = calcul_courbes(n, 1 / T)
+    fig.suptitle(f"Démo : probabilité d'avoir k crues > T={T}ans en {n} années")
 
     ax.clear()
-    stair_plot(range(p + 1), liste_probas_exactement, couleur="blue", label="exactement p crues")
-    stair_plot(range(p + 1), liste_probas_auplus, couleur="sienna", label="p crues ou moins de p")
-
-    ax.set_xlim(0, p + 1)
-    if p > 15:
-        ax.xaxis.set_major_locator(plt.FixedLocator([0.5 + i for i in range(0, p, 5)]))
-        ax.xaxis.set_minor_locator(plt.FixedLocator([0.5 + i for i in range(0, p, 1)]))
+    stair_plot(range(k_dernier + 1), liste_probas_exactement, couleur="blue", label="exactement k crues")
+    stair_plot(range(k_dernier + 1), liste_probas_auplus, couleur="sienna", label="k crues ou moins de k")
+
+    ax.axhline(y=0, color='grey', ls=':')
+    ax.axhline(y=1, c='grey', ls=':')
+    ax.set_xlim(0, k_dernier + 1)
+    ax.set_xlabel("nombre de crues k")
+    ax.set_ylabel("probabilité")
+
+    if k_dernier > 15:
+        ax.xaxis.set_major_locator(plt.FixedLocator([0.5 + i for i in range(0, k_dernier, 5)]))
+        ax.xaxis.set_minor_locator(plt.FixedLocator([0.5 + i for i in range(0, k_dernier, 1)]))
     else:
-        ax.xaxis.set_major_locator(plt.FixedLocator([0.5 + i for i in range(0, p, 1)]))
+        ax.xaxis.set_major_locator(plt.FixedLocator([0.5 + i for i in range(0, k_dernier, 1)]))
         ax.xaxis.set_minor_locator(plt.NullLocator())
     ax.xaxis.set_major_formatter(ticker.FormatStrFormatter("%d"))
-
+    ax.legend(loc='center right')
     fig.canvas.draw_idle()
 
 
 #CORPS DU PROGRAMME
 n = 100
 T = 100
-p, liste_probas_exactement, liste_probas_auplus = calcul_courbes(n, 1 / T)
+k_dernier, liste_probas_exactement, liste_probas_auplus = calcul_courbes(n, 1 / T)
 
 
 fig, (ax, ax_espace, ax_sn, ax_sT) = plt.subplots(nrows=4, ncols=1, gridspec_kw={'height_ratios':[6,1, 1,1]}, sharex=False)
 plt.subplots_adjust(left=0.2, bottom=None, right=None, top=None, wspace=None, hspace=0.1)
 fig.canvas.set_window_title("ScE - Hydrologie - Démo probas crue sur N années")
-fig.suptitle(f"Démo : probabilité d'avoir p crues > T={T}ans en {n} années")
+fig.suptitle(f"Démo : probabilité d'avoir k_dernier crues > T={T}ans en {n} années")
 
 if TRACE_PAR_PLOT:
-    courbe_exactement, = ax.plot(range(p + 1), liste_probas_exactement, label="exactement p crues",ls='None', marker='o', markersize=10)
-    courbe_cumul, = ax.plot(range(p + 1), liste_probas_auplus, label="p crues ou moins de p", ls='None', marker='o', markersize=10)
+    courbe_exactement, = ax.plot(range(k_dernier + 1), liste_probas_exactement, label="exactement k crues",ls='None', marker='o', markersize=10)
+    courbe_cumul, = ax.plot(range(k_dernier + 1), liste_probas_auplus, label="k crues ou moins de k", ls='None', marker='o', markersize=10)
     update_graphique = update_graphique_plot
 else:
-    stair_plot(range(p + 1),liste_probas_exactement, couleur="blue", label="exactement p crues")
-    stair_plot(range(p + 1),liste_probas_auplus, couleur="sienna",  label="p crues ou moins de p")
+    stair_plot(range(k_dernier + 1),liste_probas_exactement, couleur="blue", label="exactement k crues")
+    stair_plot(range(k_dernier + 1),liste_probas_auplus, couleur="sienna",  label="k crues ou moins de k")
     update_graphique = update_graphique_stairs
 
 for ax_s in [ax_espace, ax_sn, ax_sT]:
@@ -138,7 +142,7 @@ ax_espace.patch.set_alpha(0.01)  #sinon cet axe cache le titre de l'axe des x au
 for pos in ['right', 'top', 'bottom', 'left']:
             ax_espace.spines[pos].set_visible(False)
 
-ax.set_xlabel("nombre de crues p")
+ax.set_xlabel("nombre de crues k")
 ax.set_ylabel("probabilité")
 
 # nom connu même hors de la fonction pour éviter le GC ?
@@ -148,18 +152,18 @@ slider_n = Slider(
 
 slider_n.on_changed(update_graphique)
 
-# T, période de retour
-# valeurs_possibles = np.array([2, 5, 10, 20, 25, 50, 100, 200])
-
 slider_T = Slider(
     ax_sT, "période de retour T  ", 2, 1000, valinit=T, valstep=1, valfmt='%0.0f', color="blue")
 
 slider_T.on_changed(update_graphique)
 
-ax.legend()
-ax.set_xlim(0,p+1)
+ax.legend(loc='center right')
+ax.set_xlim(0,k_dernier+1)
+ax.axhline(y=0,color='grey',ls=':')
+ax.axhline(y=1, c='grey',ls=':')
+
 if TRACE_PAR_PLOT :
-    if p > 15:
+    if k_dernier > 15:
         ax.xaxis.set_major_locator(plt.MultipleLocator(5))
         ax.xaxis.set_minor_locator(plt.MultipleLocator(1))
     else:
@@ -167,10 +171,10 @@ if TRACE_PAR_PLOT :
         ax.xaxis.set_minor_locator(plt.NullLocator())
 else:
     if p > 15:
-        ax.xaxis.set_major_locator(plt.FixedLocator([0.5+i for i in range(0,p,5)]))
-        ax.xaxis.set_minor_locator(plt.FixedLocator([0.5+i for i in range(0,p,1)]))
+        ax.xaxis.set_major_locator(plt.FixedLocator([0.5+i for i in range(0,k_dernier,5)]))
+        ax.xaxis.set_minor_locator(plt.FixedLocator([0.5+i for i in range(0,k_dernier,1)]))
     else:
-        ax.xaxis.set_major_locator(plt.FixedLocator([0.5+i for i in range(0,p,1)]))
+        ax.xaxis.set_major_locator(plt.FixedLocator([0.5+i for i in range(0,k_dernier,1)]))
         ax.xaxis.set_minor_locator(plt.NullLocator())
 
 ax.xaxis.set_major_formatter(ticker.FormatStrFormatter("%d"))
@@ -178,10 +182,6 @@ ax.xaxis.set_major_formatter(ticker.FormatStrFormatter("%d"))
 plt.show()
 
 
-
-
-
-
 print("Premiers calculs, valeurs par défaut")
 
 
-- 
GitLab