Partage
  • Partager sur Facebook
  • Partager sur Twitter

Tracer une ligne verticale de longueur donnée

Matplotlib

Sujet résolu
    27 décembre 2015 à 2:30:51

    Salut ! Le titre complet serait plutôt dans mon cas: Comment tracer une ligne verticale de longueur donnée au dessus d'une courbe ou d'une ligne brisée tracée au préalable avec matplotlib? :)

    Voici un petit exemple:

    J'ai entendu parler du module plt.axvline mais je ne sais pas comment m'en servir.

    Merci d'avance !

    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      27 décembre 2015 à 10:12:38

      Qu'as-tu testé avec cette solution ? Que donne chaque solution testée ? Où est le code minimal testable afin qu'on puisse t'aider ?
      • Partager sur Facebook
      • Partager sur Twitter
        27 décembre 2015 à 13:42:41

        D'accord, je vous explique pourquoi je veux ça: je fais un sujet dans lequel je dois tracer un relief  avec une liste de d'altitudes grâce à matplotlib. Maintenant je dois pouvoir tracer des poteaux d'une taille donnée sur ces reliefs (3 mètres par exemple). Et je suis bloqué lorsqu'il s'agit de tracer des lignes verticales (les poteaux) sur ce relief.

        Voici le code:

        def test(altitudes):
            plt.plot(altitudes,'g')    
            
            for i in range(len(altitudes)):
                plt.axvline(x=i, linewidth=3, color='k')
        
            return plt.show()
        
        print test([0.0,3.7,4.5,6.8,4.9,10.2,8.9])

        Et voilà ce que j'obtiens:

        Mais si vous avez une technique différente et plus simple je prends volontiers :)

        -
        Edité par poncinloic 27 décembre 2015 à 14:01:03

        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          27 décembre 2015 à 15:43:23

          Pas mieux, on peut juste faire un peu plus propre avec enumerate...

          def test(altitudes):
              plt.plot(altitudes,'g')   
               
              for ind, _ in enumerate(altitudes):
                  plt.axvline(x=ind, linewidth=3, color='k')
           
              return plt.show()
           
          test([0.0,3.7,4.5,6.8,4.9,10.2,8.9])

          Sinon je pense que l'utilisation de numpy avec matplotlib se marie très bien, à voir si les performances te conviennent, dans ce cas pas besoin de l'ajouter.

          • Partager sur Facebook
          • Partager sur Twitter
            27 décembre 2015 à 19:20:35

            Oui mais je n'obtiens pas des poteaux d'une taille précise comme je le montre dans la photo de mon premier message, mais des lignes verticales qui parcourent tout le graphes comme dans la photo de mon second message.

            • Partager sur Facebook
            • Partager sur Twitter
              27 décembre 2015 à 20:15:26

              Après il peut y avoir cette solution aussi:

              def test(altitudes,poteaux):
                  plt.plot(altitudes,'g')   
                   
                  poteaux_x=[]
                  poteaux_y=[]
              
                  for i in poteaux:
                      poteaux_x.append(i)
                      poteaux_x.append(i)
                  for j in poteaux:
                      poteaux_y.append(float(altitudes[j]))
                      poteaux_y.append(float(altitudes[j]+3))
                  
                  plt.plot(poteaux_x,poteaux_y,"k")
                  return plt.show()
              
              print test([0.0,3.7,4.5,6.8,4.9,10.2,8.9],[0,1,2,3,4,5,6])

              ça produit ça:

              Mais les poteaux sont reliés alors que je les veux séparés. On pourrait tracer les traits une fois sur deux mais je ne sais pas comment modifier mon code pour faire ça.

              -
              Edité par poncinloic 27 décembre 2015 à 20:52:05

              • Partager sur Facebook
              • Partager sur Twitter
              Anonyme
                27 décembre 2015 à 21:26:43

                Pourquoi pas cela

                import matplotlib.pyplot as plt
                
                def test(altitudes, hauteur):
                    plt.plot(altitudes,'g')   
                
                    for ind, n in enumerate(altitudes):
                        l1 = [ind for i in range(hauteur)]
                        l2 = [n + j for j in range(hauteur)]
                        plt.plot(l1, l2)
                 
                    plt.show()
                 
                test([0.0,3.7,4.5,6.8,4.9,10.2,8.9], 8) # trait vertical de hauteur 8



                • Partager sur Facebook
                • Partager sur Twitter
                  27 décembre 2015 à 21:37:39

                  Ton code marche à merveille. J'ai trouvé une petite solution en modifiant mon code:

                  def test(altitudes,poteaux): 
                       
                      poteaux_x=[]
                      poteaux_y=[]
                  
                      for i in poteaux:
                          poteaux_x.append(i)
                          poteaux_x.append(i)
                          poteaux_x.append(i)
                      for j in poteaux:
                          poteaux_y.append(float(altitudes[j]))
                          poteaux_y.append(float(altitudes[j]+l))
                          poteaux_y.append(float(altitudes[j]))
                          
                      plt.plot(poteaux_x,poteaux_y,"k")
                  
                      plt.plot(altitudes,'g',linewidth=2) #linewidth peut être remplacé par lw
                  
                      plt.show()
                  
                  print test([0.0,3.7,4.5,6.8,4.9,10.2,8.9],[0,1,2,3,4,5,6])

                  Ça affiche:

                   

                  Merci pour ton aide !

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Anonyme
                    27 décembre 2015 à 21:51:33

                    Eh bien plus qu'à faire ton choix ;)
                    • Partager sur Facebook
                    • Partager sur Twitter

                    Tracer une ligne verticale de longueur donnée

                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                    • Editeur
                    • Markdown