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
8 import matplotlib
.pyplot
as plt
10 # Essentiellement, la fonction qui trace la courbe
13 def cree_figure(conf
,l_jours
,l_poids
,typedonnee
,liste_err
):
14 debug("debut de cree_figure",liste_err
)
16 liste_data_labels_p
,liste_data_labels_z
= renvoie_liste_labels(conf
,CONFIG
["liste_data_choisie_p"],CONFIG
["liste_data_choisie_z"],liste_err
)
18 erreur("bug avec liste data labels",liste_err
)
21 # maxi saisi par l'utilisateur ?
23 # Est-ce qu'on a donné un maxi quand même (car même échelle) ?
25 print(conf
["non_sauve"])
26 if conf
["non_sauve"].get("maxi",0) == 0:
27 jour_maxi
= calcule_max_graphique(l_jours
)
29 jour_maxi
= conf
["non_sauve"]["maxi"]+1
31 jour_maxi
= conf
["maxi"]+1
34 # On s'assure que c'est bien compris dans les bornes
35 jour_maxi
= max(CONFIG
["jours_mini_courbe"],min(jour_maxi
,CONFIG
["jours_maxi_courbe"]))
36 debug("cree_figure : gestion du jour max ok : "+str(jour_maxi
),liste_err
)
38 # si l'unité n'est pas précisée, ni en "non sauvé" ni par l'utilisateur
39 if conf
["unite"] == "" and conf
["non_sauve"].get("unite","") == "":
40 unite
= choix_unite(jour_maxi
)
41 debug("Unité non précisée, on choisit "+unite
,liste_err
)
42 elif conf
["unite"] != "":
45 unite
= conf
["non_sauve"]["unite"]
47 #debug("prématurité dans la config : "+conf["prematurite"],liste_err)
48 prema
= int(convertit_jours_vers_python(conf
["prematurite"],liste_err
))
49 ## Gestion des prémas, deux cas :
50 # Si agecorrige est oui, alors on veut juste soustraire la valeur de préma
51 # à toutes les données.
52 # Si agecorrige est non, alors on veut ajouter la valeur de préma aux courbes de référence.
54 debug("Prématurité : "+str(prema
)+" age corrigé : "+conf
["agecorrige"],liste_err
)
56 if prema
>0 and conf
["agecorrige"] == "oui":
57 l_jours
= [j
-prema
for j
in l_jours
]
58 jour_maxi
= jour_maxi
- prema
59 # debug("liste des jours : "+str(l_jours),liste_err)
61 l_jours_conv
= convertit_tableau(l_jours
,unite
,liste_err
)
62 # Attention, comme les jours commencent à partir de 0, faut enlever 1 pour avoir la borne...
63 age_maxi
= convertitunite(jour_maxi
-1,unite
,liste_err
)
65 debug("cree_figure : conversion des unités ok : "+str(l_jours_conv
),liste_err
)
67 titre
= "Courbe de "+typedonnee
+" OMS"
69 if conf
["typecourbe"] == "P":
71 liste_data_labels
= liste_data_labels_p
72 if conf
["sexe"] == "M":
73 fichier_oms
= CONFIG
["fichiersOMS"][typedonnee
]["perc_garcon"]#f_poids_perc_garcon
74 titre
+= " (percentiles, garçon)"
75 elif conf
["sexe"] == "F":
76 fichier_oms
= CONFIG
["fichiersOMS"][typedonnee
]["perc_fille"]
77 titre
+= " (percentiles, fille)"
79 fichier_oms
= CONFIG
["fichiersOMS"][typedonnee
]["perc_mixte"]
80 titre
+= " (percentiles)"
81 elif conf
["typecourbe"] == "Z":
82 liste_data_labels
= liste_data_labels_z
83 if conf
["sexe"] == "M":
84 fichier_oms
= CONFIG
["fichiersOMS"][typedonnee
]["z_garcon"]
85 titre
+= " (moyenne et écarts-types, garçon)"
86 elif conf
["sexe"] == "F":
87 fichier_oms
= CONFIG
["fichiersOMS"][typedonnee
]["z_fille"]
88 titre
+= " (moyenne et écarts-types, fille)"
90 fichier_oms
= CONFIG
["fichiersOMS"][typedonnee
]["z_mixte"]
91 titre
+= " (moyenne et écarts-types)"
93 erreur("Type de courbe invalide"+conf
["typecourbe"],liste_err
)
96 # Si y'a un nom on met "courbe de machin"
98 titre
+= " de " +conf
["nom"]
102 titre
+= ", préma de "+conf
["prematurite"]
103 if conf
["agecorrige"] == "oui":
104 titre
+=" (courbe en âge corrigé)"
106 titre
+=" (courbe en âge réel, données OMS décalées)"
108 debug("cree_figure : géré le type de courbe ok. Liste des data labels : "+str(liste_data_labels
),liste_err
)
109 debug("Fichier d'où extraire les données : "+fichier_oms
,liste_err
)
113 # convertir les unités
115 #### On extrait les données des courbes, et on convertit les jours dans l'unité voulues
117 t
= lire_fichier_csv(fichier_oms
)
119 liste_err
[0].append("Impossible d'ouvrir le fichier "+fichier_oms
)
122 debug("cree_figure : on va convertir données OMS à la bonne unité",liste_err
)
124 coljour
= (extraire_colonne(t
,0,jour_maxi
))
125 if prema
>0 and conf
["agecorrige"] != "oui":
126 coljour
= [j
+ prema
for j
in coljour
]
127 coljour
= convertit_tableau(coljour
,unite
,liste_err
)
129 erreur("Problème à la conversion du tableau OMS. jour_maxi = "+str(jour_maxi
)+" unite = "+unite
,liste_err
)
132 debug("cree_figure : prête à créer la figure",liste_err
)
133 #### La figure, params
135 fig
= plt
.figure(num
=None, figsize
=(conf
["largeur"], conf
["hauteur"]), dpi
=100, facecolor
=conf
["couleurs"]["fond"])
136 plt
.rcParams
['axes.facecolor'] = conf
["couleurs"]["fond"]
137 plt
.rcParams
['axes.edgecolor']= conf
["couleurs"]["cadretxt"]
138 plt
.rcParams
['xtick.color'] = conf
["couleurs"]["cadretxt"]
139 plt
.rcParams
['ytick.color'] = conf
["couleurs"]["cadretxt"]
140 plt
.rcParams
['grid.color'] = conf
["couleurs"]["grille"]
141 plt
.rcParams
['legend.edgecolor'] = conf
["couleurs"]["grille"]
143 #Tracé des courbes OMS
144 for (i
,label
,couleur
) in liste_data_labels
:
145 plt
.plot(coljour
,extraire_colonne(t
,i
,jour_maxi
),label
=label
,color
=couleur
)
146 #warning("colonne"+str(i)+str(label)+str(couleur),liste_err)
148 debug("cree_figure : tracé des courbes OMS ok",liste_err
)
151 ##### Tracé des courbes OMS fini
153 # On extrait la valeur min et la valeur max des poids
154 (colonne_min
,_
,_
) = liste_data_labels
[-1]
155 (colonne_max
,_
,_
) = liste_data_labels
[0]
157 debug("cree_figure : colonnes min et max : "+str(colonne_min
)+" "+str(colonne_max
),liste_err
)
159 poids_min
= min(extraire_colonne(t
,colonne_min
,jour_maxi
))
160 poids_max
= max(extraire_colonne(t
,colonne_max
,jour_maxi
))
162 poids_min
= min(min(l_poids
),poids_min
)
163 poids_max
= max(max(l_poids
),poids_max
)
164 # On ajuste un peu ces min et max
165 # min : valeur min -1kg
166 poids_min
= max(0,poids_min
-1)
168 poids_max
= poids_max
* 1.05
171 debug("cree_figure : prête à tracer la courbe de l'enfant",liste_err
)
173 ### Tracé pour de bon
175 plt
.plot(l_jours_conv
,l_poids
,label
=conf
["nom"],color
=conf
["couleurs"]["cadretxt"],marker
='o')
176 debug("Tracé de la courbe enfant, avec les jours "+str(l_jours_conv
),liste_err
)
178 #### extrapolatios éventuelles
179 #print("prolongercourbes" in conf)
180 if conf
["prolongercourbes"] == "oui":
182 # les dates, on prend tous les jours tant qu'à faire
183 date_fin
= int(l_jours
[-1])
184 dates_extrapole
= list(range(date_fin
, jour_maxi
))
185 donnees_extrapole
= prolongecourbe(t
, date_fin
, l_poids
[-1], dates_extrapole
, conf
["typecourbe"], liste_err
)
186 #print("données extrapolées !")
187 dates_extrapole
= convertit_tableau(dates_extrapole
,unite
,liste_err
)
189 # tracé des données extrapolées
190 plt
.plot(dates_extrapole
, donnees_extrapole
,color
=conf
["couleurs"]["cadretxt"], linestyle
=(0, (5,7)), marker
=None)
193 debug("On ne trace pas de courbe enfant", liste_err
)
195 plt
.xlabel("Âge en "+unite
,color
=conf
["couleurs"]["cadretxt"])
196 plt
.ylabel(typedonnee
.capitalize()+" en "+CONFIG
["unites_typedonnees"][typedonnee
],color
=conf
["couleurs"]["cadretxt"])
198 plt
.title(titre
,color
=conf
["couleurs"]["cadretxt"])
200 if l_jours_conv
== []:
201 plt
.axis([0,age_maxi
, poids_min
, poids_max
])
203 plt
.axis([min(0,l_jours_conv
[0]),age_maxi
,poids_min
,poids_max
])
207 if conf
['legende']=="oui":
208 legende
= plt
.legend(loc
=conf
['positionlegende'])
209 plt
.setp(legende
.get_texts(), color
=conf
["couleurs"]["cadretxt"])
210 plt
.grid(conf
["grille"]=="oui")
214 debug("Fin de cree_figure", liste_err
)
219 def prolongecourbe(tableauOMS
, date
, donnee
, nouvdates
, typecourbe
, liste_err
):
220 """ tableauOMS est le ableau des données OMS. date et donnee sont la date (jours)
221 et la dernière donnée d'où on extrapole. On veut les extrapolations à nouvdate
223 typecourbe est P ou Z. Pour P il faut commencer à regarder à l'indice 4, pour Z
225 On renvoie [] si pas pu extrapoler. """
228 ligneoms
= tableauOMS
[date
]
229 debug("prolongecourbe : Ligne OMS :"+str(ligneoms
)+" valeur de donnée : "+str(donnee
), liste_err
)
232 # On cherche dans quel intervalle on se situe
233 if typecourbe
== "P":
238 while i
<len(ligneoms
) and ligneoms
[i
]<donnee
:
240 debug("prolongecourbe : on a trouvé la valeur de i : "+str(i
),liste_err
)
242 warning("prolongation de courbe : pas réussi... donnée au dessus !", liste_err
)
245 warning("prolongation de courbe : pas réussi... donnée en dessous !", liste_err
)
248 # Le coeff : donnee = coeff * l[i-1]+ (1-coeff)*ligne[i]
249 # On utilisera la même chose pour la nouvelle donnee
250 #print(ligneoms[i], ligneoms[i-1])
251 coeff
= (donnee
- ligneoms
[i
])/(ligneoms
[i
-1] - ligneoms
[i
])
252 #print("coeff : "+str(coeff))
257 ligne2
= tableauOMS
[j
]
258 nouvdonnees
.append(coeff
*ligne2
[i
-1]+ (1-coeff
)*ligne2
[i
])