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 :

Correspondance xticklabel et xticks


Sujet :

Python

  1. #1
    Membre confirmé
    Homme Profil pro
    Éternel universitaire
    Inscrit en
    Avril 2012
    Messages
    421
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Éternel universitaire

    Informations forums :
    Inscription : Avril 2012
    Messages : 421
    Points : 639
    Points
    639
    Par défaut Correspondance xticklabel et xticks
    Bonjour,

    Débutant en Python ici... J'ai un problème de correspondance entre mes xtick et mes xticklabels que j'illustre de façon simplifiée ci-dessous. J'utilise matplotlib et pandas.
    ordinalTS est un objet pandas.core.series.Series qui contient des dates sous forme ordinale.
    DataFrame est un objet pandas.core.frame.DataFrame

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ax8 = plt.subplot(111)
        ax8.plot(ordinalTS,dataSelec.batt_volt_Max, color='k',linestyle='-',label='Max charge')
        ax8.plot(ordinalTS,dataSelec.batt_volt_Min, color='r',linestyle='-',label='Min charge')
        ax8.legend(fontsize=14)
        ax8.set_ylabel('Tension [V]',fontsize=14)
        ax8.set_xticklabels(dataSelec.TIMESTAMP.dt.strftime('%Y-%m-%d'),rotation=30,horizontalalignment='center')
        ax8.set_title('Batteries',fontsize=18)
    Ma série ordinalTS correspond à ma série dataSelec
    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
    ordinalTS
    Out[95]: 
    23    737241
    24    737242
    25    737243
    26    737244
    27    737245
    28    737246
    29    737247
    30    737248
    31    737249
    32    737250
    33    737251
    34    737252
    35    737253
    36    737254
    37    737255
    Name: TIMESTAMP, dtype: int64
     
    dataSelec.TIMESTAMP.dt.strftime('%Y-%m-%d')
    Out[96]: 
    23    2019-07-01
    24    2019-07-02
    25    2019-07-03
    26    2019-07-04
    27    2019-07-05
    28    2019-07-06
    29    2019-07-07
    30    2019-07-08
    31    2019-07-09
    32    2019-07-10
    33    2019-07-11
    34    2019-07-12
    35    2019-07-13
    36    2019-07-14
    37    2019-07-15
    Name: TIMESTAMP, dtype: object
    Tout est beau, sauf que, lorsque j'assigne les xticklabels, la correspondance est perdue. Les xtick sont assigné un jour sur deux, mais les xticklabel chaque jour. Donc les xticklabel ne vont que jusqu'à la moitié de la série et on a l'impression que le graphique ne couvre que la moitié de la période.

    Merci !

    Nom : xtick_vs_xticklabel.jpg
Affichages : 304
Taille : 65,5 Ko

  2. #2
    Membre émérite

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Points : 2 328
    Points
    2 328
    Par défaut
    Bonjour

    Lorsque tu traces un graphique, avec 100 points par exemple, matplotlib ne te met pas 1 label par point, car ce serait juste illisible. Il met des graduations, et gère tout seul combien il en met et où.
    Avec set_xtickslabel, tu vas pouvoir en effet gérer l'intitulé des labels. Mais tu veux en réalité plus que cela. Tu veux aussi pouvoir gérer leur nombre (et leur posiiton).
    La fonction set_xticks te permet cela.

    https://matplotlib.org/3.1.1/api/_as....pyplot.xticks

  3. #3
    Membre confirmé
    Homme Profil pro
    Éternel universitaire
    Inscrit en
    Avril 2012
    Messages
    421
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Éternel universitaire

    Informations forums :
    Inscription : Avril 2012
    Messages : 421
    Points : 639
    Points
    639
    Par défaut
    En fait je suis très heureux avec la position des xticks, ce sont les xticklabels qui m'embêtent.
    Solution que j'ai trouvé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    from datetime import datetime as dt
    for i in ax7.get_xticks():
        xTicksNames.append(dt.strftime(dt.fromordinal(int(i)),'%Y %m %d'))
    ax7.set_xticklabels(xTicksNames,rotation=30,horizontalalignment='center')
    Ça fait le boulot dans mon cas précis, mais ça ne fonctionnerait pas si je veux faire figurer les heures (fromordinal n'accepte que des int en entrée).


    Merci !

  4. #4
    Membre émérite

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Points : 2 328
    Points
    2 328
    Par défaut
    Citation Envoyé par thecrazydonut Voir le message
    Ça fait le boulot dans mon cas précis, mais ça ne fonctionnerait pas si je veux faire figurer les heures (fromordinal n'accepte que des int en entrée).
    Si si, on peut toujours ! Mais dans ce cas il faut faire une petite indirection. Soit vous utiliser fromtimestamp qui lui accepte les floats, en prenant soin de soustraire ce qu'il faut pour gérer la différence entre timestamp et ordinal
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dt.strftime(datetime.datetime.fromtimestamp(734212.369),'%Y %m %d, %H:%M:%S')
    qui donne '1970 01 09, 12:56:52'Soit vous coder votre propre fonction def my_fromordinal(x): qui fera un from_ordinal sur la partie entière de l'argument x, puis multipliera la partie décimale par 24 pour obtenir le nombre d'heure, puis par 60 la partie décimale à nouveau restant pour obtenir le nombre de minutes, et ainsi de suite jusqu'au secondes (ou jusqu'au niveau souhaité).

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

Discussions similaires

  1. Quel SGBD correspond aux fichiers à extension .DAT
    Par jcpitaud dans le forum Autres SGBD
    Réponses: 4
    Dernier message: 12/04/2006, 20h11
  2. Correspondance de types lors d'un SELECT
    Par Alain Dionne dans le forum ASP
    Réponses: 5
    Dernier message: 18/05/2004, 20h54
  3. [debutant] correspondance JAVA C++ pour pointeur de fonction
    Par davidoff_tls dans le forum Langage
    Réponses: 7
    Dernier message: 15/04/2004, 09h13
  4. Récupérer le nom du fichier spool correspondant à un job
    Par chtiot dans le forum API, COM et SDKs
    Réponses: 3
    Dernier message: 23/02/2004, 20h28

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