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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 : 5526
Taille : 31,7 Ko

    Et voici le code qui le génère :
    Nom : Capture2.PNG
Affichages : 4348
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 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    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 : 37
    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 : 4469
Taille : 24,8 Ko

  5. #5
    Expert confirmé

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    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 : 37
    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 : 4700
Taille : 40,4 Ko

    ou encore ici:

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

    En utilisant ListedColormap

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

  7. #7
    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 !

  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
    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 !

  9. #9
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 754
    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 754
    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

Discussions similaires

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

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