2 # -*- coding: utf-8 -*-
3 from configuration
import CONFIG
4 from gestionOMS
import *
5 from gestion_unites
import *
6 from gestion_donnees
import calcule_max_graphique
, convertit_jours_vers_python
7 from numpy
import arange
9 import matplotlib
.pyplot
as plt
11 # Essentiellement, la fonction qui trace la courbe
14 def cree_figure(conf
,l_jours
,l_poids
,typedonnee
,liste_err
):
15 debug("debut de cree_figure",liste_err
)
17 liste_data_labels_p
,liste_data_labels_z
= renvoie_liste_labels(conf
,CONFIG
["liste_data_choisie_p"],CONFIG
["liste_data_choisie_z"],liste_err
)
19 erreur("bug avec liste data labels",liste_err
)
22 # maxi saisi par l'utilisateur ?
24 # Est-ce qu'on a donné un maxi quand même (car même échelle) ?
26 print(conf
["non_sauve"])
27 if conf
["non_sauve"].get("maxi",0) == 0:
28 jour_maxi
= calcule_max_graphique(l_jours
)
30 jour_maxi
= conf
["non_sauve"]["maxi"]+1
32 jour_maxi
= conf
["maxi"]+1
35 # On s'assure que c'est bien compris dans les bornes
36 jour_maxi
= max(CONFIG
["jours_mini_courbe"],min(jour_maxi
,CONFIG
["jours_maxi_courbe"]))
37 debug("cree_figure : gestion du jour max ok : "+str(jour_maxi
),liste_err
)
39 # si l'unité n'est pas précisée, ni en "non sauvé" ni par l'utilisateur
40 if conf
["unite"] == "" and conf
["non_sauve"].get("unite","") == "":
41 unite
= choix_unite(jour_maxi
)
42 debug("Unité non précisée, on choisit "+unite
,liste_err
)
43 elif conf
["unite"] != "":
46 unite
= conf
["non_sauve"]["unite"]
48 #debug("prématurité dans la config : "+conf["prematurite"],liste_err)
49 prema
= int(convertit_jours_vers_python(conf
["prematurite"],liste_err
))
50 ## Gestion des prémas, deux cas :
51 # Si agecorrige est oui, alors on veut juste soustraire la valeur de préma
52 # à toutes les données.
53 # Si agecorrige est non, alors on veut ajouter la valeur de préma aux courbes de référence.
55 debug("Prématurité : "+str(prema
)+" age corrigé : "+conf
["agecorrige"],liste_err
)
57 if prema
>0 and conf
["agecorrige"] == "oui":
58 l_jours
= [j
-prema
for j
in l_jours
]
59 jour_maxi
= jour_maxi
- prema
60 # debug("liste des jours : "+str(l_jours),liste_err)
62 l_jours_conv
= convertit_tableau(l_jours
,unite
,liste_err
)
63 # Attention, comme les jours commencent à partir de 0, faut enlever 1 pour avoir la borne...
64 age_maxi
= convertitunite(jour_maxi
-1,unite
,liste_err
)
66 debug("cree_figure : conversion des unités ok : "+str(l_jours_conv
),liste_err
)
68 titre
= "Courbe de "+typedonnee
+" OMS"
70 if conf
["typecourbe"] == "P":
72 liste_data_labels
= liste_data_labels_p
73 if conf
["sexe"] == "M":
74 fichier_oms
= CONFIG
["fichiersOMS"][typedonnee
]["perc_garcon"]#f_poids_perc_garcon
75 titre
+= " (percentiles, garçon)"
76 elif conf
["sexe"] == "F":
77 fichier_oms
= CONFIG
["fichiersOMS"][typedonnee
]["perc_fille"]
78 titre
+= " (percentiles, fille)"
80 fichier_oms
= CONFIG
["fichiersOMS"][typedonnee
]["perc_mixte"]
81 titre
+= " (percentiles)"
82 elif conf
["typecourbe"] == "Z":
83 liste_data_labels
= liste_data_labels_z
84 if conf
["sexe"] == "M":
85 fichier_oms
= CONFIG
["fichiersOMS"][typedonnee
]["z_garcon"]
86 titre
+= " (moyenne et écarts-types, garçon)"
87 elif conf
["sexe"] == "F":
88 fichier_oms
= CONFIG
["fichiersOMS"][typedonnee
]["z_fille"]
89 titre
+= " (moyenne et écarts-types, fille)"
91 fichier_oms
= CONFIG
["fichiersOMS"][typedonnee
]["z_mixte"]
92 titre
+= " (moyenne et écarts-types)"
94 erreur("Type de courbe invalide"+conf
["typecourbe"],liste_err
)
97 # Si y'a un nom on met "courbe de machin"
99 titre
+= " de " +conf
["nom"]
103 titre
+= ", préma de "+conf
["prematurite"]
104 if conf
["agecorrige"] == "oui":
105 titre
+=" (courbe en âge corrigé)"
107 titre
+=" (courbe en âge réel, données OMS décalées)"
109 debug("cree_figure : géré le type de courbe ok. Liste des data labels : "+str(liste_data_labels
),liste_err
)
110 debug("Fichier d'où extraire les données : "+fichier_oms
,liste_err
)
114 # convertir les unités
116 #### On extrait les données des courbes, et on convertit les jours dans l'unité voulues
118 t
= lire_fichier_csv(fichier_oms
)
120 liste_err
[0].append("Impossible d'ouvrir le fichier "+fichier_oms
)
123 debug("cree_figure : on va convertir données OMS à la bonne unité",liste_err
)
125 coljour
= (extraire_colonne(t
,0,jour_maxi
))
126 if prema
>0 and conf
["agecorrige"] != "oui":
127 coljour
= [j
+ prema
for j
in coljour
]
128 coljour
= convertit_tableau(coljour
,unite
,liste_err
)
130 erreur("Problème à la conversion du tableau OMS. jour_maxi = "+str(jour_maxi
)+" unite = "+unite
,liste_err
)
133 debug("cree_figure : prête à créer la figure",liste_err
)
134 #### La figure, params
136 fig
= plt
.figure(num
=None, figsize
=(conf
["largeur"], conf
["hauteur"]), dpi
=100, facecolor
=conf
["couleurs"]["fond"])
137 plt
.rcParams
['axes.facecolor'] = conf
["couleurs"]["fond"]
138 plt
.rcParams
['axes.edgecolor']= conf
["couleurs"]["cadretxt"]
139 plt
.rcParams
['xtick.color'] = conf
["couleurs"]["cadretxt"]
140 plt
.rcParams
['ytick.color'] = conf
["couleurs"]["cadretxt"]
141 plt
.rcParams
['grid.color'] = conf
["couleurs"]["grille"]
142 plt
.rcParams
['legend.edgecolor'] = conf
["couleurs"]["grille"]
145 #Tracé des courbes OMS
146 for (i
,label
,couleur
) in liste_data_labels
:
147 ax
.plot(coljour
,extraire_colonne(t
,i
,jour_maxi
),label
=label
,color
=couleur
)
148 #warning("colonne"+str(i)+str(label)+str(couleur),liste_err)
150 debug("cree_figure : tracé des courbes OMS ok",liste_err
)
153 ##### Tracé des courbes OMS fini
155 # On extrait la valeur min et la valeur max des poids
156 (colonne_min
,_
,_
) = liste_data_labels
[-1]
157 (colonne_max
,_
,_
) = liste_data_labels
[0]
159 debug("cree_figure : colonnes min et max : "+str(colonne_min
)+" "+str(colonne_max
),liste_err
)
161 poids_min
= min(extraire_colonne(t
,colonne_min
,jour_maxi
))
162 poids_max
= max(extraire_colonne(t
,colonne_max
,jour_maxi
))
164 poids_min
= min(min(l_poids
),poids_min
)
165 poids_max
= max(max(l_poids
),poids_max
)
166 # On ajuste un peu ces min et max
167 # min : valeur min -1kg
168 poids_min
= max(0,poids_min
-1)
170 poids_max
= poids_max
* 1.05
173 debug("cree_figure : prête à tracer la courbe de l'enfant",liste_err
)
175 ### Tracé pour de bon
177 ax
.plot(l_jours_conv
,l_poids
,label
=conf
["nom"],color
=conf
["couleurs"]["cadretxt"],marker
='o')
178 debug("Tracé de la courbe enfant, avec les jours "+str(l_jours_conv
),liste_err
)
180 #### extrapolatios éventuelles
181 #print("prolongercourbes" in conf)
182 if conf
["prolongercourbes"] == "oui":
184 # les dates, on prend tous les jours tant qu'à faire
185 date_fin
= int(l_jours
[-1])
186 dates_extrapole
= list(range(date_fin
, jour_maxi
))
187 donnees_extrapole
= prolongecourbe(t
, date_fin
, l_poids
[-1], dates_extrapole
, conf
["typecourbe"], liste_err
)
188 #print("données extrapolées !")
189 dates_extrapole
= convertit_tableau(dates_extrapole
,unite
,liste_err
)
191 # tracé des données extrapolées
192 plt
.plot(dates_extrapole
, donnees_extrapole
,color
=conf
["couleurs"]["cadretxt"], linestyle
=(0, (5,7)), marker
=None)
195 debug("On ne trace pas de courbe enfant", liste_err
)
197 debug("Début de la gestion de l'échelle", liste_err
)
200 if conf
["non_sauve"]["grilleamelio"] == "oui":
202 pas
=choix_echelle_data(typedonnee
, poids_max
)
204 minechelle
= int(poids_min
/pas
[0])*pas
[0]
206 debug("pas choisis pour l'échelle en y : "+str(pas
), liste_err
)
207 echellemajeure
= arange(minechelle
, poids_max
, pas
[0])
210 echellemineure
= arange(minechelle
, poids_max
, pas
[1])
214 ax
.set_yticks(echellemajeure
, minor
=False)
215 ax
.set_yticks(echellemineure
, minor
=True)
218 pas
=choix_echelle_temps(unite
, age_maxi
)
219 debug("pas choisis pour l'échelle en x : "+str(pas
), liste_err
)
221 echellemajeure
= arange(0,age_maxi
, pas
[0])
223 echellemineure
= arange(0,age_maxi
, pas
[1])
226 ax
.set_xticks(echellemajeure
, minor
=False)
227 ax
.set_xticks(echellemineure
, minor
=True)
230 #### Aspect du graphique
232 debug("On commende la déco du graphique", liste_err
)
235 ax
.grid(conf
["grille"]=="oui")
236 ax
.grid(conf
["grille"] == "oui", which
="minor", linestyle
="--")
239 plt
.xlabel("Âge en "+unite
,color
=conf
["couleurs"]["cadretxt"])
240 plt
.ylabel(typedonnee
.capitalize()+" en "+CONFIG
["unites_typedonnees"][typedonnee
],color
=conf
["couleurs"]["cadretxt"])
242 plt
.title(titre
,color
=conf
["couleurs"]["cadretxt"])
244 if l_jours_conv
== []:
245 plt
.axis([0,age_maxi
, poids_min
, poids_max
])
247 plt
.axis([min(0,l_jours_conv
[0]),age_maxi
,poids_min
,poids_max
])
251 if conf
['legende']=="oui":
252 legende
= plt
.legend(loc
=conf
['positionlegende'])
253 plt
.setp(legende
.get_texts(), color
=conf
["couleurs"]["cadretxt"])
258 debug("Fin de cree_figure", liste_err
)
264 ### Pour extrapoler la courbe
266 def prolongecourbe(tableauOMS
, date
, donnee
, nouvdates
, typecourbe
, liste_err
):
267 """ tableauOMS est le ableau des données OMS. date et donnee sont la date (jours)
268 et la dernière donnée d'où on extrapole. On veut les extrapolations à nouvdate
270 typecourbe est P ou Z. Pour P il faut commencer à regarder à l'indice 4, pour Z
272 On renvoie [] si pas pu extrapoler. """
275 ligneoms
= tableauOMS
[date
]
276 debug("prolongecourbe : Ligne OMS :"+str(ligneoms
)+" valeur de donnée : "+str(donnee
), liste_err
)
279 # On cherche dans quel intervalle on se situe
280 if typecourbe
== "P":
285 while i
<len(ligneoms
) and ligneoms
[i
]<donnee
:
287 debug("prolongecourbe : on a trouvé la valeur de i : "+str(i
),liste_err
)
289 warning("prolongation de courbe : pas réussi... donnée au dessus !", liste_err
)
292 warning("prolongation de courbe : pas réussi... donnée en dessous !", liste_err
)
295 # Le coeff : donnee = coeff * l[i-1]+ (1-coeff)*ligne[i]
296 # On utilisera la même chose pour la nouvelle donnee
297 #print(ligneoms[i], ligneoms[i-1])
298 coeff
= (donnee
- ligneoms
[i
])/(ligneoms
[i
-1] - ligneoms
[i
])
299 #print("coeff : "+str(coeff))
304 ligne2
= tableauOMS
[j
]
305 nouvdonnees
.append(coeff
*ligne2
[i
-1]+ (1-coeff
)*ligne2
[i
])