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 :

Tracé de graphiques 3D


Sujet :

Python

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    etudiant
    Inscrit en
    Mars 2021
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : etudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2021
    Messages : 44
    Points : 27
    Points
    27
    Par défaut Tracé de graphiques 3D
    Bonjour à tous!

    j'ai avec moi plusieurs fichiers de données comportant des altitudes 'alt' pour lesquelles on a des valeurs de mesures 'Diff' :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    13.151 .0000001717736
    13.250 .0000001581861
    13.346 0
    13.451 0
    13.551 .0000001349428

    Le nom des fichiers correspond à la date de mesure, et je veux utiliser ces dates en abscisse d'un graphique, avec les altitudes en ordonnée.
    Jusque là j'y arrive bien. Voici mon code :


    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
     
    import matplotlib.pyplot as plt
    import numpy as np
    import glob
     
    tabTime = np.zeros(0)
    tabAlt = np.zeros(0)
    tabDiff = np.zeros(0)
     
    ext="Diff_*"
    for files in sorted(glob.glob(ext),reverse=False):
        filename=(files[5:12])
     
     
        data = np.loadtxt(files)
        alt = data[:,0]   #données altitude
        diff = data[:,1]  #données difference
     
        NumberOfLine = len(alt)     #nombre de ligne
        tabAlt = np.append(tabAlt,alt)  
        tabDiff = np.append(tabDiff, diff)
     
     
     
        for i in range(len(alt)):
            tabTime = np.append(tabTime,filename)  # remplissage tableau Time avec la date des fichiers
     
        plt.plot(tabTime, tabAlt,'+')

    Ensuite j'aimerais représenter les valeurs de mesures 'Diff' en utilisant une colorbar (j'ai regardé la fonction ' pcolormesh '). Donc à chaque altitude, la couleur des points varierait en fonction des valeurs de 'Diff'.
    Mais j'ai l'impression que pour créer ce type de graphique, il faut absolument que la troisième 'variable' affichée soit calculé en fonction des deux autres... Ce qui n'est pas le cas pour mes valeurs.

    Est-ce que vous savez comment utiliser ce type de graphique dans mon cas ?

    Merci à vous!

  2. #2
    Membre éprouvé

    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    654
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2010
    Messages : 654
    Points : 1 150
    Points
    1 150
    Par défaut
    Salut,

    Voici un exemple reprenant ton code et les quelques données proposées :
    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
    data = np.array([
        [13.151, 0.0000001717736],
        [13.250, 0.0000001581861],
        [13.346, 0.0],
        [13.451, 0.0],
        [13.551, 0.0000001349428],
    ])
     
     
    tabTime = np.zeros(0)
    tabAlt = np.zeros(0)
    tabDiff = np.zeros(0)
     
    alt = data[:, 0]   #données altitude
    diff = data[:, 1]  #données difference
     
    NumberOfLine = len(alt)     #nombre de ligne
    tabAlt = np.append(tabAlt, alt)  
    tabDiff = np.append(tabDiff, diff)
     
    for i in range(len(alt)):
        # Date fictive
        dummy_date = "23-04-2021"
        tabTime = np.append(tabTime, dummy_date)  # remplissage tableau Time avec la date des fichiers
     
    plt.scatter(tabTime, tabAlt, marker='+', c=tabDiff)
    plt.colorbar()
    plt.show()
    L'astuce est de founir en argument de couleur du graph la liste des différences tabDiff.

    Je note quelques points qui devraient être revus à mon sens :
    • Il y a autant de tracés que de fichiers. C'est peut être voulu. Intuitivement je n'en ferais qu'un, et donc sortirais la création de la figure de la boucle de lecture des fichiers. Dans l'exemple que tu fournis, a chaque boucle un nouveau graph se créé avec de nouvelles données en plus. Seul le dernier, affichant toutes les données, a du sens je pense.
    • La gestion des dates n'est pas claire. J'en déduis que la date est une chaine de caractères. Visiblement matplotlib s'en fiche un peu, mais sauf erreur de ma part quelque soit l'intervalle de temps entre deux dates, l'espacement des points dans le graph sera identique. Pour matplotlib, ce n'est pas vraiment une date, mais un label. Tu pourrais transformer cette chaine de caractères en objet datetime et ainsi permettre à matplotib de ranger dans l'ordre les points avec un espacement qui a du sens.


    Ju

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    etudiant
    Inscrit en
    Mars 2021
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : etudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2021
    Messages : 44
    Points : 27
    Points
    27
    Par défaut
    Salut!
    Merci beaucoup l'astuce a parfaitement marché!

    J'ai sorti la figure de la boucle pour n'afficher que le dernier tracé contenant toutes les données. Voici mon code :

    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
    42
     
     
    import matplotlib.pyplot as plt
    import numpy as np
    import glob
    from datetime import datetime
     
    tabTime = np.zeros(0)
    tabAlt = np.zeros(0)
    tabDiff= np.zeros(0)
     
     
     
    ext="Diff_*"
    for files in sorted(glob.glob(ext),reverse=False):
        print(files) 
        filename=(files[5:12])
        print(filename)
     
     
     
        data = np.loadtxt(files)
        alt = data[:,0]  
        diff = data[:,1]
        NumberOfLine = len(alt)
        tabAlt = np.append(tabAlt,alt)
        tabDiff = np.append(tabDiff, diff)
     
     
        a = datetime.strptime(filename, "%y%m%d")
     
        for i in range(len(alt)):
            tabTime = np.append(tabTime,a)
            #tabTime = np.append(tabTime,filename)
     
        #tabTime, tabAlt = np.meshgrid(tabTime, tabAlt)
        #plt.pcolormesh(X)
    #tabTime, tabAlt = np.meshgrid(tabTime, tabAlt)
    plt.xticks(rotation = 'vertical')   
    plt.scatter(tabTime, tabAlt, marker='+', c=tabDiff)    
    plt.colorbar()
    plt.show()

    Concernant la date, en effet il s'agit ici d'une chaîne de caractère extraite à partir du nom de fichier, donc l'espacement entre les tracés est le même. J'ai utilisé datetime, mais j'ai juste un petit soucis au niveau des limites de l'axe temps :


    Nom : index.png
Affichages : 190
Taille : 14,2 Ko
    Images attachées Images attachées  

  4. #4
    Membre éprouvé

    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    654
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2010
    Messages : 654
    Points : 1 150
    Points
    1 150
    Par défaut
    Le soucis est le zoom ? Dans ce cas il faut regarder du côté de xlim() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    plt.xlim((
        datetime.strptime('22-04-2021', '%d-%m-%Y'),
        datetime.strptime('26-04-2021', '%d-%m-%Y'),
        ))

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    etudiant
    Inscrit en
    Mars 2021
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : etudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2021
    Messages : 44
    Points : 27
    Points
    27
    Par défaut
    Merci Julien, xlim a bien fonctionné, mais l'affichage des valeurs de 'x' ne semble pas fixe :

    Voici les dates que j'ai :

    08 08 05

    08 08 13

    08 08 21

    08 08 27

    Mais le graphique ne m'affiche pas les dates exactes ( il créé un décalage avec les dates) :

    Nom : Difference.png
Affichages : 164
Taille : 15,9 Ko


    J'ai utilisé ce code là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    plt.xlim((
        datetime.strptime("2008-08-04", "%Y-%m-%d"),
        datetime.strptime("2008-08-28", "%Y-%m-%d"),
        ))

  6. #6
    Membre éprouvé

    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    654
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2010
    Messages : 654
    Points : 1 150
    Points
    1 150
    Par défaut
    Salut,

    Au vu des dates et du graphique, je cois que tout est juste. Je ne vois pas de décalage. La première barre a l'air située au 4 aout, et la dernière au 27. En zoomant à la main dans la fenêtre matplotlib cela devrait être plus visible. Le rendu ne correspond peut-être pas à ce que tu souhaites cela dit, mais le problème semble être autre. Est-ce que ce ne serait pas les petits "traits" de la barre des abscisses (les "ticks") qui ne sont pas alignés avec les points ? Si c'est cela, alors il y a plusieurs moyens de faire ça :
    • Forcer à mettre des "ticks" tous les jours
    • Placer uniquement les "ticks" pour les dates où l'on a des données


    Ju

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    etudiant
    Inscrit en
    Mars 2021
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : etudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2021
    Messages : 44
    Points : 27
    Points
    27
    Par défaut
    Salut Julien,

    Oui mon problème est bien lié au fait que les ticks ne sont pas alignés avec mes points.
    Je ne peux pas mettre les ticks à la main car il y a plusieurs milliers de fichiers au total à traiter, donc il faudrait que j'automatise ça. Je regarde comment mettre les ticks uniquement pour les jours où il y a des données.

    Merci!

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

Discussions similaires

  1. Tracé graphiques avec GNUPlot et Crontab
    Par Robotzwarrior dans le forum Général Python
    Réponses: 2
    Dernier message: 12/03/2015, 17h45
  2. Graphique avec Turbo Pascal 7
    Par Sagiro dans le forum Turbo Pascal
    Réponses: 3
    Dernier message: 21/12/2004, 09h52
  3. [Free Pascal] Graphique avec Dev-Pascal
    Par CompuTux dans le forum Free Pascal
    Réponses: 15
    Dernier message: 03/09/2004, 02h15
  4. Caractéristique des Graphiques avec Tchart
    Par bidson dans le forum XMLRAD
    Réponses: 5
    Dernier message: 19/01/2004, 11h01
  5. faire des graphiques avec Perl
    Par And_the_problem_is dans le forum Modules
    Réponses: 2
    Dernier message: 16/07/2003, 16h08

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