From 685a5f75f63d483d09a593ec69efad882a63a34e Mon Sep 17 00:00:00 2001 From: Denise sur Lya Date: Mon, 15 Feb 2021 16:54:33 +0100 Subject: [PATCH] =?utf8?q?am=C3=A9lioration=20de=20la=20grille,=20b=C3=AAt?= =?utf8?q?a?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- data/changelog_data.txt | 2 ++ gestion_donnees.py | 7 ++--- gestion_unites.py | 61 ++++++++++++++++++++++++++++++++++++++++- templates/index.html | 1 + 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 @@ +"Version 2.26","15/02/2021","

Nouveauté en bêta-test : grille améliorée. Pour le moment on peut cocher pour avoir cette fonctionnalité.

" + "Version 2.25","12/02/2021","

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 !

" "Version 2.2001","13/11/2020","

Amélioration de l'affichage pour les prémas (masqués par défaut). Précision dans le texte + FAQ.

" 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): """ prend en argument le dictionnaire de requête (configuration imparfaite), et construit le dictionnaire de configuration qui va bien. Vérifie que chaque entrée est cohérente évidemment.""" - configuration = {} + configuration = {"non_sauve": {}} # Pour le nom, osef qu'il soit vide nom = data.get("nom","") @@ -292,15 +292,14 @@ def gere_configuration(data,liste_err): configuration["prolongercourbes"] = gere_checkbox(data.get("prolongercourbes","")) + configuration["non_sauve"]["grilleamelio"] = gere_checkbox(data.get("grilleamelio","")) configuration["couleurs"] = {} # gérer les couleurs for clecouleur in DEFAUT["couleurs"]: coul = rgb_vers_tuple(data.get("couleur_"+clecouleur,""),CONFIG["couleurs"][clecouleur],liste_err) configuration["couleurs"][clecouleur] = coul - - # On y ajoute la partie "non sauvée" qui servira peut-être plus tard - configuration["non_sauve"] = {} + return configuration 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 * ##################### outils pour affichage et choix de l'unité def choix_unite(maxi): - """ en fonction de l'âge maxi, on choisit une unité pertinente : jours, mois, année""" + """ en fonction de l'âge maxi, on choisit une unité pertinente : jours, semaine, mois, année""" if maxi<40: return "jours" elif maxi <100: @@ -17,6 +17,65 @@ def choix_unite(maxi): else: return "années" +def choix_echelle_data(typedonnees, donneemax): + """ en fonction du type de données et du maxi (on suppose qu'on part à 0), + on choisit un intervalle raisonnable + On renvoie le couple des pas (majeur, mineur) + (0,0) en cas de problème avec le typedonnnes """ + + if typedonnees not in CONFIG["liste_typedonnees"]: + print("Type de données non valide : "+typedonnees) + return (0,0) + + if typedonnees == "poids": + if donneemax>15: + return (5,1) + elif donneemax > 10: + return (2,1) + else: + return (1,0.2) + if typedonnees == "taille": + if donneemax>100: + return (10,2) + else: + return (5,1) + +def choix_echelle_temps(unite, tempsmaxi): + """ en fonction de l'unité voulue et du temps maximal (donné dans l'unité), + on choisit un intervalle raisonnable entre les pas. + On renvoie le couple des pas (majeur, mineur). + (0,0) en cas de problème avec l'unité + On met 0 en 2e arg si pas de grille secondaire""" + if unite not in CONFIG["liste_unites"]: + print("Unité non valide ! "+unite) + return (0,0) + + if unite=="jours": + if tempsmaxi > 60: # pourquoi mettre en jours ? + return (30,1) + elif tempsmaxi >20: + return (7,1) + else: + return (1,0) + if unite=="semaines": + if tempsmaxi >50: + return (5,1) + elif tempsmaxi > 15: + return (2,1) + else: + return (1,1/7) # On met en jours + + if unite=="mois": + if tempsmaxi > 30: + return (2,1) + elif tempsmaxi > 10: + return (1,0) + else: + return (1,0.25) # on met en semaines + + if unite=="années": + return (1,1/12) # années / mois + def convertitunite(jours,unite,liste_err): """ convertit des jours à l'unité voulue 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 @@
  • Prolonger les courbes (expérimental) :
  • +
  • Dimensions du graphique :
  • 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 from gestionOMS import * from gestion_unites import * from gestion_donnees import calcule_max_graphique, convertit_jours_vers_python +from numpy import arange import matplotlib.pyplot as plt @@ -139,10 +140,11 @@ def cree_figure(conf,l_jours,l_poids,typedonnee,liste_err): plt.rcParams['ytick.color'] = conf["couleurs"]["cadretxt"] plt.rcParams['grid.color'] = conf["couleurs"]["grille"] plt.rcParams['legend.edgecolor'] = conf["couleurs"]["grille"] + ax = plt.axes() #Tracé des courbes OMS for (i,label,couleur) in liste_data_labels: - plt.plot(coljour,extraire_colonne(t,i,jour_maxi),label=label,color=couleur) + ax.plot(coljour,extraire_colonne(t,i,jour_maxi),label=label,color=couleur) #warning("colonne"+str(i)+str(label)+str(couleur),liste_err) 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): poids_min = max(0,poids_min-1) #max : +5% poids_max = poids_max * 1.05 - + debug("cree_figure : prête à tracer la courbe de l'enfant",liste_err) ### Tracé pour de bon if l_jours != []: - plt.plot(l_jours_conv,l_poids,label=conf["nom"],color=conf["couleurs"]["cadretxt"],marker='o') + ax.plot(l_jours_conv,l_poids,label=conf["nom"],color=conf["couleurs"]["cadretxt"],marker='o') debug("Tracé de la courbe enfant, avec les jours "+str(l_jours_conv),liste_err) #### extrapolatios éventuelles @@ -192,6 +194,48 @@ def cree_figure(conf,l_jours,l_poids,typedonnee,liste_err): else: debug("On ne trace pas de courbe enfant", liste_err) + debug("Début de la gestion de l'échelle", liste_err) + ### échelle à régler + + if conf["non_sauve"]["grilleamelio"] == "oui": + + pas=choix_echelle_data(typedonnee, poids_max) + # data_min_arrondie + minechelle = int(poids_min/pas[0])*pas[0] + + debug("pas choisis pour l'échelle en y : "+str(pas), liste_err) + echellemajeure = arange(minechelle, poids_max, pas[0]) + + if pas[1] >0: + echellemineure = arange(minechelle, poids_max, pas[1]) + else: + echellemineure = [] + + ax.set_yticks(echellemajeure, minor=False) + ax.set_yticks(echellemineure, minor=True) + + # échelle en temps + pas=choix_echelle_temps(unite, age_maxi) + debug("pas choisis pour l'échelle en x : "+str(pas), liste_err) + + echellemajeure = arange(0,age_maxi, pas[0]) + if pas[1] >0: + echellemineure = arange(0,age_maxi, pas[1]) + else: + echellemineure = [] + ax.set_xticks(echellemajeure, minor=False) + ax.set_xticks(echellemineure, minor=True) + + + #### Aspect du graphique + + debug("On commende la déco du graphique", liste_err) + + # La grille + ax.grid(conf["grille"]=="oui") + ax.grid(conf["grille"] == "oui", which="minor", linestyle="--") + + plt.xlabel("Âge en "+unite,color=conf["couleurs"]["cadretxt"]) plt.ylabel(typedonnee.capitalize()+" en "+CONFIG["unites_typedonnees"][typedonnee],color=conf["couleurs"]["cadretxt"]) #print("bla") @@ -207,7 +251,7 @@ def cree_figure(conf,l_jours,l_poids,typedonnee,liste_err): if conf['legende']=="oui": legende = plt.legend(loc=conf['positionlegende']) plt.setp(legende.get_texts(), color=conf["couleurs"]["cadretxt"]) - plt.grid(conf["grille"]=="oui") + fig.tight_layout() @@ -216,6 +260,9 @@ def cree_figure(conf,l_jours,l_poids,typedonnee,liste_err): + +### Pour extrapoler la courbe + def prolongecourbe(tableauOMS, date, donnee, nouvdates, typecourbe, liste_err): """ tableauOMS est le ableau des données OMS. date et donnee sont la date (jours) et la dernière donnée d'où on extrapole. On veut les extrapolations à nouvdate -- 2.41.0