IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Différence entre pandas.plot() et plt.subplots() [Python 3.X]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 75
    Par défaut Différence entre pandas.plot() et plt.subplots()
    Bonjour,

    Je suis débutant et autodidacte en programmation Python.

    Je rencontre un problème d'affichage entre les deux méthodes suivantes : pandas.plot() et plt.subplots().

    1 ) Pourquoi pandas.plot() n'affiche pas toutes les valeurs du DataFrame ?

    2 ) Existe-t-il une autre méthode pour modifier le label de l'axe X ?

    Nom : Bug.jpeg
Affichages : 196
Taille : 65,4 Ko

    Voici les sources :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    import matplotlib.pyplot as plt
    import pandas as pd
     
    """
    tensions=pd.read_excel('./Dataset/Tensions.xls',index_col='date',parse_dates=True)
    tensions.drop('PLS',axis='columns', inplace=True)
    tensions.index=tensions.index.strftime("%Y/%m/%d %H")
    """
     
    tensions=pd.DataFrame({'SYS': {'2026/08/29 10': 16,
      '2026/08/29 17': 16,
      '2026/08/30 10': 15,
      '2026/08/30 17': 16,
      '2026/08/31 10': 17,
      '2026/09/01 10': 17,
      '2026/09/01 18': 17,
      '2026/09/02 10': 15,
      '2026/09/02 17': 20,
      '2026/09/03 10': 14},
     'DIA': {'2026/08/29 10': 8,
      '2026/08/29 17': 8,
      '2026/08/30 10': 9,
      '2026/08/30 17': 8,
      '2026/08/31 10': 9,
      '2026/09/01 10': 14,
      '2026/09/01 18': 9,
      '2026/09/02 10': 7,
      '2026/09/02 17': 9,
      '2026/09/03 10': 7}})
     
     
    tensions.plot(fontsize=7,rot=90,grid='True',title='Figure 1')
     
    fig, ax1 = plt.subplots()
    ax1.plot(tensions.index,tensions['SYS'],label='SYS')
    ax1.plot(tensions.index,tensions['DIA'],label='DIA')
     
    plt.title('Figure 2')
    plt.legend(fontsize=6)
    plt.xticks(fontsize=7,rotation=90)
    plt.grid(True)
    Merci pour votre aide ou remarques.

    Cordialement Marc.

    Python 3.12.3 matplotlib 3.10.7 pandas 2.3.3

  2. #2
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 992
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 992
    Par défaut
    Hello,

    Il y a surtout une différence de niveau entre les deux écritures :

    - tensions.plot() est le raccourci fourni par pandas : il trace directement les colonnes numériques du DataFrame en utilisant son index pour l'axe X.
    - plt.subplots() ne trace encore rien. Il crée une figure et un axe ; ce sont ensuite les appels ax1.plot(...) qui dessinent les courbes. Cette seconde forme est plus longue, mais laisse davantage la main sur le graphique.

    Dans votre exemple, les 10 valeurs sont bien tracées. Ce qui donne l'impression qu'il en manque, ce sont les dates écrites sous l'axe X : pandas n'affiche pas forcément toutes les graduations afin qu'elles ne se chevauchent pas.

    Le point important est de garder les dates comme de vraies dates. Dans le code de lecture Excel, il vaut mieux supprimer cette ligne :

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    tensions.index = tensions.index.strftime("%Y/%m/%d %H")

    Elle transforme les dates en texte. Si nécessaire, faites plutôt :

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    tensions.index = pd.to_datetime(tensions.index,
                                    format="%Y/%m/%d %H")

    Ensuite, on peut profiter à la fois de pandas et de Matplotlib :

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    fig, ax = plt.subplots()
     
    tensions.plot(ax=ax, grid=True, title="Figure 1",
                  rot=90, fontsize=7)
     
    ax.set_xlabel("Date et heure")  # le titre de l'axe X
    fig.autofmt_xdate()             # espace mieux les dates
    plt.show()

    On peut aussi donner ce titre directement à pandas :

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ax = tensions.plot(grid=True, title="Figure 1",
                       xlabel="Date et heure",
                       rot=90, fontsize=7)

    Attention à la distinction :
    - xlabel / set_xlabel() modifie le titre général de l'axe (par exemple « Date et heure ») ;
    - les dates affichées une par une sont les graduations. Pour imposer toutes les graduations — raisonnable ici puisqu'il n'y en a que 10 — on peut écrire :

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ax.set_xticks(tensions.index,
                  labels=tensions.index.strftime("%d/%m %Hh"),
                  rotation=90, fontsize=7)

    Avec beaucoup de dates, il vaut mieux ne pas toutes les afficher, sinon le graphique devient difficile à lire.

    Documentation utile :

    - pandas.DataFrame.plot : c'est la page de référence du raccourci tensions.plot(). Elle décrit notamment use_index, xlabel, xticks, rot et fontsize.
    - Axes.set_xlabel : explique comment donner un titre à l'axe X lorsque l'on travaille avec l'objet ax.
    - Axes.set_xticks : explique comment choisir les positions et les textes des graduations ; c'est la bonne méthode si vous voulez contrôler les dates affichées.
    - Matplotlib dates : à consulter lorsque l'axe X contient de vraies dates ; Matplotlib y propose des outils pour choisir automatiquement un affichage lisible.

    Petite correction également : écrivez grid=True et non grid='True' ; le premier est un booléen Python.
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 75
    Par défaut
    Bonjour,

    Merci pour ces nombreux conseils.

    Cordialement Marc.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Diffrence entre DataSnap REST, Serveur DataSnap et DataSnap WebBroker
    Par Carmichael dans le forum Composants VCL
    Réponses: 2
    Dernier message: 09/08/2019, 09h26
  2. [pandas, plot] : bug complexe
    Par membreComplexe12 dans le forum Général Python
    Réponses: 4
    Dernier message: 07/07/2017, 20h25
  3. Réponses: 4
    Dernier message: 20/08/2016, 07h27
  4. Corrélation entre deux plot
    Par z_valentin dans le forum Scilab
    Réponses: 10
    Dernier message: 20/02/2012, 01h25
  5. diffrence entre deux TIME
    Par mrkinfo dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 31/07/2006, 15h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo