Partage
  • Partager sur Facebook
  • Partager sur Twitter

Courbe avec comme axe date

    15 août 2016 à 22:32:06

    Salut à tous, 

    J'ai deux listes que je veux tracer à l'aide de matplotlib, l'une contient les données et l'autre la date de ces données : 

    data=[49,20,37,28,...,20]
    jour=["14/02/2016","15/02/2016","17/02/22016","28/05/2016","...","15/07/2016"]


    sauf que je ne vois pas comment faire et je ne comprends pas la doc que j'ai trouvé : http://matplotlib.org/examples/pylab_examples/date_demo1.html , http://matplotlib.org/examples/api/date_demo.html 

    • Partager sur Facebook
    • Partager sur Twitter
    Mon tumblr (Des concept d'avions)
      15 août 2016 à 23:20:35

      Tu pourrais te servir de la fonction xticks pour placer les dates:

      import matplotlib.pyplot as plt
      
      data = [49, 20, 37, 28, 20]
      jours = ["14/02/2016", "15/02/2016", "17/02/22016", "28/05/2016", "15/07/2016"]
      
      plt.plot(data)  #1 seul argument: 'data'
      plt.xticks(range(len(data)), jours, rotation=45)
      plt.show()


      La doc de xticks

      • Partager sur Facebook
      • Partager sur Twitter
      Précepte: Le mieux est l'ennemi du bien
        16 août 2016 à 11:05:20

        Merci pour ton aide ça marche super bien mais le problème est que y'a le même espacement entre deux dates :

        Si par exemple j'ai les 3 dates suivantes 14/02/2016 ; 15/02/2016 ; 29/12/2016 j'aimerais que l'espace entre le 14 et le 15 février soit plus court que l'espace entre le 15 février et le 29 décembre...

        Je sais pas si je suis clair ou même si c'est possible

        • Partager sur Facebook
        • Partager sur Twitter
        Mon tumblr (Des concept d'avions)
          16 août 2016 à 13:34:22

          Je ne sais absolument pas si numpy intègre par défaut ce genre de mécanisme. Par contre tu es tout à fait en mesure de créer ton propre affichage (mais ça risque de vite devenir bordélique). Tu pourrais par exemple utiliser une échelle logarithmique entre deux dates. Un truc du style:

          import datetime as dt
          from math import log10
          import matplotlib.pyplot as plt
          
          
          def echelle_log(dates, format="%d/%m/%Y", start=0):
              dates = iter(dates)
              first_date = dt.datetime.strptime(next(dates), format)
              out = [start]
          
              for date in dates:
                  second_date = dt.datetime.strptime(date, format)
                  nb_second = (second_date - first_date).total_seconds()
                  out.append(out[-1] + log10(nb_second)/log10(86400))
          
                  #La seconde date devient la première pour l'itération suivante
                  first_date = second_date
          
              return out
          
          
          data = [49, 20, 37, 28, 20]
          jours = ["14/02/2016", "15/02/2016", "17/02/2016", "28/05/2016", "15/07/2016"]
          
          x = echelle_log(jours, start=1)
          
          plt.plot(x, data)
          plt.xticks(x, jours, rotation=45)
          plt.xlim(0, max(x)+1)
          plt.show()


          C'est juste un exemple pour te montrer que c'est possible. Pour avoir quelque chose de propre visuellement, il faudra sûrement modifier quelques valeurs (la valeur de start, les bornes de xlim, ...). À toi d'adapter ce code ou de construire ta propre échelle. ;)

          • Partager sur Facebook
          • Partager sur Twitter
          Précepte: Le mieux est l'ennemi du bien

          Courbe avec comme axe date

          × 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