diff options
author | Denise sur Lya <sekhmet@lya> | 2021-02-15 16:54:33 +0100 |
---|---|---|
committer | Denise sur Lya <sekhmet@lya> | 2021-02-15 16:54:33 +0100 |
commit | 685a5f75f63d483d09a593ec69efad882a63a34e (patch) | |
tree | 8d8b4ee683d3abbf0496d3807bef087d313e3a39 | |
parent | c2fe511bb9e6974cc267b8926a47b1fa81b37da3 (diff) | |
download | oms-685a5f75f63d483d09a593ec69efad882a63a34e.tar.gz oms-685a5f75f63d483d09a593ec69efad882a63a34e.tar.zst oms-685a5f75f63d483d09a593ec69efad882a63a34e.zip |
amélioration de la grille, bêta
-rw-r--r-- | data/changelog_data.txt | 2 | ||||
-rw-r--r-- | gestion_donnees.py | 7 | ||||
-rw-r--r-- | gestion_unites.py | 61 | ||||
-rw-r--r-- | templates/index.html | 1 | ||||
-rw-r--r-- | trace_courbe.py | 55 |
5 files changed, 117 insertions, 9 deletions
diff --git a/data/changelog_data.txt b/data/changelog_data.txt index 09a6da4..f59e7b7 100644 --- a/data/changelog_data.txt +++ b/data/changelog_data.txt | |||
@@ -1,3 +1,5 @@ | |||
1 | "Version 2.26","15/02/2021","<p>Nouveauté en bêta-test : grille améliorée. Pour le moment on peut cocher pour avoir cette fonctionnalité.</p>" | ||
2 | |||
1 | "Version 2.25","12/02/2021","<p>Nouveauté : possibilité de ""prolonger"" la courbe de poids/taille en pointillés. L'extrapolation est faite à partir de la dernière donnée. À tester encore !</p>" | 3 | "Version 2.25","12/02/2021","<p>Nouveauté : possibilité de ""prolonger"" la courbe de poids/taille en pointillés. L'extrapolation est faite à partir de la dernière donnée. À tester encore !</p>" |
2 | 4 | ||
3 | "Version 2.2001","13/11/2020","<p>Amélioration de l'affichage pour les prémas (masqués par défaut). Précision dans le texte + FAQ.</p>" | 5 | "Version 2.2001","13/11/2020","<p>Amélioration de l'affichage pour les prémas (masqués par défaut). Précision dans le texte + FAQ.</p>" |
diff --git a/gestion_donnees.py b/gestion_donnees.py index c378b5e..208be4a 100644 --- a/gestion_donnees.py +++ b/gestion_donnees.py | |||
@@ -193,7 +193,7 @@ def gere_configuration(data,liste_err): | |||
193 | """ prend en argument le dictionnaire de requête (configuration imparfaite), et | 193 | """ prend en argument le dictionnaire de requête (configuration imparfaite), et |
194 | construit le dictionnaire de configuration qui va bien. | 194 | construit le dictionnaire de configuration qui va bien. |
195 | Vérifie que chaque entrée est cohérente évidemment.""" | 195 | Vérifie que chaque entrée est cohérente évidemment.""" |
196 | configuration = {} | 196 | configuration = {"non_sauve": {}} |
197 | 197 | ||
198 | # Pour le nom, osef qu'il soit vide | 198 | # Pour le nom, osef qu'il soit vide |
199 | nom = data.get("nom","") | 199 | nom = data.get("nom","") |
@@ -292,15 +292,14 @@ def gere_configuration(data,liste_err): | |||
292 | 292 | ||
293 | configuration["prolongercourbes"] = gere_checkbox(data.get("prolongercourbes","")) | 293 | configuration["prolongercourbes"] = gere_checkbox(data.get("prolongercourbes","")) |
294 | 294 | ||
295 | configuration["non_sauve"]["grilleamelio"] = gere_checkbox(data.get("grilleamelio","")) | ||
295 | 296 | ||
296 | configuration["couleurs"] = {} | 297 | configuration["couleurs"] = {} |
297 | # gérer les couleurs | 298 | # gérer les couleurs |
298 | for clecouleur in DEFAUT["couleurs"]: | 299 | for clecouleur in DEFAUT["couleurs"]: |
299 | coul = rgb_vers_tuple(data.get("couleur_"+clecouleur,""),CONFIG["couleurs"][clecouleur],liste_err) | 300 | coul = rgb_vers_tuple(data.get("couleur_"+clecouleur,""),CONFIG["couleurs"][clecouleur],liste_err) |
300 | configuration["couleurs"][clecouleur] = coul | 301 | configuration["couleurs"][clecouleur] = coul |
301 | 302 | ||
302 | # On y ajoute la partie "non sauvée" qui servira peut-être plus tard | ||
303 | configuration["non_sauve"] = {} | ||
304 | 303 | ||
305 | return configuration | 304 | return configuration |
306 | 305 | ||
diff --git a/gestion_unites.py b/gestion_unites.py index 8fcb1ad..b97d90b 100644 --- a/gestion_unites.py +++ b/gestion_unites.py | |||
@@ -7,7 +7,7 @@ from gestion_erreurs import * | |||
7 | ##################### outils pour affichage et choix de l'unité | 7 | ##################### outils pour affichage et choix de l'unité |
8 | 8 | ||
9 | def choix_unite(maxi): | 9 | def choix_unite(maxi): |
10 | """ en fonction de l'âge maxi, on choisit une unité pertinente : jours, mois, année""" | 10 | """ en fonction de l'âge maxi, on choisit une unité pertinente : jours, semaine, mois, année""" |
11 | if maxi<40: | 11 | if maxi<40: |
12 | return "jours" | 12 | return "jours" |
13 | elif maxi <100: | 13 | elif maxi <100: |
@@ -17,6 +17,65 @@ def choix_unite(maxi): | |||
17 | else: | 17 | else: |
18 | return "années" | 18 | return "années" |
19 | 19 | ||
20 | def choix_echelle_data(typedonnees, donneemax): | ||
21 | """ en fonction du type de données et du maxi (on suppose qu'on part à 0), | ||
22 | on choisit un intervalle raisonnable | ||
23 | On renvoie le couple des pas (majeur, mineur) | ||
24 | (0,0) en cas de problème avec le typedonnnes """ | ||
25 | |||
26 | if typedonnees not in CONFIG["liste_typedonnees"]: | ||
27 | print("Type de données non valide : "+typedonnees) | ||
28 | return (0,0) | ||
29 | |||
30 | if typedonnees == "poids": | ||
31 | if donneemax>15: | ||
32 | return (5,1) | ||
33 | elif donneemax > 10: | ||
34 | return (2,1) | ||
35 | else: | ||
36 | return (1,0.2) | ||
37 | if typedonnees == "taille": | ||
38 | if donneemax>100: | ||
39 | return (10,2) | ||
40 | else: | ||
41 | return (5,1) | ||
42 | |||
43 | def choix_echelle_temps(unite, tempsmaxi): | ||
44 | """ en fonction de l'unité voulue et du temps maximal (donné dans l'unité), | ||
45 | on choisit un intervalle raisonnable entre les pas. | ||
46 | On renvoie le couple des pas (majeur, mineur). | ||
47 | (0,0) en cas de problème avec l'unité | ||
48 | On met 0 en 2e arg si pas de grille secondaire""" | ||
49 | if unite not in CONFIG["liste_unites"]: | ||
50 | print("Unité non valide ! "+unite) | ||
51 | return (0,0) | ||
52 | |||
53 | if unite=="jours": | ||
54 | if tempsmaxi > 60: # pourquoi mettre en jours ? | ||
55 | return (30,1) | ||
56 | elif tempsmaxi >20: | ||
57 | return (7,1) | ||
58 | else: | ||
59 | return (1,0) | ||
60 | if unite=="semaines": | ||
61 | if tempsmaxi >50: | ||
62 | return (5,1) | ||
63 | elif tempsmaxi > 15: | ||
64 | return (2,1) | ||
65 | else: | ||
66 | return (1,1/7) # On met en jours | ||
67 | |||
68 | if unite=="mois": | ||
69 | if tempsmaxi > 30: | ||
70 | return (2,1) | ||
71 | elif tempsmaxi > 10: | ||
72 | return (1,0) | ||
73 | else: | ||
74 | return (1,0.25) # on met en semaines | ||
75 | |||
76 | if unite=="années": | ||
77 | return (1,1/12) # années / mois | ||
78 | |||
20 | def convertitunite(jours,unite,liste_err): | 79 | def convertitunite(jours,unite,liste_err): |
21 | """ convertit des jours à l'unité voulue | 80 | """ convertit des jours à l'unité voulue |
22 | renvoie des float""" | 81 | renvoie des float""" |
diff --git a/templates/index.html b/templates/index.html index 959c6a1..e5d4d24 100644 --- a/templates/index.html +++ b/templates/index.html | |||
@@ -96,6 +96,7 @@ | |||
96 | <li>Prolonger les courbes (expérimental) : <input type="checkbox" name="prolongercourbes" {% if valform.prolongercourbes == "oui" %} checked{% endif%}></li> | 96 | <li>Prolonger les courbes (expérimental) : <input type="checkbox" name="prolongercourbes" {% if valform.prolongercourbes == "oui" %} checked{% endif%}></li> |
97 | 97 | ||
98 | <li><label>Même échelle sur tous les graphiques : </label><input type="checkbox" name="memechelle" {% if valform.memechelle == 'oui' %} checked{% endif %}></li> | 98 | <li><label>Même échelle sur tous les graphiques : </label><input type="checkbox" name="memechelle" {% if valform.memechelle == 'oui' %} checked{% endif %}></li> |
99 | <li><label>Grille améliorée (bêta) :</label><input type="checkbox" name="grilleamelio"></li> | ||
99 | <li>Dimensions du graphique : <label>largeur : </label><input type="text" name="largeur" value="{{ valform.largeur }}"> | 100 | <li>Dimensions du graphique : <label>largeur : </label><input type="text" name="largeur" value="{{ valform.largeur }}"> |
100 | <label>hauteur : </label><input type="text" name="hauteur" value="{{ valform.hauteur }}"></li> | 101 | <label>hauteur : </label><input type="text" name="hauteur" value="{{ valform.hauteur }}"></li> |
101 | <li><label>Légende : <input type="checkbox" name="legende" {% if valform.legende == 'oui' %} checked{% endif %}> </label> | 102 | <li><label>Légende : <input type="checkbox" name="legende" {% if valform.legende == 'oui' %} checked{% endif %}> </label> |
diff --git a/trace_courbe.py b/trace_courbe.py index fab6471..9cb4845 100644 --- a/trace_courbe.py +++ b/trace_courbe.py | |||
@@ -4,6 +4,7 @@ from configuration import CONFIG | |||
4 | from gestionOMS import * | 4 | from gestionOMS import * |
5 | from gestion_unites import * | 5 | from gestion_unites import * |
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 numpy import arange | ||
7 | 8 | ||
8 | import matplotlib.pyplot as plt | 9 | import matplotlib.pyplot as plt |
9 | 10 | ||
@@ -139,10 +140,11 @@ def cree_figure(conf,l_jours,l_poids,typedonnee,liste_err): | |||
139 | plt.rcParams['ytick.color'] = conf["couleurs"]["cadretxt"] | 140 | plt.rcParams['ytick.color'] = conf["couleurs"]["cadretxt"] |
140 | plt.rcParams['grid.color'] = conf["couleurs"]["grille"] | 141 | plt.rcParams['grid.color'] = conf["couleurs"]["grille"] |
141 | plt.rcParams['legend.edgecolor'] = conf["couleurs"]["grille"] | 142 | plt.rcParams['legend.edgecolor'] = conf["couleurs"]["grille"] |
143 | ax = plt.axes() | ||
142 | 144 | ||
143 | #Tracé des courbes OMS | 145 | #Tracé des courbes OMS |
144 | for (i,label,couleur) in liste_data_labels: | 146 | for (i,label,couleur) in liste_data_labels: |
145 | plt.plot(coljour,extraire_colonne(t,i,jour_maxi),label=label,color=couleur) | 147 | ax.plot(coljour,extraire_colonne(t,i,jour_maxi),label=label,color=couleur) |
146 | #warning("colonne"+str(i)+str(label)+str(couleur),liste_err) | 148 | #warning("colonne"+str(i)+str(label)+str(couleur),liste_err) |
147 | 149 | ||
148 | debug("cree_figure : tracé des courbes OMS ok",liste_err) | 150 | debug("cree_figure : tracé des courbes OMS ok",liste_err) |
@@ -166,13 +168,13 @@ def cree_figure(conf,l_jours,l_poids,typedonnee,liste_err): | |||
166 | poids_min = max(0,poids_min-1) | 168 | poids_min = max(0,poids_min-1) |
167 | #max : +5% | 169 | #max : +5% |
168 | poids_max = poids_max * 1.05 | 170 | poids_max = poids_max * 1.05 |
169 | 171 | ||
170 | 172 | ||
171 | debug("cree_figure : prête à tracer la courbe de l'enfant",liste_err) | 173 | debug("cree_figure : prête à tracer la courbe de l'enfant",liste_err) |
172 | 174 | ||
173 | ### Tracé pour de bon | 175 | ### Tracé pour de bon |
174 | if l_jours != []: | 176 | if l_jours != []: |
175 | plt.plot(l_jours_conv,l_poids,label=conf["nom"],color=conf["couleurs"]["cadretxt"],marker='o') | 177 | ax.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 | debug("Tracé de la courbe enfant, avec les jours "+str(l_jours_conv),liste_err) |
177 | 179 | ||
178 | #### extrapolatios éventuelles | 180 | #### extrapolatios éventuelles |
@@ -192,6 +194,48 @@ def cree_figure(conf,l_jours,l_poids,typedonnee,liste_err): | |||
192 | else: | 194 | else: |
193 | debug("On ne trace pas de courbe enfant", liste_err) | 195 | debug("On ne trace pas de courbe enfant", liste_err) |
194 | 196 | ||
197 | debug("Début de la gestion de l'échelle", liste_err) | ||
198 | ### échelle à régler | ||
199 | |||
200 | if conf["non_sauve"]["grilleamelio"] == "oui": | ||
201 | |||
202 | pas=choix_echelle_data(typedonnee, poids_max) | ||
203 | # data_min_arrondie | ||
204 | minechelle = int(poids_min/pas[0])*pas[0] | ||
205 | |||
206 | debug("pas choisis pour l'échelle en y : "+str(pas), liste_err) | ||
207 | echellemajeure = arange(minechelle, poids_max, pas[0]) | ||
208 | |||
209 | if pas[1] >0: | ||
210 | echellemineure = arange(minechelle, poids_max, pas[1]) | ||
211 | else: | ||
212 | echellemineure = [] | ||
213 | |||
214 | ax.set_yticks(echellemajeure, minor=False) | ||
215 | ax.set_yticks(echellemineure, minor=True) | ||
216 | |||
217 | # échelle en temps | ||
218 | pas=choix_echelle_temps(unite, age_maxi) | ||
219 | debug("pas choisis pour l'échelle en x : "+str(pas), liste_err) | ||
220 | |||
221 | echellemajeure = arange(0,age_maxi, pas[0]) | ||
222 | if pas[1] >0: | ||
223 | echellemineure = arange(0,age_maxi, pas[1]) | ||
224 | else: | ||
225 | echellemineure = [] | ||
226 | ax.set_xticks(echellemajeure, minor=False) | ||
227 | ax.set_xticks(echellemineure, minor=True) | ||
228 | |||
229 | |||
230 | #### Aspect du graphique | ||
231 | |||
232 | debug("On commende la déco du graphique", liste_err) | ||
233 | |||
234 | # La grille | ||
235 | ax.grid(conf["grille"]=="oui") | ||
236 | ax.grid(conf["grille"] == "oui", which="minor", linestyle="--") | ||
237 | |||
238 | |||
195 | plt.xlabel("Âge en "+unite,color=conf["couleurs"]["cadretxt"]) | 239 | plt.xlabel("Âge en "+unite,color=conf["couleurs"]["cadretxt"]) |
196 | plt.ylabel(typedonnee.capitalize()+" en "+CONFIG["unites_typedonnees"][typedonnee],color=conf["couleurs"]["cadretxt"]) | 240 | plt.ylabel(typedonnee.capitalize()+" en "+CONFIG["unites_typedonnees"][typedonnee],color=conf["couleurs"]["cadretxt"]) |
197 | #print("bla") | 241 | #print("bla") |
@@ -207,7 +251,7 @@ def cree_figure(conf,l_jours,l_poids,typedonnee,liste_err): | |||
207 | if conf['legende']=="oui": | 251 | if conf['legende']=="oui": |
208 | legende = plt.legend(loc=conf['positionlegende']) | 252 | legende = plt.legend(loc=conf['positionlegende']) |
209 | plt.setp(legende.get_texts(), color=conf["couleurs"]["cadretxt"]) | 253 | plt.setp(legende.get_texts(), color=conf["couleurs"]["cadretxt"]) |
210 | plt.grid(conf["grille"]=="oui") | 254 | |
211 | 255 | ||
212 | fig.tight_layout() | 256 | fig.tight_layout() |
213 | 257 | ||
@@ -216,6 +260,9 @@ def cree_figure(conf,l_jours,l_poids,typedonnee,liste_err): | |||
216 | 260 | ||
217 | 261 | ||
218 | 262 | ||
263 | |||
264 | ### Pour extrapoler la courbe | ||
265 | |||
219 | def prolongecourbe(tableauOMS, date, donnee, nouvdates, typecourbe, liste_err): | 266 | 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) | 267 | """ 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 | 268 | et la dernière donnée d'où on extrapole. On veut les extrapolations à nouvdate |