amélioration de la grille, bêta
authorDenise sur Lya <sekhmet@lya>
Mon, 15 Feb 2021 15:54:33 +0000 (16:54 +0100)
committerDenise sur Lya <sekhmet@lya>
Mon, 15 Feb 2021 15:54:33 +0000 (16:54 +0100)
data/changelog_data.txt
gestion_donnees.py
gestion_unites.py
templates/index.html
trace_courbe.py

index 09a6da4171e7ade71714c39f00917839762ffad6..f59e7b7561c3d143398689c9e4391624305b540e 100644 (file)
@@ -1,3 +1,5 @@
+"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>"
+
 "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>"
 
 "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>"
index c378b5e653a043334dbbeeae658a7555902d8878..208be4af0c07df63f30e9bdc21aa47333a014f7d 100644 (file)
@@ -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   
  
index 8fcb1ad752931f34eaf972361dae93211e6cfe80..b97d90b58ed6cfcfd44b77c8a854ab16d6a5d195 100644 (file)
@@ -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"""
index 959c6a17082865667281722ad6fed206498100de..e5d4d24833ffc390d0bbfb2fc14b689445c57305 100644 (file)
@@ -96,6 +96,7 @@
        <li>Prolonger les courbes (expérimental) : <input type="checkbox" name="prolongercourbes" {% if valform.prolongercourbes == "oui" %} checked{% endif%}></li>
        
        <li><label>Même échelle sur tous les graphiques&nbsp;: </label><input type="checkbox" name="memechelle" {% if valform.memechelle == 'oui' %} checked{% endif %}></li>
+       <li><label>Grille améliorée (bêta)&nbsp;:</label><input type="checkbox" name="grilleamelio"></li>
        <li>Dimensions du graphique&nbsp;: <label>largeur&nbsp;: </label><input type="text" name="largeur" value="{{ valform.largeur }}"> 
        <label>hauteur&nbsp;: </label><input type="text" name="hauteur" value="{{ valform.hauteur }}"></li>
        <li><label>Légende&nbsp;: <input type="checkbox" name="legende" {% if valform.legende == 'oui' %} checked{% endif %}> </label>
index fab64718c0f7508795f13fea2854b268e5b3d19e..9cb4845c658c63191caaf39e49546f7ff63704fd 100644 (file)
@@ -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