Commit 4010a0d3 authored by Poulard Christine's avatar Poulard Christine :snake:
Browse files

Replace GenerateurCruesMaxAnnuelles.py

parent 8dda4ed6
No related merge requests found
Showing with 110 additions and 74 deletions
+110 -74
......@@ -170,33 +170,26 @@ def T_emp_parametre(n_annees, a , b):
return plotting_positions_param
def update_vlines(courbe_en_vlines, x, ymin=None, ymax=None):
# mise à jour de courbes de type vlines
# https://stackoverflow.com/questions/29331401/updating-pyplot-vlines-in-interactive-plot
seg_old = courbe_en_vlines.get_segments()
if ymin is None:
ymin = seg_old[0][0, 1]
if ymax is None:
ymax = seg_old[0][1, 1]
seg_new = [np.array([[xx, ymin],
[xx, ymax]]) for xx in x]
courbe_en_vlines.set_segments(seg_new)
def retracer_parametree(echantillon, a, b):
y_max = max(echantillon)
# si switch : au lieu de "updater", on retrace complètement en attendant se pouvoir updater des stems..
global stemlines_emp, markerline_emp , baseline_emp
if en_periode_de_retour:
T_emp = T_emp_parametre(len(echantillon), a, b)
update_vlines(courbe_estim_T_vlines, T_emp, ymin=0, ymax=y_max)
ax_T.set_title(f"T empirique pour a={a:.2f} et b={b:.2f} ")
x_emp = T_emp_parametre(len(echantillon), a, b)
else:
#freq = [ 1 - (1 / T) for T in T_emp]
freq = freq_emp_parametre(len(echantillon), a , b)
update_vlines(courbe_estim_T_vlines, freq, ymin=0, ymax=y_max)
ax_T.set_title(f"fréquence empirique pour a={a:.2f} et b={b:.2f} ")
# freq = [ 1 - (1 / T) for T in T_emp]
x_emp = freq_emp_parametre(len(echantillon), a, b)
for item in [stemlines_emp, markerline_emp, baseline_emp]:
item.remove()
markerline_emp, stemlines_emp, baseline_emp = ax_T.stem(x_emp, serie_Gumbel.serie_triee, label=f"T ou f empirique, fonction de a et b",
use_line_collection=True)
plt.setp(stemlines_emp, color='purple')
plt.setp(markerline_emp, color='cyan', markersize=2, markeredgecolor='blue', markeredgewidth=3)
plt.setp(baseline_emp, visible=False)
#ax.set_xbounds(lower=min(T_emp), upper=max(T_emp))
# on retrace
fig_pp.canvas.draw_idle()
......@@ -206,7 +199,7 @@ def retracer_Gumbel(serie_Gumbel):
courbe_Gumbel.set_xdata(SerieGumbel.T_Gumbel_plot)
else:
#freq = [ 1 - (1 / T) for T in T_emp]
freq = [ 1 - (1/T) for T in SerieGumbel.T_Gumbel_plot]
freq = [1 - (1/T) for T in SerieGumbel.T_Gumbel_plot]
courbe_Gumbel.set_xdata(freq)
# on retrace
......@@ -214,12 +207,13 @@ def retracer_Gumbel(serie_Gumbel):
def retracer_estim_Gumbel(serie_Gumbel):
gr, x0 = AjustementParametresDeGumbel(np.mean(serie_Gumbel), np.std(serie_Gumbel))
T_estim_Gumbel = [TdeQ_Gumbel(Q, gr, x0) for Q in serie_Gumbel]
if en_periode_de_retour:
T_Gumbel = [TdeQ_Gumbel(Q, gr, x0) for Q in serie_Gumbel]
courbe_estim_Gumbel.set_data(T_Gumbel, serie_Gumbel)
courbe_estim_Gumbel.set_data(T_estim_Gumbel, serie_Gumbel)
else:
# freq = [ 1 - (1 / T) for T in T_emp]
freq = freq_emp_parametre(len(serie_Gumbel), a, b)
freq = [ 1 - (1 / T) for T in T_estim_Gumbel]
courbe_estim_Gumbel.set_data(freq, serie_Gumbel)
# on retrace
......@@ -240,6 +234,59 @@ def update_b(val):
b = val # comme on a précisé "global b", changer b dans la fonction = changer b du prog principal
retracer_parametree(serie_Gumbel.serie_triee, a, b)
def create_series(event):
# bouton "recréer une série de N obs" activé
# comme on a précisé "global N_total, echantillon", sa modifications sera propagée jusque dans le prog principal
global N_total, serie_Gumbel, gr_est, x0_est, courbe_estim_Gumbel, stemlines_emp, markerline_emp, baseline_emp
serie_Gumbel = SerieGumbel(x0=196, gr=102)
serie_Gumbel.ajout_obs(N_serie)
N_total = N_serie
print("Première série d'obs : ", serie_Gumbel.serie_chrono)
ax_chrono.clear()
ax_T.clear()
# LES OBS
derniere_annee = 1 + len(serie_Gumbel.serie_chrono)
ax_chrono.vlines(x=range(1, derniere_annee), ymin=0, ymax=serie_Gumbel.serie_chrono)
ax_chrono.scatter(range(1, derniere_annee), serie_Gumbel.serie_chrono,
c=serie_Gumbel.serie_couleurs, alpha=0.7,
label=f"Q(t) observé sur {N_total} années, ", marker="*", s=60)
gr_est, x0_est = serie_Gumbel.gr_echantillon, serie_Gumbel.x0_echantillon
# LA COURBE DE GUMBEL, inchangée (sauf si tracé en fréquence...)
if en_periode_de_retour:
x_Gumbel = SerieGumbel.T_Gumbel_plot
x_emp = T_emp_parametre(N_total, a, b)
x_estimGumbel = [TdeQ_Gumbel(Q, gr_est, x0_est) for Q in serie_Gumbel.serie_triee]
else:
x_Gumbel = [1- (1/T) for T in SerieGumbel.T_Gumbel_plot]
x_emp = [1- (1/T) for T in T_emp_parametre(N_total, a, b)]
x_estimGumbel = [1 - (1 / TdeQ_Gumbel(Q, gr_est, x0_est)) for Q in serie_Gumbel.serie_triee]
courbe_Gumbel, = ax_T.plot(x_Gumbel, serie_Gumbel.QGumbel_plot, alpha=0.7, color='orangered',
linewidth=5, solid_capstyle='round',
zorder=10, label="Q(T) du bassin versant", marker="None", ls='--', markersize=7)
# courbe_estim_T_stem = markerline, stemlines, baseline (objet retournés par la fonction)
markerline_emp, stemlines_emp, baseline_emp = ax_T.stem(x_emp, serie_Gumbel.serie_triee, label=f"T ou f empirique, fonction de a et b", use_line_collection=True)
plt.setp(stemlines_emp, color='purple')
plt.setp(markerline_emp, color ='cyan', markersize=5, markeredgecolor ='blue', markeredgewidth = 3)
plt.setp(baseline_emp, visible=False)
courbe_estim_Gumbel, = ax_T.plot(x_estimGumbel, serie_Gumbel.serie_triee, color='blue', alpha=0.7,
label=" ajustement Gumbel sur obs",
zorder=10, marker="x", markersize=7)
ax_T.legend()
fig_pp.canvas.draw_idle()
return serie_Gumbel, courbe_Gumbel, gr_est, x0_est, courbe_estim_Gumbel, stemlines_emp, markerline_emp, baseline_emp
def update_series(event):
# bouton "ajouter des obs" activé
......@@ -249,28 +296,34 @@ def update_series(event):
serie_Gumbel.ajout_obs(N_serie)
ax_chrono.clear()
derniere_annee = 1 + len(serie_Gumbel.serie_chrono)
ax_chrono.set_title(f"Qmax annuels observés sur {N_total} années")
courbe_Gumbel1, = ax_chrono.plot(range(len(serie_Gumbel.serie_chrono)), serie_Gumbel.serie_chrono, ls='--')
courbe_Gumbel = ax_chrono.scatter(range(len(serie_Gumbel.serie_chrono)), serie_Gumbel.serie_chrono,
ax_chrono.vlines(x=range(1, derniere_annee), ymin=0, ymax=serie_Gumbel.serie_chrono, colors=serie_Gumbel.serie_couleurs) #, ls="--')
ax_chrono.scatter(range(1, derniere_annee), serie_Gumbel.serie_chrono,
c=serie_Gumbel.serie_couleurs, alpha=0.7, marker="*", s=20)
retracer_estim_Gumbel(serie_Gumbel.serie_triee)
fig_pp.canvas.draw_idle()
retracer_parametree(serie_Gumbel.serie_triee, a, b)
fig_pp.canvas.draw_idle()
def switch_freq(label):
global en_periode_de_retour
en_periode_de_retour = not en_periode_de_retour
retracer_parametree(serie_Gumbel.serie_triee, a, b)
retracer_Gumbel(serie_Gumbel.serie_triee)
retracer_estim_Gumbel(serie_Gumbel.serie_triee)
if en_periode_de_retour:
ax_T.set_xlim(left=0, right=N_total * 1.1)
ax_T.set_xlim(left=0, right= (N_total + b)/(1 - a) * 1.1)
ax_T.set_xlabel("Période de retour, années")
bouton_T2F.label.set_text('Période de retour => fréquence')
else:
# freq = [ 1 - (1 / T) for T in T_emp]
ax_T.set_xlim(left=0, right=1.1)
ax_T.set_xlabel("fréquence de non-dépassement")
bouton_T2F.label.set_text('fréquence => Période de retour')
ax_T.set_ylim(bottom=0, top=max(serie_Gumbel.serie_triee) * 1.1)
fig_pp.canvas.draw_idle()
......@@ -283,59 +336,43 @@ b = b_Tchego
# on va constituer une série d' "observations" par ajouts de N_series obs à la fois
N_serie = 10
serie_Gumbel = SerieGumbel(x0=196, gr=102)
serie_Gumbel.ajout_obs(N_serie)
rangs = echantillon_uniforme(N_serie)
#rangs = echantillon_uniforme(N_serie)
N_total = N_serie
en_periode_de_retour = True
print(serie_Gumbel.serie_chrono)
fig_pp = plt.figure()
gs = gridspec.GridSpec(16, 2)
gs = gridspec.GridSpec(17, 2)
ax_chrono = plt.subplot(gs[0:6, :])
ax_T = plt.subplot(gs[6:12, :])
ax_slide_a = plt.subplot(gs[15, 0])
ax_slide_b = plt.subplot(gs[15, 1])
ax_chb = plt.subplot(gs[14, 0])
ax_bouton = plt.subplot(gs[14, 1])
ax_bouton = plt.subplot(gs[7, 0])
ax_bouton_RAZ = plt.subplot(gs[7, 1])
ax_T = plt.subplot(gs[8:13, :])
ax_slide_a = plt.subplot(gs[16, 0])
ax_slide_b = plt.subplot(gs[16, 1])
ax_T2f = plt.subplot(gs[15, :])
# ax_chb = fig.add_subplot()
plt.subplots_adjust(wspace=1, hspace=0.5,left=0.1,top=0.85,right=0.9,bottom=0.1)
plt.subplots_adjust(wspace=1, hspace=0.5,left=0.1,top=0.90,right=0.9,bottom=0.1)
fig_pp.canvas.set_window_title("ScE - Hydrologie -Démo Gumbel")
fig_pp.suptitle(f"Démo Gumbel : tirages et leurs périodes de retour 'empiriques")
fig_pp.suptitle(f"Démo Gumbel : tirages et leurs périodes de retour empiriques")
ax_T.set_xlabel("Période de retour (années)")
# LES OBS
courbe_Gumbel1, = ax_chrono.plot(range(len(serie_Gumbel.serie_chrono)), serie_Gumbel.serie_chrono, ls='--')
courbe_Gumbel = ax_chrono.scatter(range(len(serie_Gumbel.serie_chrono)), serie_Gumbel.serie_chrono, c=serie_Gumbel.serie_couleurs, alpha=0.7, label= f"Q(t) observé sur {N_total} années, ", marker="*", s=20)
#LA COURBE DE GUMBEL, inchangée (sauf si tracé en fréquence...)
courbe_Gumbel, = ax_T.plot(SerieGumbel.T_Gumbel_plot, serie_Gumbel.QGumbel_plot, color='red', alpha=0.7, linewidth=5, solid_capstyle='round',
zorder=10, label = "Q(T) du bassin versant", marker="None", ls='--', markersize=7)
gr_est, x0_est = serie_Gumbel.gr_echantillon, serie_Gumbel.x0_echantillon
courbe_estim_T_vlines = ax_T.vlines(x=T_emp_parametre(N_total, a, b), ymin=0, ymax=serie_Gumbel.serie_triee, color="purple", alpha=0.7, linewidth=2,
zorder=2, label= f"T ou f empirique, fonction de a et b", ls="--")
courbe_estim_Gumbel, = ax_T.plot([TdeQ_Gumbel(Q, gr_est, x0_est) for Q in serie_Gumbel.serie_triee], serie_Gumbel.serie_triee, color='blue', alpha=0.7, label=" ajustement Gumbel sur obs",
zorder=10, marker="x", markersize=7)
for ax_s in [ax_slide_a, ax_slide_b, ax_bouton, ax_chb]:
for ax_s in [ax_slide_a, ax_bouton_RAZ, ax_T2f, ax_slide_b, ax_bouton]:
ax_s.xaxis.set_visible(False)
ax_s.yaxis.set_visible(False)
"""
for pos in ['right', 'top', 'bottom', 'left']:
ax_chb.spines[pos].set_visible(False)
ax_T2f.spines[pos].set_visible(False)
"""
print("ici")
# note : les variables après serie_Gumbel pourraient devenenir des attributs...
serie_Gumbel, courbe_Gumbel, gr_est, x0_est, courbe_estim_Gumbel, stemlines_emp, markerline_emp, baseline_emp = create_series('button_press_event')
ax_T.legend(bbox_to_anchor=(1.05, 0.05), loc='lower right')
print("Première série de max annuels créée")
# nom connu même hors de la fonction pour éviter le GC ?
# a
......@@ -351,15 +388,17 @@ slider_b = Slider(
slider_b.on_changed(update_b)
# bouton pour ajouter N_serie valeurs
valeurs_possibles_N = np.linspace(0, 100, 1)
bouton_obs = Button(
ax_bouton, f" Ajouter {N_serie} obs ", color="purple")
couleur_bouton = 'linen'
bouton_obs = Button(ax_bouton, f" Ajouter {N_serie} obs ", color=couleur_bouton)
bouton_obs.on_clicked(update_series)
# switch T / freq
# bouton pour ajouter N_serie valeurs
bouton_obs_RAZ = Button(ax_bouton_RAZ, f"Nouvelle série, {N_serie} obs ", color=couleur_bouton)
bouton_obs_RAZ.on_clicked(create_series)
chb_enT = CheckButtons(ax_chb, [ "axe des x en fréquence (de 0 à 1)"], [False])
# switch T / freq
bouton_T2F = Button(ax_T2f, "axe des x en T => fréquence (de 0 à 1) ", color=couleur_bouton)
bouton_T2F.on_clicked(switch_freq)
"""
for rect in chb_enT.rectangles:
rect.set_width(0.1)
......@@ -367,10 +406,7 @@ for rect in chb_enT.rectangles:
rect.xy = (0.05,0)
"""
chb_enT.on_clicked(switch_freq)
ax_T.legend(title="formules", bbox_to_anchor=(1.05, 0.10), loc='lower right')
#plt.tight_layout()
#fig_pp.savefig("ma_figure.png")
#fig_pp.canvas.draw()
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment