Partage
  • Partager sur Facebook
  • Partager sur Twitter

Tracer un graphique sur python

    19 novembre 2021 à 16:17:31

    Oui t'as tout a fait raison malgré que je n'ai pas bien compris la différence entre insert et append dans ce cas de figure.

    Il reste que j'ai un peu de doute sur ce que le code affiche, je crois qu'il y a un petit décalage au niveau des points :

    En 1er regard, ca donne l'impression  que le paquet des 4 points appartiennent aux semaines 25 et 26 ce qui n'est pas juste, elles ne sont pas correctement alignées il mes semble n'est ce pas  ??

    Je comprends bien qu'on trace avec les vrai dates donc l'ordre ne dépend pas de l'ordre des labels, mais il n'y a pas un moyen de décaler les labels pour quelles soient en face des points, il faut peut être changer l'échelle de l'axe des X non ?

    Donc dans ce cas ca sera plutôt ainsi :

    -
    Edité par HaPy19 19 novembre 2021 à 16:28:36

    • Partager sur Facebook
    • Partager sur Twitter
      19 novembre 2021 à 16:50:51

      list.insert(index, valeur) : insérer la valeur à l'index index de la liste

      list.append(valeur): ajoute la valeur à la fin de la liste

      https://docs.python.org/fr/3/tutorial/datastructures.html 

      et le problème (encore une fois de ma faute pour ne pas changer :euh:) c'est que les noms de semaine sont placé linéairement et pas associé aux valeurs de x

      donc remplacer la ligne "ax.set_xticklabels(x)" par plt.xticks(X,x) https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.xticks.html?highlight=xticks

      si besoin rajouter rotation= 45 ou rotation='vertical' pour modifier l'orientation du texte

      • Partager sur Facebook
      • Partager sur Twitter
        19 novembre 2021 à 18:20:31

        Oh Hallelujah ca fonctionne a merveille, ca donne le graphe suivant :

        Par contre j'ai une petite remarque quand j'ai tenté de modifié le tableau, j'ai retiré encore des colonnes et j'ai changé un peu les dates comme ceci :

        Il releve l'erreur suivante :

        File "<ipython-input-32-a2e7103cfc65>", line 430, in part1
            while (e2.loc[0][0] - e2.loc[0][i]).days//7 < 11:
        TypeError: unsupported operand type(s) for -: 'datetime.datetime' and 'float'

        Je comprends bien que c'est le 11 qui pose le problème puisque dans le nouveau tableau on n'a pas 11 semaines, il n'y a pas un moyen de régler ca, l'idéal est de changer le 11 par le nombre de semaine de paquet de semaine qui sont proche, cad, si une semaine est très loin des autres on l'a prend pas en considération, sinon de le changer par le nombre de colonnes mais dans ce cas, si on a que deux colonnes et les deux dates sont éloignées par un écart d'une semaine ou 2 semaines par exemple, il va afficher que la dernière date sur le graphe !!?

        code :

        x,X,y1,y2,y3=[],[],[],[],[]
                year,week,day=e2.loc[0][0].isocalendar()
                x.insert(0,'CW' +str(week) +'/'+str(year))
                X.insert(0,e2.loc[0][0])
                y1.insert(0,e2.loc[1][0])
                y2.insert(0,e2.loc[2][0])
                y3.insert(0,e2.loc[3][0])
                i=1
                while (e2.loc[0][0] - e2.loc[0][i]).days//7 < 11:
                    year,week,day=e2.loc[0][i].isocalendar()
                    x.insert(0,'CW' +str(week) + '/' + str(year))
                    X.insert(0,e2.loc[0][i])            
                    y1.insert(0,e2.loc[1][i])
                    y2.insert(0,e2.loc[2][i])
                    y3.insert(0,e2.loc[3][i])
                    i=i+1
         
                self.progress_bar["value"] = 40
                root.update()
                #y1 = e2.loc[1]  #Coverage
                #y2 = e2.loc[2]  #Completness
                #y3 = e2.loc[3]  #Consistency
          
          
                plt.figure(figsize=(10, 5))
          
                plt.grid(True)
                
                plt.plot(X, y1, '-o', label='Coverage', lw=3)
                plt.plot(X, y2, '-o', label='Completness', lw=3)
                plt.plot(X, y3, '-o', label='Consistency', lw=3)
                   
                plt.legend()
                   
                ax = plt.gca() #Axes graphiques
                ax.set_ylim([min(map(min,(y1,y2,y3)))-10,max(map(max,(y1,y2,y3)))+10])
                #ax.set_xticklabels(x)
                plt.xticks(X,x,rotation=45)
                plt.show()
        
                #ax.invert_xaxis() ##################
                plt.savefig("fig.png")
                eb = e1.to_numpy()
                self.progress_bar["value"] = 60
                #time.sleep(0.5)

        Ps : Merci infiniment pour tes explications et ton aide 


        -
        Edité par HaPy19 19 novembre 2021 à 19:01:32

        • Partager sur Facebook
        • Partager sur Twitter
          19 novembre 2021 à 19:45:30

          non, il dit qu'il ne peut pas faire de soustraction entre un type date.datetime et un float; une des valeurs de date est vue comme un float et non pas comme une date (voir en changeant le format de la cellule?) et affichant les valeurs e2.loc[0][0] et e2.loc[0][i]

          Et oui ça peut peut-être se produire dans ce cas-là en effet après réflexion; donc gérer l'erreur et sortir de la boucle si elle se produit (par exemple)

          Si on n'a qu'une seule valeur, il va aussi falloir gérer les erreurs sur le min (comme l'erreur que tu as précédemment eu)

          • Partager sur Facebook
          • Partager sur Twitter
            19 novembre 2021 à 19:56:35

            Regarde, j'ai remplacé le 11 par 4 et ca donne bien un graphe qui est bon : 

            PS : j'ai essayé aussi de mettre a la place de 11 "len(X)" mais il renvie qu'une seule semaine (la dernière), en croyant qu'il va bien bien prendre le nombre de semaines présentes dans le tableau.

            Donc je crois que c'est bien le 11 qui pose le problème, il faut savoir qu'il peut y avoir moins de 11 semaines dans le tableau et la il faut tout simplement les afficher tous, ca pourra marcher avec un if non !! mais aucune idée comment la faire : mettre toute la boucle dans un if nombre de semaine = 11 et else  ?? 

            Sinon, qu'il prenne le nombre de colonne de tableau +1 a la place de 11, puisque si on a qu'une seule colonne cad on a une seule semaine et si c'était 2 donc 2 semaines, et l'écart entre les deux semaines il l'affiche automatiquement ! 

            Ah oui, je me rends compte que si on lui donne pas assez de l'espace genre un nombre suffisant de semaine, il  aura manquer les semaines un peu espacée des autres, comme dans mon cas suivant :

            j'ai 3 colonnes et j'ai mis 4 a la place de 11 (3+1), il a affiché que les deux semaines CW1, CW51 puisque c'a suit sinon la semaine de novembre il ne l'a pas affiché malgré qu'il devrait puisque elle n'est pas très éloigné des autres.

            PS : Le min et le max au niveau de scope, il le gère très bien. J'ai mis 10% et des valeurs auteur de 100% et il les affiche tous.

            Donc pour pallier ce problème de nombre de semaine de tableau, je vois que le if sera la meilleure idée, cad if on a plus de 11 affiche que 11 ce qu'il fait maintenant, else affiche toute les semaines qui sont présentes dans le tableau en tenant en compte l'écart. (Je dis bien le nombre de semaine et pas le nombre de colonnes puisque il peut avoir une semaine de mois de février 2021 et deux semaines en mois de novembre 2021 par exemple, dans ce cas il affiche que les 2 en mois de novembre) 

            As tu une idée comment le faire stp ?

            -
            Edité par HaPy19 21 novembre 2021 à 14:34:37

            • Partager sur Facebook
            • Partager sur Twitter
              22 novembre 2021 à 12:08:25

              (e2.loc[0][0] - e2.loc[0][i]).days//7 < 11 permet de limiter les données à un délai de 10 semaines

              donc il faudrait aussi rajouter un test sur la longueur du nombre de colonne (X ne sait pas combien il y a de colonnes dans ton fichier, mais len(e2.loc[0]) devrait donner l'info; peut-être un while (e2.loc[0][0] - e2.loc[0][i]).days//7 < 11 and i < len(e2.loc[0]): pourrait suffire

              ou un test en fin de boucle de type if isinstance(e2.loc[0][i],float): break (pour sortir si la valeur est un float plutôt qu'une date) 

              • Partager sur Facebook
              • Partager sur Twitter
                29 novembre 2021 à 11:05:07

                Tout d'abord, désolé pour le délai de réponse.

                Sinon, j'ai bien testé ce que tu m'as proposé, mais a chaque fois, il relève cette erreur :

                TypeError: unsupported operand type(s) for -: 'datetime.datetime' and 'float'

                Par contre, j'ai bien réussi a le faire tourné en mettant la boucle dans un try except (try : .... except : print("Moins de 10 semaines dans le tableau")).

                Je ne sais pas est ce que c'est la meilleure méthode de le faire mais ca fonctionne avec tout les cas que j'ai testé pour le moment.

                Je te remercie infiniment pour ton aide précieuse et tes explications qui m'ont été d'une grande utilité.

                • Partager sur Facebook
                • Partager sur Twitter
                  29 novembre 2021 à 13:27:57

                  Je pense que c'est la façon la plus simple avec le try/except

                  • Partager sur Facebook
                  • Partager sur Twitter
                    30 novembre 2021 à 16:24:11

                    Oui, l'essentiel il fonctionne bien ahah, merci beaucoup pour ton aide.

                    Par contre, j'ai une autre petite demande stp : j'ai essayé de convertir mon code .py en .exe avec pyinstaller (version 4.7) (ce que j'utilise souvent), l'exécutable s'ouvre bien mais en arrivant a la moitié de la barre de progression il crache et renvoie l'erreur sur la photo.

                    J'ai essayé avec certaine solution proposé sur google, par exemple celle de mettre l'ordi en mode sans échec mais le problème persiste.

                    Je travaille sur Annaconda3 et avec Jupyter notebook, du coup j'ai tenté de réinstaller Anaconda, et donc réinstaller pyinstaller et créer a nouveau mon .exe mais sans résultat. La version du python sur l'anaconda que j'utilise est : 3.8.5

                    Ps : C'est la première fois que je fasse face a ce problème, mine de rien je suis toujours le même process pour créer mon exécutable.

                    -
                    Edité par HaPy19 30 novembre 2021 à 16:38:25

                    • Partager sur Facebook
                    • Partager sur Twitter
                      30 novembre 2021 à 17:21:01

                      tu as ajouté les modules Qt pour la création de l'exe ? le message semble indiqué qu'il n'y a pas le plugin pour Qt/PySide  https://github.com/pyinstaller/pyinstaller/issues/5414
                      • Partager sur Facebook
                      • Partager sur Twitter

                      Tracer un graphique sur python

                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                      • Editeur
                      • Markdown