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 :

MatPotLib : afficher courbes de couleurs différentes selon attirbuts


Sujet :

Python

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 7
    Par défaut MatPotLib : afficher courbes de couleurs différentes selon attirbuts
    Bonjour à tous !

    Je suis nouveau, aussi bien sur le forum qu'en langage Python, donc excusez moi par avance si je ne poste pas au bon endroit ou si mon message n'est pas des plus clairs...

    Le problème que je rencontre est le suivant :
    Je code un programme qui traite des données issues de GPS. Je souhaite afficher sur un graphique le tracé d'une randonnée (qui se base sur la longitude et latitude des points GPS), et, surtout,
    colorer d'une couleurs différentes des parties du tracé en fonction de leur vitesse.

    Le tracé est composé de 4 segments, et je dispose de la vitesse de chaque segment. Je parviens à les afficher ensemble sur un même graphique et à la colorer différemment, mais cette couleur est définie manuellement et n'est pas dépendante de leur vitesse.

    Pour plus de clarté :

    Voici le graphe que j'obtiens :

    Nom : Capture.PNG
Affichages : 5588
Taille : 31,7 Ko

    Et voici le code qui le génère :
    Nom : Capture2.PNG
Affichages : 4406
Taille : 2,8 Ko

    Les Seg.lstLat et .lstLon faisant référence aux latitudes et longitudes des points appartenant à des objets Segment codés en amont, et qui servent donc d'abscisses et d'ordonnées au graphe.
    Pour chacun de ces segments (qui ont une vitesse pour attribut), je voudrais obtenir une couleur dépendant de cette vitesse (par exemple : en rouge les segments à plus de 3km/h, en jaune, ceux entre 2.5 et 3, en vert ceux à moins de 2.5, etc...)
    J'ai fais plusieurs tentatives à base de if, mais rien de concluant...Je me dis que la bibliothèque matpotlib dispose peut-être de fonctions plus adaptées à mon besoin, mais je ne trouve pas lesquelles....

    Voilà, navré si c'est un peu long ou confus, n'hésitez pas à demander des précisions si jamais.

    Bonne soirée et merci par avance !

  2. #2
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 308
    Par défaut
    Salut,

    Les coordonnées sont accompagnées d'un timestamp et certains GPS (tous ?) te font aussi le calcul de la vitesse par rapport au point précédent.

    ex.:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <trkpt lat="50.822953398" lon="4.392633811">
      <ele>202.417191</ele>
      <time>2014-09-17T12:58:05Z</time>     # Time stamp
      <course>260.627869</course>
      <speed>0.724588</speed>               # vitesse
      <name>TP000023</name>
      <fix>3d</fix>
      <sat>4</sat>
      <hdop>3.210000</hdop>
    </trkpt>
    Donc soit avec le premier et le dernier timestamp tu calcules la vitesse moyenne, soit tu fait la moyenne des vitesses de tous les points.

    La deuxième solution me paraît plus simple parce que dans le premier cas tu devras aussi calculer la distance réelle.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 7
    Par défaut
    Salut,

    Merci de ta réponse ! Néanmoins, je me rend compte que je me suis peut être mal exprimé : j'ai déjà calculé les vitesses moyennes pour chaque segment (qui passe par un calcul de la distance réelle : en fait il s'agit d'un exercice universitaire, donc je n'ai pas trop eu le choix de ce côté là...^^). Mon souci est plutôt pour faire en sorte que chaque segment s'affiche d'une couleur différente en fonction de sa vitesse, sur un même graphique (matpotlib ou autre...)

    Mais merci quand même !

  4. #4
    Membre chevronné
    Homme Profil pro
    Développeur banc de test
    Inscrit en
    Mai 2014
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur banc de test
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2014
    Messages : 199
    Par défaut
    Bonjour,

    Très intéressant comme projet, je suis curieux de connaître le module GPS utilisé, ou est-ce pour une téléphone ?

    Au plus simple, je ne sais pas si vous créez vous-même les couleurs mais il existe des profils / colormap :
    http://matplotlib.org/users/colormaps.html

    Il est ensuite possible de définir dans un graphique l'indice de couleur en fonction d'un tableau, un bon exemple ici :
    http://stackoverflow.com/questions/3...-in-streamplot

    J'ai essayé rapidement mais il me manque quelques points pour que ça fonctionne bien et pouvoir déterminer une échelle +/- et un offset :

    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
    import numpy as np
    import matplotlib as mpl
    import matplotlib.pyplot as plt
    from matplotlib.colors import Normalize
    from matplotlib.cm import ScalarMappable
     
    x = np.linspace(0, 1 * np.pi)
    y = np.sin(x * np.pi) + 1
    colormap = plt.get_cmap("Reds")
    #colors = colormap(np.sin(x * np.pi))
     
    cmap_reds = plt.get_cmap('Reds')
    cmap_y = cmap_reds(np.sin(x * np.pi))
    # y_cnorm  = Normalize(vmin=y.min(), vmax=y.max())
    # y_scalarmap = ScalarMappable(norm=y_cnorm, cmap=cmap_reds)
     
    fig, ax = plt.subplots()
    ax.scatter(x, y, c=cmap_y, cmap=cmap_reds)
     
    plt.savefig("test.png")
    plt.show()
    Nom : test.png
