diff options
Diffstat (limited to 'trace_courbe.py')
-rw-r--r-- | trace_courbe.py | 135 |
1 files changed, 67 insertions, 68 deletions
diff --git a/trace_courbe.py b/trace_courbe.py index 9cb4845..c3e1691 100644 --- a/trace_courbe.py +++ b/trace_courbe.py | |||
@@ -1,9 +1,10 @@ | |||
1 | #!/usr/bin/env python3 | 1 | #!/usr/bin/env python3 |
2 | # -*- coding: utf-8 -*- | 2 | # -*- coding: utf-8 -*- |
3 | from configuration import CONFIG | 3 | from configuration import CONFIG |
4 | from gestionOMS import * | 4 | import gestionOMS as oms |
5 | from gestion_unites import * | 5 | import gestion_unites as u |
6 | from gestion_donnees import calcule_max_graphique, convertit_jours_vers_python | 6 | from gestion_donnees import calcule_max_graphique, convertit_jours_vers_python |
7 | from gestion_erreurs import debug, erreur, warning | ||
7 | from numpy import arange | 8 | from numpy import arange |
8 | 9 | ||
9 | import matplotlib.pyplot as plt | 10 | import matplotlib.pyplot as plt |
@@ -12,18 +13,22 @@ import matplotlib.pyplot as plt | |||
12 | 13 | ||
13 | 14 | ||
14 | def cree_figure(conf,l_jours,l_poids,typedonnee,liste_err): | 15 | def cree_figure(conf,l_jours,l_poids,typedonnee,liste_err): |
15 | debug("debut de cree_figure",liste_err) | 16 | """ conf est le dictionnaire de config. l_jours et l_poids les listes des temps (en jours) et de données |
17 | (donc pas forcément du poids) | ||
18 | typedonnee est le type de données (voir CONFIG["liste_typedonnees"] | ||
19 | liste_err la liste des erreurs à compléter (voir gestion_erreurs)) | ||
20 | Renvoie la figure tracée""" | ||
21 | debug("debut de cree_figure. Config : "+str(conf),liste_err) | ||
16 | try: | 22 | try: |
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) | 23 | 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) |
18 | except: | 24 | except: |
19 | erreur("bug avec liste data labels",liste_err) | 25 | erreur("bug avec liste data labels",liste_err) |
20 | return "" | 26 | return "" |
21 | 27 | ||
22 | # maxi saisi par l'utilisateur ? | 28 | ######################## Gestion des bornes ############################# |
29 | # y a-t-il un maxi saisi par l'utilisateur ? | ||
23 | if conf["maxi"] ==0: | 30 | if conf["maxi"] ==0: |
24 | # Est-ce qu'on a donné un maxi quand même (car même échelle) ? | 31 | # Est-ce qu'on a donné un maxi quand même (car même échelle) ? |
25 | print(conf) | ||
26 | print(conf["non_sauve"]) | ||
27 | if conf["non_sauve"].get("maxi",0) == 0: | 32 | if conf["non_sauve"].get("maxi",0) == 0: |
28 | jour_maxi = calcule_max_graphique(l_jours) | 33 | jour_maxi = calcule_max_graphique(l_jours) |
29 | else: | 34 | else: |
@@ -31,42 +36,41 @@ def cree_figure(conf,l_jours,l_poids,typedonnee,liste_err): | |||
31 | else: | 36 | else: |
32 | jour_maxi = conf["maxi"]+1 | 37 | jour_maxi = conf["maxi"]+1 |
33 | 38 | ||
34 | |||
35 | # On s'assure que c'est bien compris dans les bornes | 39 | # 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"])) | 40 | 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) | 41 | debug("cree_figure : gestion du jour max : "+str(jour_maxi),liste_err) |
38 | 42 | ||
43 | ##################### Gestion des unités ############################### | ||
39 | # si l'unité n'est pas précisée, ni en "non sauvé" ni par l'utilisateur | 44 | # 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","") == "": | 45 | if conf["unite"] == "" and conf["non_sauve"].get("unite","") == "": |
41 | unite = choix_unite(jour_maxi) | 46 | unite = u.choix_unite(jour_maxi) |
42 | debug("Unité non précisée, on choisit "+unite,liste_err) | 47 | debug("Unité non précisée, on choisit "+unite,liste_err) |
43 | elif conf["unite"] != "": | 48 | elif conf["unite"] != "": |
44 | unite = conf["unite"] | 49 | unite = conf["unite"] |
45 | else: | 50 | else: |
46 | unite = conf["non_sauve"]["unite"] | 51 | unite = conf["non_sauve"]["unite"] |
47 | 52 | ||
48 | #debug("prématurité dans la config : "+conf["prematurite"],liste_err) | 53 | ##################### Gestion de la prématurité #######################" |
49 | prema = int(convertit_jours_vers_python(conf["prematurite"],liste_err)) | 54 | prema = int(convertit_jours_vers_python(conf["prematurite"],liste_err)) |
50 | ## Gestion des prémas, deux cas : | 55 | ## Gestion des prémas, deux cas : |
51 | # Si agecorrige est oui, alors on veut juste soustraire la valeur de préma | 56 | # Si agecorrige est oui, alors on veut juste soustraire la valeur de préma |
52 | # à toutes les données. | 57 | # à toutes les données. |
53 | # Si agecorrige est non, alors on veut ajouter la valeur de préma aux courbes de référence. | 58 | # Si agecorrige est non, alors on veut ajouter la valeur de préma aux courbes de référence. |
54 | 59 | debug("Prématurité : "+str(prema)+" age corrigé : "+conf["agecorrige"],liste_err) | |
55 | debug("Prématurité : "+str(prema)+" age corrigé : "+conf["agecorrige"],liste_err) | ||
56 | |||
57 | if prema>0 and conf["agecorrige"] == "oui": | 60 | if prema>0 and conf["agecorrige"] == "oui": |
58 | l_jours = [j-prema for j in l_jours] | 61 | l_jours = [j-prema for j in l_jours] |
59 | jour_maxi = jour_maxi - prema | 62 | jour_maxi = jour_maxi - prema |
60 | # debug("liste des jours : "+str(l_jours),liste_err) | ||
61 | 63 | ||
62 | l_jours_conv = convertit_tableau(l_jours,unite,liste_err) | 64 | |
65 | ###################### Conversion des unités ###########################"" | ||
66 | l_jours_conv = u.convertit_tableau(l_jours,unite,liste_err) | ||
63 | # Attention, comme les jours commencent à partir de 0, faut enlever 1 pour avoir la borne... | 67 | # 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) | 68 | age_maxi = u.convertitunite(jour_maxi-1,unite,liste_err) |
65 | 69 | ||
66 | debug("cree_figure : conversion des unités ok : "+str(l_jours_conv),liste_err) | 70 | debug("cree_figure : conversion des unités ok : "+str(l_jours_conv),liste_err) |
67 | 71 | ||
72 | #####################" Courbes OMS et titre ######################################" | ||
68 | titre = "Courbe de "+typedonnee+" OMS" | 73 | titre = "Courbe de "+typedonnee+" OMS" |
69 | |||
70 | if conf["typecourbe"] == "P": | 74 | if conf["typecourbe"] == "P": |
71 | # percentiles | 75 | # percentiles |
72 | liste_data_labels = liste_data_labels_p | 76 | liste_data_labels = liste_data_labels_p |
@@ -98,7 +102,6 @@ def cree_figure(conf,l_jours,l_poids,typedonnee,liste_err): | |||
98 | if conf["nom"] !="": | 102 | if conf["nom"] !="": |
99 | titre += " de " +conf["nom"] | 103 | titre += " de " +conf["nom"] |
100 | 104 | ||
101 | |||
102 | if prema>0: | 105 | if prema>0: |
103 | titre+= ", préma de "+conf["prematurite"] | 106 | titre+= ", préma de "+conf["prematurite"] |
104 | if conf["agecorrige"] == "oui": | 107 | if conf["agecorrige"] == "oui": |
@@ -106,30 +109,28 @@ def cree_figure(conf,l_jours,l_poids,typedonnee,liste_err): | |||
106 | else: | 109 | else: |
107 | titre+=" (courbe en âge réel, données OMS décalées)" | 110 | titre+=" (courbe en âge réel, données OMS décalées)" |
108 | 111 | ||
109 | debug("cree_figure : géré le type de courbe ok. Liste des data labels : "+str(liste_data_labels),liste_err) | 112 | #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) | 113 | debug("Fichier d'où extraire les données : "+fichier_oms,liste_err) |
114 | |||
111 | 115 | ||
112 | |||
113 | |||
114 | # convertir les unités | ||
115 | #### Partie code OMS | ||
116 | #### On extrait les données des courbes, et on convertit les jours dans l'unité voulues | 116 | #### On extrait les données des courbes, et on convertit les jours dans l'unité voulues |
117 | try: | 117 | try: |
118 | t = lire_fichier_csv(fichier_oms) | 118 | t = oms.lire_fichier_csv(fichier_oms) |
119 | except: | 119 | except: |
120 | liste_err[0].append("Impossible d'ouvrir le fichier "+fichier_oms) | 120 | erreur("cree_figure : Impossible d'ouvrir le fichier "+fichier_oms, liste_err) |
121 | return "" | 121 | return "" |
122 | 122 | ||
123 | debug("cree_figure : on va convertir données OMS à la bonne unité",liste_err) | 123 | debug("cree_figure : Conversion des données OMS à la bonne unité",liste_err) |
124 | try: | 124 | try: |
125 | coljour= (extraire_colonne(t,0,jour_maxi)) | 125 | coljour= (oms.extraire_colonne(t,0,jour_maxi)) |
126 | if prema>0 and conf["agecorrige"] != "oui": | 126 | if prema>0 and conf["agecorrige"] != "oui": |
127 | coljour = [j + prema for j in coljour] | 127 | coljour = [j + prema for j in coljour] |
128 | coljour = convertit_tableau(coljour,unite,liste_err) | 128 | coljour = u.convertit_tableau(coljour,unite,liste_err) |
129 | except: | 129 | except: |
130 | erreur("Problème à la conversion du tableau OMS. jour_maxi = "+str(jour_maxi)+" unite = "+unite,liste_err) | 130 | erreur("Problème à la conversion du tableau OMS. jour_maxi = "+str(jour_maxi)+" unite = "+unite,liste_err) |
131 | return "" | 131 | return "" |
132 | 132 | ||
133 | ##################### Création de la figure et du graphique ################### | ||
133 | debug("cree_figure : prête à créer la figure",liste_err) | 134 | debug("cree_figure : prête à créer la figure",liste_err) |
134 | #### La figure, params | 135 | #### La figure, params |
135 | 136 | ||
@@ -142,36 +143,13 @@ def cree_figure(conf,l_jours,l_poids,typedonnee,liste_err): | |||
142 | plt.rcParams['legend.edgecolor'] = conf["couleurs"]["grille"] | 143 | plt.rcParams['legend.edgecolor'] = conf["couleurs"]["grille"] |
143 | ax = plt.axes() | 144 | ax = plt.axes() |
144 | 145 | ||
146 | ###################### Tracé des différentes courbes | ||
145 | #Tracé des courbes OMS | 147 | #Tracé des courbes OMS |
146 | for (i,label,couleur) in liste_data_labels: | 148 | for (i,label,couleur) in liste_data_labels: |
147 | ax.plot(coljour,extraire_colonne(t,i,jour_maxi),label=label,color=couleur) | 149 | ax.plot(coljour,oms.extraire_colonne(t,i,jour_maxi),label=label,color=couleur) |
148 | #warning("colonne"+str(i)+str(label)+str(couleur),liste_err) | ||
149 | 150 | ||
150 | debug("cree_figure : tracé des courbes OMS ok",liste_err) | 151 | debug("cree_figure : tracé des courbes OMS ok",liste_err) |
151 | 152 | ||
152 | |||
153 | ##### Tracé des courbes OMS fini | ||
154 | |||
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] | ||
158 | |||
159 | debug("cree_figure : colonnes min et max : "+str(colonne_min)+" "+str(colonne_max),liste_err) | ||
160 | |||
161 | poids_min = min(extraire_colonne(t,colonne_min,jour_maxi)) | ||
162 | poids_max = max(extraire_colonne(t,colonne_max,jour_maxi)) | ||
163 | if l_jours != []: | ||
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) | ||
169 | #max : +5% | ||
170 | poids_max = poids_max * 1.05 | ||
171 | |||
172 | |||
173 | debug("cree_figure : prête à tracer la courbe de l'enfant",liste_err) | ||
174 | |||
175 | ### Tracé pour de bon | 153 | ### Tracé pour de bon |
176 | if l_jours != []: | 154 | if l_jours != []: |
177 | ax.plot(l_jours_conv,l_poids,label=conf["nom"],color=conf["couleurs"]["cadretxt"],marker='o') | 155 | ax.plot(l_jours_conv,l_poids,label=conf["nom"],color=conf["couleurs"]["cadretxt"],marker='o') |
@@ -186,20 +164,44 @@ def cree_figure(conf,l_jours,l_poids,typedonnee,liste_err): | |||
186 | dates_extrapole = list(range(date_fin, jour_maxi)) | 164 | dates_extrapole = list(range(date_fin, jour_maxi)) |
187 | donnees_extrapole = prolongecourbe(t, date_fin, l_poids[-1], dates_extrapole, conf["typecourbe"], liste_err) | 165 | donnees_extrapole = prolongecourbe(t, date_fin, l_poids[-1], dates_extrapole, conf["typecourbe"], liste_err) |
188 | #print("données extrapolées !") | 166 | #print("données extrapolées !") |
189 | dates_extrapole = convertit_tableau(dates_extrapole,unite,liste_err) | 167 | dates_extrapole = u.convertit_tableau(dates_extrapole,unite,liste_err) |
190 | 168 | ||
191 | # tracé des données extrapolées | 169 | # tracé des données extrapolées |
192 | plt.plot(dates_extrapole, donnees_extrapole,color=conf["couleurs"]["cadretxt"], linestyle=(0, (5,7)), marker=None) | 170 | plt.plot(dates_extrapole, donnees_extrapole,color=conf["couleurs"]["cadretxt"], linestyle=(0, (5,7)), marker=None) |
171 | debug("Tracé de la courbe extrapolée ok", liste_err) | ||
193 | 172 | ||
194 | else: | 173 | else: |
195 | debug("On ne trace pas de courbe enfant", liste_err) | 174 | debug("On ne trace pas de courbe enfant", liste_err) |
196 | 175 | ||
197 | debug("Début de la gestion de l'échelle", liste_err) | 176 | ###################" Gestion de l'échelle ##################### |
177 | debug("Courbes tracées. Il n'y a plus qu'à gérer l'échelle", liste_err) | ||
198 | ### échelle à régler | 178 | ### échelle à régler |
179 | |||
180 | # On extrait la valeur min et la valeur max des poids des courbes OMS et des données | ||
181 | (colonne_min,_,_) = liste_data_labels[-1] | ||
182 | (colonne_max,_,_) = liste_data_labels[0] | ||
199 | 183 | ||
184 | # poids max OMS | ||
185 | poids_min = min(oms.extraire_colonne(t,colonne_min,jour_maxi)) | ||
186 | poids_max = max(oms.extraire_colonne(t,colonne_max,jour_maxi)) | ||
187 | if l_jours != []: | ||
188 | poids_min = min(min(l_poids),poids_min) | ||
189 | # Pour le poids max, voir la dernière valeur du tableau | ||
190 | i = 0 | ||
191 | while i<len(l_jours) and l_jours[i]<jour_maxi: | ||
192 | i=i+1 | ||
193 | poids_max = max(max(l_poids[0:i+1]),poids_max) | ||
194 | # On ajuste un peu ces min et max | ||
195 | # min : valeur min -1kg | ||
196 | poids_min = max(0,poids_min-1) | ||
197 | #max : +5% | ||
198 | poids_max = poids_max * 1.05 | ||
199 | |||
200 | |||
201 | # Grille custom ? | ||
200 | if conf["non_sauve"]["grilleamelio"] == "oui": | 202 | if conf["non_sauve"]["grilleamelio"] == "oui": |
201 | 203 | debug("On a choisi la grille plus jolie", liste_err) | |
202 | pas=choix_echelle_data(typedonnee, poids_max) | 204 | pas=u.choix_echelle_data(typedonnee, poids_max) |
203 | # data_min_arrondie | 205 | # data_min_arrondie |
204 | minechelle = int(poids_min/pas[0])*pas[0] | 206 | minechelle = int(poids_min/pas[0])*pas[0] |
205 | 207 | ||
@@ -215,7 +217,7 @@ def cree_figure(conf,l_jours,l_poids,typedonnee,liste_err): | |||
215 | ax.set_yticks(echellemineure, minor=True) | 217 | ax.set_yticks(echellemineure, minor=True) |
216 | 218 | ||
217 | # échelle en temps | 219 | # échelle en temps |
218 | pas=choix_echelle_temps(unite, age_maxi) | 220 | pas=u.choix_echelle_temps(unite, age_maxi) |
219 | debug("pas choisis pour l'échelle en x : "+str(pas), liste_err) | 221 | debug("pas choisis pour l'échelle en x : "+str(pas), liste_err) |
220 | 222 | ||
221 | echellemajeure = arange(0,age_maxi, pas[0]) | 223 | echellemajeure = arange(0,age_maxi, pas[0]) |
@@ -226,8 +228,7 @@ def cree_figure(conf,l_jours,l_poids,typedonnee,liste_err): | |||
226 | ax.set_xticks(echellemajeure, minor=False) | 228 | ax.set_xticks(echellemajeure, minor=False) |
227 | ax.set_xticks(echellemineure, minor=True) | 229 | ax.set_xticks(echellemineure, minor=True) |
228 | 230 | ||
229 | 231 | ################################# Aspect du graphique | |
230 | #### Aspect du graphique | ||
231 | 232 | ||
232 | debug("On commende la déco du graphique", liste_err) | 233 | debug("On commende la déco du graphique", liste_err) |
233 | 234 | ||
@@ -255,13 +256,13 @@ def cree_figure(conf,l_jours,l_poids,typedonnee,liste_err): | |||
255 | 256 | ||
256 | fig.tight_layout() | 257 | fig.tight_layout() |
257 | 258 | ||
258 | debug("Fin de cree_figure", liste_err) | 259 | debug("Fin de cree_figure, tout va bien.", liste_err) |
259 | return fig | 260 | return fig |
260 | 261 | ||
261 | 262 | ||
262 | 263 | ||
263 | 264 | ||
264 | ### Pour extrapoler la courbe | 265 | ######################################## Pour extrapoler la courbe |
265 | 266 | ||
266 | def prolongecourbe(tableauOMS, date, donnee, nouvdates, typecourbe, liste_err): | 267 | 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 | """ tableauOMS est le ableau des données OMS. date et donnee sont la date (jours) |
@@ -286,17 +287,15 @@ def prolongecourbe(tableauOMS, date, donnee, nouvdates, typecourbe, liste_err): | |||
286 | i+=1 | 287 | i+=1 |
287 | debug("prolongecourbe : on a trouvé la valeur de i : "+str(i),liste_err) | 288 | debug("prolongecourbe : on a trouvé la valeur de i : "+str(i),liste_err) |
288 | if i>=len(ligneoms): | 289 | if i>=len(ligneoms): |
289 | warning("prolongation de courbe : pas réussi... donnée au dessus !", liste_err) | 290 | warning("prolongation de courbe : pas réussi... donnée trop haute !", liste_err) |
290 | return [] | 291 | return [] |
291 | if i==idep: | 292 | if i==idep: |
292 | warning("prolongation de courbe : pas réussi... donnée en dessous !", liste_err) | 293 | warning("prolongation de courbe : pas réussi... donnée trop basse !", liste_err) |
293 | return [] | 294 | return [] |
294 | 295 | ||
295 | # Le coeff : donnee = coeff * l[i-1]+ (1-coeff)*ligne[i] | 296 | # Le coeff : donnee = coeff * l[i-1]+ (1-coeff)*ligne[i] |
296 | # On utilisera la même chose pour la nouvelle donnee | 297 | # 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]) | 298 | coeff = (donnee - ligneoms[i])/(ligneoms[i-1] - ligneoms[i]) |
299 | #print("coeff : "+str(coeff)) | ||
300 | 299 | ||
301 | # extrapolations | 300 | # extrapolations |
302 | nouvdonnees = [] | 301 | nouvdonnees = [] |