bug corrigé sur les prémas, à vérifier
[perso/Denise/oms.git] / trace_courbe.py
CommitLineData
5679dfd0
DL
1#!/usr/bin/env python3
2# -*- coding: utf-8 -*-
d03279e7 3from configuration import CONFIG
a680b2f7
DL
4import gestionOMS as oms
5import gestion_unites as u
7aac9b2a 6from gestion_donnees import calcule_max_graphique, convertit_jours_vers_python, simplifie_nom
a680b2f7 7from gestion_erreurs import debug, erreur, warning
3d7da80a 8from calculs_extrapole import calcule_donnee_extrapolee, calcule_age_extrapole, interpole_lineaire, interpole_lineaire_ordonnee, formate_resultat_donnee, formate_resultat_age, formate_interpole, formate_extrapole
32b3d061 9import datetime
3d7da80a 10
685a5f75 11from numpy import arange
3d7da80a 12
fd69b6b5 13
5679dfd0
DL
14import matplotlib.pyplot as plt
15
cf0d4c8c
DL
16# Essentiellement, la fonction qui trace la courbe, mais on y trouve également les fonctions d'extrapolation.
17# Ainsi que les calculs additionnels.
d03279e7
DL
18
19
ca61f310 20def cree_figure(conf,l_jours,l_poids,typedonnee,liste_extracalculs, liste_err, enfants_add = []):
a680b2f7
DL
21 """ conf est le dictionnaire de config. l_jours et l_poids les listes des temps (en jours) et de données
22 (donc pas forcément du poids)
23 typedonnee est le type de données (voir CONFIG["liste_typedonnees"]
24 liste_err la liste des erreurs à compléter (voir gestion_erreurs))
cf0d4c8c 25 Renvoie la figure tracée, et les calculs additionnels sont mis sous forme de chaîne dans la liste
ca61f310
DL
26 liste_extracalculs
27
28 Les enfants en plus sont dans la liste enfants_add. Pour chaque item de la liste, il faut prendre
6ac2173a
DL
29 item[typed] pour avoir accès au nom, ljours, et ldonnees
30
31 """
a63ef1b0 32 debug("debut de cree_figure. Config : "+str(conf)+". Nombre d'enfants additionnels : "+str(len(enfants_add)),liste_err)
fd69b6b5 33 try:
a680b2f7 34 liste_data_labels_p,liste_data_labels_z = oms.renvoie_liste_labels(conf,CONFIG["liste_data_choisie_p"],CONFIG["liste_data_choisie_z"],liste_err)
fd69b6b5
DL
35 except:
36 erreur("bug avec liste data labels",liste_err)
37 return ""
38
a680b2f7
DL
39 ######################## Gestion des bornes #############################
40 # y a-t-il un maxi saisi par l'utilisateur ?
fd69b6b5 41 if conf["maxi"] ==0:
8b5845ff 42 # Est-ce qu'on a donné un maxi quand même (car même échelle) ?
8b5845ff 43 if conf["non_sauve"].get("maxi",0) == 0:
8b5845ff 44 jour_maxi = calcule_max_graphique(l_jours)
5679dfd0 45 else:
8b5845ff 46 jour_maxi = conf["non_sauve"]["maxi"]+1
5679dfd0
DL
47 else:
48 jour_maxi = conf["maxi"]+1
7b1f3832 49
438ef56d
DL
50 # Si on cherche à extrapoler au-delà
51 if conf["non_sauve"]["calculextradata_type"] == typedonnee and conf["non_sauve"]["calculextradata_age"]>jour_maxi:
52 jour_maxi = int(conf["non_sauve"]["calculextradata_age"]) +1
248d9504 53
9e4c51c7 54 # On s'assure que c'est bien compris dans les bornes
9e4c51c7 55 jour_maxi = max(CONFIG["jours_mini_courbe"],min(jour_maxi,CONFIG["jours_maxi_courbe"]))
a680b2f7 56 debug("cree_figure : gestion du jour max : "+str(jour_maxi),liste_err)
5679dfd0 57
a680b2f7 58 ##################### Gestion des unités ###############################
8b5845ff
DL
59 # si l'unité n'est pas précisée, ni en "non sauvé" ni par l'utilisateur
60 if conf["unite"] == "" and conf["non_sauve"].get("unite","") == "":
a680b2f7 61 unite = u.choix_unite(jour_maxi)
8b5845ff
DL
62 debug("Unité non précisée, on choisit "+unite,liste_err)
63 elif conf["unite"] != "":
64 unite = conf["unite"]
65 else:
66 unite = conf["non_sauve"]["unite"]
67
a680b2f7 68 ##################### Gestion de la prématurité #######################"
b5ac625b
DL
69 prema = int(convertit_jours_vers_python(conf["prematurite"],liste_err))
70 ## Gestion des prémas, deux cas :
71 # Si agecorrige est oui, alors on veut juste soustraire la valeur de préma
72 # à toutes les données.
73 # Si agecorrige est non, alors on veut ajouter la valeur de préma aux courbes de référence.
a680b2f7 74 debug("Prématurité : "+str(prema)+" age corrigé : "+conf["agecorrige"],liste_err)
b5ac625b
DL
75 if prema>0 and conf["agecorrige"] == "oui":
76 l_jours = [j-prema for j in l_jours]
7b1f3832
DL
77 jour_maxi = max(jour_maxi - prema, 2)
78 ## Si le jour maxi est <0 on met minimum 1 jour quand même !
c2fe511b 79
a680b2f7
DL
80
81 ###################### Conversion des unités ###########################""
82 l_jours_conv = u.convertit_tableau(l_jours,unite,liste_err)
5679dfd0 83 # Attention, comme les jours commencent à partir de 0, faut enlever 1 pour avoir la borne...
a680b2f7 84 age_maxi = u.convertitunite(jour_maxi-1,unite,liste_err)
5679dfd0 85
b5ac625b 86 debug("cree_figure : conversion des unités ok : "+str(l_jours_conv),liste_err)
fd69b6b5 87
a680b2f7 88 #####################" Courbes OMS et titre ######################################"
8b5845ff 89 titre = "Courbe de "+typedonnee+" OMS"
5679dfd0
DL
90 if conf["typecourbe"] == "P":
91 # percentiles
92 liste_data_labels = liste_data_labels_p
93 if conf["sexe"] == "M":
8b5845ff 94 fichier_oms = CONFIG["fichiersOMS"][typedonnee]["perc_garcon"]#f_poids_perc_garcon
5679dfd0 95 titre += " (percentiles, garçon)"
a46e1269 96 elif conf["sexe"] == "F":
8b5845ff 97 fichier_oms = CONFIG["fichiersOMS"][typedonnee]["perc_fille"]
5679dfd0 98 titre += " (percentiles, fille)"
a46e1269 99 else:
8b5845ff 100 fichier_oms = CONFIG["fichiersOMS"][typedonnee]["perc_mixte"]
a46e1269 101 titre += " (percentiles)"
5679dfd0
DL
102 elif conf["typecourbe"] == "Z":
103 liste_data_labels = liste_data_labels_z
d03279e7 104 if conf["sexe"] == "M":
8b5845ff 105 fichier_oms = CONFIG["fichiersOMS"][typedonnee]["z_garcon"]
5679dfd0 106 titre += " (moyenne et écarts-types, garçon)"
a46e1269 107 elif conf["sexe"] == "F":
8b5845ff 108 fichier_oms = CONFIG["fichiersOMS"][typedonnee]["z_fille"]
5679dfd0 109 titre += " (moyenne et écarts-types, fille)"
a46e1269 110 else:
8b5845ff 111 fichier_oms = CONFIG["fichiersOMS"][typedonnee]["z_mixte"]
a46e1269 112 titre += " (moyenne et écarts-types)"
fd69b6b5 113 else:
248d9504
DL
114 erreur("Type de courbe invalide"+conf["typecourbe"],liste_err)
115 return ""
248d9504 116
ca61f310 117 ## On finira le titre plus tard quand on aura su qui est concerné
b5ac625b 118
a680b2f7 119 #debug("cree_figure : géré le type de courbe ok. Liste des data labels : "+str(liste_data_labels),liste_err)
b5ac625b 120 debug("Fichier d'où extraire les données : "+fichier_oms,liste_err)
a680b2f7 121
b5ac625b 122
5679dfd0 123 #### On extrait les données des courbes, et on convertit les jours dans l'unité voulues
a46e1269 124 try:
a680b2f7 125 t = oms.lire_fichier_csv(fichier_oms)
a46e1269 126 except:
a680b2f7 127 erreur("cree_figure : Impossible d'ouvrir le fichier "+fichier_oms, liste_err)
248d9504 128 return ""
5679dfd0 129
a680b2f7 130 debug("cree_figure : Conversion des données OMS à la bonne unité",liste_err)
b5ac625b 131 try:
a680b2f7 132 coljour= (oms.extraire_colonne(t,0,jour_maxi))
b5ac625b
DL
133 if prema>0 and conf["agecorrige"] != "oui":
134 coljour = [j + prema for j in coljour]
a680b2f7 135 coljour = u.convertit_tableau(coljour,unite,liste_err)
248d9504
DL
136 except:
137 erreur("Problème à la conversion du tableau OMS. jour_maxi = "+str(jour_maxi)+" unite = "+unite,liste_err)
138 return ""
139
a680b2f7 140 ##################### Création de la figure et du graphique ###################
248d9504 141 debug("cree_figure : prête à créer la figure",liste_err)
b5ac625b
DL
142 #### La figure, params
143
915e90bb
DL
144 fig = plt.figure(num=None, figsize=(conf["largeur"], conf["hauteur"]), dpi=100, facecolor=conf["couleurs"]["fond"])
145 plt.rcParams['axes.facecolor'] = conf["couleurs"]["fond"]
146 plt.rcParams['axes.edgecolor']= conf["couleurs"]["cadretxt"]
147 plt.rcParams['xtick.color'] = conf["couleurs"]["cadretxt"]
148 plt.rcParams['ytick.color'] = conf["couleurs"]["cadretxt"]
149 plt.rcParams['grid.color'] = conf["couleurs"]["grille"]
150 plt.rcParams['legend.edgecolor'] = conf["couleurs"]["grille"]
685a5f75 151 ax = plt.axes()
fd69b6b5 152
a680b2f7 153 ###################### Tracé des différentes courbes
c2fe511b 154 #Tracé des courbes OMS
5679dfd0 155 for (i,label,couleur) in liste_data_labels:
a680b2f7 156 ax.plot(coljour,oms.extraire_colonne(t,i,jour_maxi),label=label,color=couleur)
fd69b6b5 157
248d9504 158 debug("cree_figure : tracé des courbes OMS ok",liste_err)
a680b2f7 159
b5ac625b 160 ### Tracé pour de bon
5679dfd0 161 if l_jours != []:
38b5e10a
DL
162 print(conf["symbole"])
163 ax.plot(l_jours_conv,l_poids,label=conf["nom"],color=conf["couleurs"]["courbeenfant"],marker=conf["symbole"])
b5ac625b 164 debug("Tracé de la courbe enfant, avec les jours "+str(l_jours_conv),liste_err)
ca61f310
DL
165
166
167 listenoms = []
168 if conf["nom"] != "": # Ajouter le nom de l'enfant
169 listenoms.append(conf["nom"])
170
a63ef1b0
DL
171# if enfants_add != []:
172# debug("Il y a des enfants en plus à tracer. Données : "+str(enfants_add), liste_err)
ca61f310
DL
173 for enfant in enfants_add: # Enfants additionnels éventuels
174 conf_add, lj, ld = enfant[typedonnee] # On récuère les données
175 if lj != []: # pas la peine de tracer si y'a rien à tracer
176 # Ajouter le nom de cet enfant-là
177 listenoms.append(conf_add["nom"])
7aac9b2a
D
178 # Le mot "courbe" doit être au pluriel du coup !
179 titre = titre.replace("Courbe ", "Courbes ")
ca61f310 180 lj_conv = u.convertit_tableau(lj,unite,liste_err)
38b5e10a
DL
181 debug("Tracé de la courbe additionnelle de "+conf_add["nom"]+" config : "+str(conf_add), liste_err)
182 ax.plot(lj_conv, ld, label=conf_add["nom"], color=conf_add["couleurcourbe"],marker=conf_add["symbole"])
e4ec2d3d 183
ca61f310
DL
184 if conf["sexe"] != conf_add["sexe"]:
185 warning("Attention, tous les enfants n'ont pas le même sexe. La courbe de référence est celle de "+conf["nom"]+" et ne sera pas forcément pertinente pour les autres. Vous pouvez éventuellement essayer la courbe neutre. Remarque : cette alerte s'affichera quand même.", liste_err)
186
38b5e10a 187
7aac9b2a
D
188 # Si y'a un nom on met "courbe de machin, de bidule, d'alala, de truc"
189 for i in range(len(listenoms)):
190 # Mot de liaison : , ou et ?
191 if i>0 and i!=len(listenoms)-1:
192 titre += ", "
193 elif i>0 and i == len(listenoms) -1:
194 titre+= " et "
195 else:
196 titre += " "
197 # Est-ce que la première lettre est une voyelle ?
198 lettre = simplifie_nom(listenoms[i]).lower()[0]
199 if lettre in CONFIG["voyelles"]:
200 titre += "d'"
201 else:
202 titre += "de "
203 titre += listenoms[i]
ca61f310
DL
204
205 if prema>0:
206 titre+= ", préma de "+conf["prematurite"]
207 if conf["agecorrige"] == "oui":
208 titre+=" (courbe en âge corrigé)"
209 else:
210 titre+=" (courbe en âge réel, données OMS décalées)"
211
c2fe511b 212 #### extrapolatios éventuelles
cf0d4c8c
DL
213 # a-t-on demndé des calculs ?
214 jextrapole = conf["non_sauve"]["prolongercourbes"] == "oui"
215 # Est-ce qu'on a demandé un calcul sur cette donnée ?
a63ef1b0 216
cf0d4c8c
DL
217 for calextra in CONFIG["extradata"]:
218 jextrapole = jextrapole or conf["non_sauve"][calextra+"_type"] == typedonnee
219
220 #print(jextrapole)
3d7da80a 221 ############################## Là où on extrapole ################################
cf0d4c8c
DL
222 if jextrapole:
223 try:
224 debug("Il faut extrapoler les courbes !", liste_err)
225 # Prendre l'ensemble des dates "source"
226 # print(conf["non_sauve"]["nbdataextra"])
227 if conf["non_sauve"]["nbextradata"] == 0:
228 sources_extrap = l_jours
229 sources_extrap_data = l_poids
230 else:
231 sources_extrap = l_jours[-conf["non_sauve"]["nbextradata"]:] # les derniers jours
232 sources_extrap_data = l_poids[-conf["non_sauve"]["nbextradata"]:]
233
234 debug("On extrapole sur les jours : "+str(sources_extrap), liste_err)
235
3d7da80a 236 # On récupère toutes les données extrapolées
cf0d4c8c
DL
237 dates_extrapole, donnees_extrapole = prolongecourbe(t, sources_extrap, sources_extrap_data, conf["typecourbe"], liste_err)
238 debug("données extrapolées !", liste_err)
239 #debug(str(dates_extrapole[0:10])+str(donnees_extrapole[0:10]), liste_err)
240
241 # QUe veut-on maintenant sur ces données extrapolées ?
242 # Afficher la courbe
243 if conf["non_sauve"]["prolongercourbes"] == "oui":
244 # On va prendre les extrapolations de la dernière donnée jusqu'à l fin du graphe
245 debut_extr = int(l_jours[-conf["non_sauve"]["nbextradata"]])
246 i_debut_extr = dates_extrapole.index(debut_extr)
32b3d061
D
247 if jour_maxi >= dates_extrapole[-1]:
248 i_fin_extr = len(dates_extrapole) -1
249 else:
250 i_fin_extr = dates_extrapole.index(jour_maxi)
251 print("bla", i_debut_extr, i_fin_extr)
cf0d4c8c
DL
252 # Voilà ce qu'on veut tracer
253 dates_extrapole_trace = dates_extrapole[i_debut_extr:i_fin_extr+1]
254 donnees_extrapole_trace = donnees_extrapole[i_debut_extr:i_fin_extr+1]
255 dates_extrapole_trace = u.convertit_tableau(dates_extrapole_trace,unite,liste_err)
256
257 # tracé des données extrapolées
258 plt.plot(dates_extrapole_trace, donnees_extrapole_trace,color=conf["couleurs"]["cadretxt"], linestyle=(0, (5,7)), marker=None)
259 debug("Tracé de la courbe extrapolée ok", liste_err)
260
3d7da80a 261 ### Calculer une donnée à l'âge x
cf0d4c8c 262 if conf["non_sauve"]["calculextradata_type"] == typedonnee:
3d7da80a
DL
263 # On essaie l'interpolation
264 r = interpole_lineaire(l_jours,l_poids,conf["non_sauve"]["calculextradata_age"], liste_err)
265 if r==-1:
266 # ça sera donc une extrapolation
267 r = calcule_donnee_extrapolee(dates_extrapole, donnees_extrapole, conf["non_sauve"]["calculextradata_age"], liste_err)
268 message=formate_extrapole(conf["non_sauve"]["nbextradata"])
3d7da80a
DL
269 else:
270 message=formate_interpole()
271
32b3d061 272 texte = formate_resultat_donnee(conf["non_sauve"]["calculextradata_age"], conf["non_sauve"]["calculextradata_date"], r, typedonnee, message, liste_err)
3d7da80a
DL
273 debug("calcul de la donnée extrapolée : "+texte, liste_err)
274 if texte!="":
275 liste_extracalculs.append(texte)
32b3d061 276 #print(liste_extracalculs)
3d7da80a
DL
277 # Ajouter le trait ?
278 if conf["non_sauve"]["calculextradata_trace"] == "oui":
279 dessine_guides(conf["non_sauve"]["calculextradata_age"], r, conf["couleurs"]["cadretxt"], unite, ax, liste_err)
cf0d4c8c 280
3d7da80a 281 ### Calculer un âge où on atteint cette donnée
cf0d4c8c 282 if conf["non_sauve"]["calculextratemps_type"] == typedonnee:
3d7da80a
DL
283 # interpolation
284 r = interpole_lineaire_ordonnee(l_jours,l_poids,conf["non_sauve"]["calculextratemps_val"], liste_err)
32b3d061
D
285 if type(conf["naissance"]) == datetime.date:
286 rdate = conf["naissance"] + datetime.timedelta(days=r)
287 else:
288 rdate = None
289
3d7da80a
DL
290 if r==-1:
291 # ça sera donc une extrapolation
32b3d061
D
292 r = calcule_age_extrapole(dates_extrapole, donnees_extrapole, conf["non_sauve"]["calculextratemps_val"], liste_err)
293 if type(conf["naissance"]) == datetime.date:
294 rdate = conf["naissance"] + datetime.timedelta(days=round(r))
295 else:
296 rdate = None
3d7da80a
DL
297 message=formate_extrapole(conf["non_sauve"]["nbextradata"])
298 else:
299 message=formate_interpole()
32b3d061
D
300 print(r, rdate)
301 texte = formate_resultat_age(r, rdate, conf["non_sauve"]["calculextratemps_val"], typedonnee, message, liste_err)
3d7da80a
DL
302
303 #r = calcule_age_extrapole(dates_extrapole, donnees_extrapole, conf["non_sauve"]["calculextratemps_val"], typedonnee, liste_err)
304 if texte!="":
305 liste_extracalculs.append(texte)
cf0d4c8c 306 print(liste_extracalculs)
3d7da80a
DL
307 # Ajouter le trait ?
308 if conf["non_sauve"]["calculextratemps_trace"]:
309 dessine_guides(r, conf["non_sauve"]["calculextratemps_val"], conf["couleurs"]["cadretxt"], unite, ax, liste_err)
cf0d4c8c
DL
310
311 except:
312 warning("Des problèmes pour extrapoler...", liste_err)
c2fe511b
DL
313
314 else:
315 debug("On ne trace pas de courbe enfant", liste_err)
316
a680b2f7
DL
317 ###################" Gestion de l'échelle #####################
318 debug("Courbes tracées. Il n'y a plus qu'à gérer l'échelle", liste_err)
685a5f75 319 ### échelle à régler
a680b2f7
DL
320
321 # On extrait la valeur min et la valeur max des poids des courbes OMS et des données
322 (colonne_min,_,_) = liste_data_labels[-1]
323 (colonne_max,_,_) = liste_data_labels[0]
685a5f75 324
a680b2f7
DL
325 # poids max OMS
326 poids_min = min(oms.extraire_colonne(t,colonne_min,jour_maxi))
327 poids_max = max(oms.extraire_colonne(t,colonne_max,jour_maxi))
328 if l_jours != []:
329 poids_min = min(min(l_poids),poids_min)
330 # Pour le poids max, voir la dernière valeur du tableau
331 i = 0
332 while i<len(l_jours) and l_jours[i]<jour_maxi:
333 i=i+1
334 poids_max = max(max(l_poids[0:i+1]),poids_max)
335 # On ajuste un peu ces min et max
336 # min : valeur min -1kg
337 poids_min = max(0,poids_min-1)
338 #max : +5%
339 poids_max = poids_max * 1.05
340
341
7b1f3832 342
6ac2173a
DL
343 ### Repères additionnels éventuels.
344 #reperes est une liste qui contient des dictionnaires avec "typed" (type de donnée : âge, etc), "donnee" :
345 #la donnée (en jours pour l'âge), et "texte": le texte à mettre sur le repère en question.
346 #Pour tracer des repères verticaux (horizontaux plus tard) sur la courbe.
7b1f3832
DL
347
348 debug("Échelle ok. Voir s'il y a des repères supplémentaires : "+str(conf["liste_reperes"]), liste_err)
349
6ac2173a
DL
350 for rep in conf["liste_reperes"]:
351 if rep.get("trace", "") == "oui": # SI on veut tracer
352 agec = u.convertitunite(rep["donnee"], unite, liste_err)
353 # Tracé de la ligne verticale
354 ax.vlines(agec, poids_min, poids_max, linestyles="dashed", color=conf["couleurs"]["cadretxt"])
32b3d061
D
355 # date à afficher ?
356 if rep["affichedate"] == "oui" and rep["date"] != "":
357 ax.text(agec, poids_min,rep["date"]+" ", rotation=90, verticalalignment='top', horizontalalignment='center', color=conf["couleurs"]["cadretxt"], fontstyle="italic")
358 # Si y'a un texte à afficher
6ac2173a
DL
359 if rep["texte"] != "":
360 ax.text(agec, poids_min, " "+rep["texte"], rotation=90, verticalalignment='bottom', horizontalalignment='right', color=conf["couleurs"]["cadretxt"])
361
362
363
364
365
a680b2f7 366 # Grille custom ?
685a5f75 367 if conf["non_sauve"]["grilleamelio"] == "oui":
a680b2f7
DL
368 debug("On a choisi la grille plus jolie", liste_err)
369 pas=u.choix_echelle_data(typedonnee, poids_max)
685a5f75
DL
370 # data_min_arrondie
371 minechelle = int(poids_min/pas[0])*pas[0]
372
373 debug("pas choisis pour l'échelle en y : "+str(pas), liste_err)
374 echellemajeure = arange(minechelle, poids_max, pas[0])
375
376 if pas[1] >0:
377 echellemineure = arange(minechelle, poids_max, pas[1])
378 else:
379 echellemineure = []
380
381 ax.set_yticks(echellemajeure, minor=False)
382 ax.set_yticks(echellemineure, minor=True)
685a5f75 383 # échelle en temps
7b1f3832
DL
384
385 # Le jour minimum n'est pas forcément zéro !
386 age_mini = min(l_jours[0], 0)
387
388 pas=u.choix_echelle_temps(unite, age_maxi - age_mini)
685a5f75 389 debug("pas choisis pour l'échelle en x : "+str(pas), liste_err)
7b1f3832
DL
390
391
685a5f75 392
7b1f3832 393 echellemajeure = arange(age_mini,age_maxi, pas[0])
685a5f75 394 if pas[1] >0:
7b1f3832 395 echellemineure = arange(age_mini,age_maxi, pas[1])
685a5f75
DL
396 else:
397 echellemineure = []
398 ax.set_xticks(echellemajeure, minor=False)
399 ax.set_xticks(echellemineure, minor=True)
400
a680b2f7 401 ################################# Aspect du graphique
685a5f75
DL
402
403 debug("On commende la déco du graphique", liste_err)
404
405 # La grille
406 ax.grid(conf["grille"]=="oui")
407 ax.grid(conf["grille"] == "oui", which="minor", linestyle="--")
408
409
8b5845ff
DL
410 plt.xlabel("Âge en "+unite,color=conf["couleurs"]["cadretxt"])
411 plt.ylabel(typedonnee.capitalize()+" en "+CONFIG["unites_typedonnees"][typedonnee],color=conf["couleurs"]["cadretxt"])
915e90bb 412 plt.title(titre,color=conf["couleurs"]["cadretxt"])
c2fe511b
DL
413 if l_jours_conv == []:
414 plt.axis([0,age_maxi, poids_min, poids_max])
415 else:
416 plt.axis([min(0,l_jours_conv[0]),age_maxi,poids_min,poids_max])
c2fe511b 417
5679dfd0
DL
418
419 if conf['legende']=="oui":
fd69b6b5 420 legende = plt.legend(loc=conf['positionlegende'])
915e90bb 421 plt.setp(legende.get_texts(), color=conf["couleurs"]["cadretxt"])
685a5f75 422
5679dfd0
DL
423
424 fig.tight_layout()
fd69b6b5 425
a680b2f7 426 debug("Fin de cree_figure, tout va bien.", liste_err)
c2fe511b
DL
427 return fig
428
429
430
685a5f75 431
a680b2f7 432######################################## Pour extrapoler la courbe
685a5f75 433
cf0d4c8c
DL
434def prolongecourbe(tableauOMS, dates, donnees, typecourbe, liste_err):
435 """ tableauOMS est le ableau des données OMS. dates et donnees sont les dates (jours)
436 et les données d'où on extrapole. On calcule toutes les dates comme des sauvages.
437 On renvoie la liste des jours totale et la liste des data_totales
c2fe511b
DL
438 (tableaux de jours)
439 typecourbe est P ou Z. Pour P il faut commencer à regarder à l'indice 4, pour Z
440 à l'indice 1
cf0d4c8c
DL
441 On renvoie [],[] si pas pu extrapoler. """
442 # les lignes OMS correspondant aux dates données
443 lignesoms = [tableauOMS[int(date)] for date in dates]
444 debug("prolongecourbe : Lignes OMS :"+str(lignesoms)+" valeur de données : "+str(donnees), liste_err)
c2fe511b 445
c2fe511b
DL
446
447
cf0d4c8c
DL
448 # Principe : on cherche dans quel intervalle de "colonnes" on se situe.
449 # On va donc regarder pour chaque donnée entre quels i on se situe,et après
450 # prendre le plus grand intervalle.
451 # Numéros de colonnes d'où on part. Pour la fin c'est forcément longueur-1
c2fe511b
DL
452 if typecourbe == "P":
453 idep=4
454 else:
455 idep = 1
cf0d4c8c
DL
456
457 liste_indices = []
458 for k in range(len(dates)):
459 i= idep
460 ligne = lignesoms[k]
461 while i<len(ligne) and ligne[i]<donnees[k]:
462 i+=1
463 debug("prolongecourbe : on a trouvé la valeur de i : "+str(i),liste_err)
464 if i>=len(ligne):
465 warning("prolongation de courbe : pas réussi... donnée trop haute !", liste_err)
466 return [],[]
467 if i==idep:
468 warning("prolongation de courbe : pas réussi... donnée trop basse !", liste_err)
469 return [],[]
470 liste_indices.append(i)
471 imin=min(liste_indices) -1
472 imax=max(liste_indices)
473 debug("Les données se situent dans les indices : "+str(imin)+", "+str(imax),liste_err)
474 # Maintenant on doit trouver les coeffs : on se situe en coeff * l[imin]+ (1-coeff)*ligne[imax]
475 # Et faire la moyenne de ces coeffs
476 total = 0
477 for k in range(len(dates)):
478 ligne = lignesoms[k]
479 donnee = donnees[k]
480 total += (donnee - ligne[imax])/(ligne[imin] - ligne[imax])
481 #print(k)
482 coeff_moyen = total/len(dates)
483
484 debug("Coeff moyen calculé : "+str(coeff_moyen), liste_err)
c2fe511b 485
cf0d4c8c 486 # On utilisera la même chose pour les nouvelle donnee
c2fe511b
DL
487
488 # extrapolations
cf0d4c8c
DL
489 nouvdates =oms.extraire_colonne(tableauOMS,0) # On sort tout.
490 #print(nouvdates)
c2fe511b
DL
491 nouvdonnees = []
492 for j in nouvdates:
cf0d4c8c
DL
493 ligne2 = tableauOMS[int(j)]
494 nouvdonnees.append(coeff_moyen*ligne2[imin]+ (1-coeff_moyen)*ligne2[imax])
c2fe511b 495
3d7da80a
DL
496 return nouvdates,nouvdonnees
497
498
499def dessine_guides(t, data, couleur, unite, ax, liste_err):
500 """ dessine deux lignes, horizontales et verticales qui vont "vers" la courbe
501 jusqu'aux points (t, data). En pointillés et avec un point dessus."""
502 debug("Début de dessine_guides"+str(t)+", "+str(data), liste_err)
503 t_conv = u.convertitunite(t,unite,liste_err)
504 ax.vlines(t_conv, 0, data, colors=couleur, linestyles="dashed")
505 ax.hlines(data, 0, t_conv, color=couleur, linestyles="dashed")
506 ax.plot([t_conv], [data], color=couleur, marker="*", ms=13)