Affichages : 4529
Taille : 24,8 Ko

  5. #5
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 308
    Par défaut
    Et bien, où est le problème alors ?

    pseudo-code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    if speed < 2.5:
        color = "y-"
    elif speed < 3:
        color = "r-"
     
    etc
    C'est parce que tu traces toutes les courbes en une fois ?

    Alors tu utilises color1, color2, etc

  6. #6
    Membre chevronné
    Homme Profil pro
    Développeur banc de test
    Inscrit en
    Mai 2014
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur banc de test
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2014
    Messages : 199
    Par défaut
    @VinsS: Je pense qu'il recherche à avoir un gradient automatique de couleur plutôt que de définir manuellement les couleurs des segments.

    J'ai trouvé une réponse qui correspond précisément à ce que tu souhaites faire :

    http://stackoverflow.com/questions/8...41474#25941474

    Nom : WFsDY.png
Affichages : 4759
Taille : 40,4 Ko

    ou encore ici:

    http://matplotlib.org/examples/pylab...ored_line.html

    En utilisant ListedColormap

    Nom : multicolored_line_00.png
Affichages : 4963
Taille : 18,7 Ko

  7. #7
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 790
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 790
    Par défaut
    Salut,

    Citation Envoyé par TomG31 Voir le message
    Mon souci est plutôt pour faire en sorte que chaque segment s'affiche d'une couleur différente en fonction de sa vitesse, sur un même graphique (matpotlib ou autre...)
    Si je comprends la question, écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    plt.plot(lon0, lat0, c0, lon1, lat1, c1, ...)
    n'est pas "paramétrable" (il faut la taper "à la main") mais on peut "calculer"/"construire" cette liste de paramètres sous la forme d'une liste:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    args = [ lon0, lat0, c0, lon1, lat1, c1, ... ]
    et appeler la fonction ainsi:
    note: mais vous pouvez aussi appeler plusieurs fois plt.plot:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    plt.plot(lon0, lat0, c0)
    plt.plot(lon1, lat1, c1)
    plt.plot(...)
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 7
    Par défaut
    Merci pour ces réponses rapides !

    YCL-1 --> En réalité, je ne suis pas sûr que ce programme aille plus loin que le stade exercice de programmation en python. L'idéal est d'arriver à une fenêtre tkinter qui permettrait de sélectionner un fichier .gpx (qui sont produits, me semble-t-il, par tout les gps ou application capable d'enregistrer une trace gps), et d'afficher diverses informations (en ce qui me concerne donc, colorer les différents segments en fonction de leur vitesse, mais d'autres étudiants ont d'autres thèmes, comme afficher le tracé en 3D, le positionner sur un fond de carte Open Street Map...). Ca se fait dans le cadre d'un M2 en SIG (Systèmes d'Information Géographique).

    Ta solution m'a l'air un brin complexe pour moi au premier abord, mais ça a l'air riche et intéressant, je vais m'y pencher, merci !

    VinsS --> Oui, le problème est effectivement de tracer toutes les courbes en une fois. Je n'avais pas réussi à gérer ça efficacement via une structure conditionnelle, mais je vois où tu veux en venir et je pense que ça peut marcher comme ça.
    Merci !

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 7
    Par défaut
    Je n'avais pas vu les deux dernières réponses !

    wiztricks --> Oui, je pense que tu as bien compris la question^^ Je vais voir pour la solution utilisant une liste args, ça me semble intéressant mais j'ai un peu de mal à voir comment je pourrais y assigner une couleur en fonction de la vitesse...

    YCL-1 --> Merci, les résultats obtenu dans tes exemples ont l'air de bien correspondre à ce que je cherche, je vais essayer de décrypter un peu le code qui s'y rapporte !

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 7
    Par défaut
    Je me permet de relancer un peu la discussion :

    Par rapport à vos propositions, j'ai produit le code suivant, qui se base sur un if pour déterminer la couleur de chaque segment, puis qui ajoute dans une liste l'ensemble des longitudes, des latitudes, et la couleur de chaque segment :

    Nom : Capture.PNG
Affichages : 5632
Taille : 48,2 Ko

    Je crée donc une liste "argument", qui dont servir d'argument pour le plot. Quand j'affiche cette liste (print(argument)), elle me paraît correspondre à ce que je veux. Elle se présente sous cette forme :

    [lstLon du Seg1, lstLat du Seg1, couleur du Seg1, lstLon du Seg2, lstLat du Seg2, couleur du Seg2...]et ainsi de suite pour tout les segments

    En pratique, c'est donc une liste de listes (avec une chaine de caractère qui est la couleur).

    Pour autant, lorsque je tente de passer ça en argument de mon plot, si je n'ai aucune erreur, j'ai en revanche un graphique entièrement vide...
    J'ai pas mal cherché, mais je n'arrive pas vraiment à voir où ça coince...Si jamais quelqu'un à une idée...

    Merci d'avance !

  11. #11
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 790
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 790
    Par défaut
    Salut,

    Citation Envoyé par TomG31 Voir le message
    Je crée donc une liste "argument", qui dont servir d'argument pour le plot. Quand j'affiche cette liste (print(argument)), elle me paraît correspondre à ce que je veux. Elle se présente sous cette forme :

    [lstLon du Seg1, lstLat du Seg1, couleur du Seg1, lstLon du Seg2, lstLat du Seg2, couleur du Seg2...]et ainsi de suite pour tout les segments

    En pratique, c'est donc une liste de listes (avec une chaine de caractère qui est la couleur).
    Lorsque vous écrivez:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> args = []
    >>> args.append([1, 2, 3])
    >>> args.append([1, 2, 3])
    >>> args
    [[1, 2, 3], [1, 2, 3]]
    effectivement, vous construisez une liste de listes (ici égales à la liste [1, 2, 3]).
    A priori, vous voulez une seule liste:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> args = []
    >>> args.extend([1, 2, 3])
    >>> args.extend([1, 2, 3])
    >>> args
    [1, 2, 3, 1, 2, 3]
    Citation Envoyé par TomG31 Voir le message
    Pour autant, lorsque je tente de passer ça en argument de mon plot, si je n'ai aucune erreur, j'ai en revanche un graphique entièrement vide...
    Vous devez appelez la fonction avec le contenu de cette liste en argument (et non la liste).
    C'est ce que traduit le '*' dans plt.plot(*args).

    Bizarre que çà ne retourne pas d'erreur.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  12. #12
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 308
    Par défaut
    Tes segments, tu les as déjà définis avec Seg, seg2, Seg3 et Seg4 donc si tu fais comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    for idx, seg in enumerate(Seg, seg2, Seg3, Seg4):
        color = 'r-'
        if TraceTest.lstVitesseSeg[idx] <= 2:
            color = 'b-'
        if TraceTest.lstVitesseSeg[idx] <= 2.5:
            color = 'g-'
        if TraceTest.lstVitesseSeg[idx] <= 3:
            color = 'y-'
        pp.plot(seg.lstLon, seg.lstLat, color)
    ça devrait aller mieux

    Edit: changé les noms des segments

  13. #13
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 7
    Par défaut
    En fait, ça retournait bien une erreur, mais comme il y avait mes print qui fonctionnaient ensuite (et que les listes affichées sont trèèèèès longues), je ne l'avais pas vue !

    Bon, bah...ça marche ! Merci beaucoup !!

    J'ai appelé ma fonction directement sur (lstLon,lstLat, color), au sein de la boucle ! Je ne sais pas très bien pourquoi ça marche, mais ça marche^^

    Si jamais ça intéresse du monde, le code donne ça :

    Nom : Capture.PNG
Affichages : 5072
Taille : 43,4 Ko

    Et le graphe obtenu donne ça :

    Nom : Capture2.PNG
Affichages : 4465
Taille : 31,2 Ko

    (rouge = plus de 3km/h, vert = plus de 2,5, bleu = moins de 2,5)

    Encore merci a tous pour votre aide !

  14. #14
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 7
    Par défaut
    Oui bah voilà VinS, c'est ce que j'ai fais au final ! Merci, tu avais la bonne solution !

Discussions similaires

  1. Attribuer couleurs différentes selon ressource
    Par Poye_ dans le forum VBA Project
    Réponses: 8
    Dernier message: 28/12/2016, 19h25
  2. Réponses: 8
    Dernier message: 26/09/2016, 19h54
  3. Afficher une courbe en couleur selon un paramètre
    Par Fiabulu dans le forum MATLAB
    Réponses: 9
    Dernier message: 10/11/2010, 17h23
  4. [PR-2007] Attribuer couleurs différentes selon ressource
    Par Poye_ dans le forum Project
    Réponses: 2
    Dernier message: 13/07/2010, 20h32
  5. Réponses: 2
    Dernier message: 07/06/2007, 17h07

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