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 :

matplotlib changer la couleur du plot suivant la valeur


Sujet :

Python

  1. #1
    Membre actif
    Homme Profil pro
    Touche à tout
    Inscrit en
    Mars 2009
    Messages
    120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Touche à tout

    Informations forums :
    Inscription : Mars 2009
    Messages : 120
    Par défaut matplotlib changer la couleur du plot suivant la valeur
    Bonjour,

    Pour un simple graphe avec +/- 9000 datas dans une liste, ajoutés par plt.plot(cpm_datas, color = 'green').
    est-il possible d'avoir une couleur différente selon la plage ?
    par exemple
    <= 50 green
    <100 yellow
    etc

    Et question annexe, peut-on utiliser des couleurs via RGB ou autre ?

    Merci !

  2. #2
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut
    Sans doute que oui à la première question et oui sûr à la deuxième : tu as cherché dans un moteur de recherche ?

  3. #3
    Membre actif
    Homme Profil pro
    Touche à tout
    Inscrit en
    Mars 2009
    Messages
    120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Touche à tout

    Informations forums :
    Inscription : Mars 2009
    Messages : 120
    Par défaut
    Bonjour,

    Je n'avais pas vu ta réponse.
    Oui, j'ai un peu cherché et regardé la documentation. Mais c'est vraiment complexe pour moi qui ne comprend que l'anglais très basique (pour ne pas dire BASIC, le langage avec lequel j'ai démarré fin des années 70). J'apprends Python un peu à la fois et au fur et à mesure de mes besoins. C'est un langage assez chouette

    Je dois dire que je n'ai pas trop approfondi car c'est assez secondaire pour le moment, et que j'espère rester dans la plage verte tout ma vie, car c'est pour un compteur Geiger

    Pour le . 1, j'avais vu comment changer segment par segment. je suppose qu'en approfondissant et avec quelques conditions il doit y avoir moyen
    Pour le . 2, comme il dépend du . 1 j'avoue ne pas avoir cherché. Un peu fainéant

    Voilà.

    Par contre, je vais ouvrir une autre discussion pour dates (jour et heures) en abscisses

  4. #4
    Membre émérite

    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    661
    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 : 661
    Par défaut
    Salut,

    Je t'invite à jeter un œil aux exemples fournis sur le site de matplotlib. Tu y trouve les cas de figure les plus courants, dont un exemple sur une ligne multi couleur.

    N'ayant jamais eu à traiter ce cas, je m'y suis penché par curiosité. Apparemment, l'astuce consiste à définir une ligne par segments et assigner une couleur à chaque segment. L'ensemble de ces segments sont définis comme une "collection" et non comme une multitude de petites lignes. Voici un bout de code basé sur l'exemple du site et qui trace y=x² avec des portions de différentes couleurs. A noter, j'ai employé le nom abrégé des couleurs, mais rien n'interdit de les définir à l'aide d'un code RGB. La section définissant les couleurs pourrait être encapsulée dans une fonction pour faire plus propre.

    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
    import numpy as np
    import matplotlib.pyplot as plt
    from matplotlib.collections import LineCollection
     
    # Données
    x = np.linspace(0, 10, 500)
    y = x**2
     
    # Création de segments 
    points = np.array([x, y]).T.reshape(-1, 1, 2)
    segments = np.concatenate([points[:-1], points[1:]], axis=1)
     
    # Colormap. Attention, il y n points (n valeurs de y), mais n-1 segments
    # Je suppose ici, pour l'exercice que c'est la valeur moyenne entre les deux
    # points du segment qui défini la couleur
    colors = list()
    for y1, y2 in zip(y[:-1], y[1:]):
        val = 0.5 * (y1 + y2)
        if val <= 10:
            colors.append('g')
        elif val < 50:
            colors.append('y')
        else:
            colors.append('r')
     
    lc = LineCollection(segments, colors=colors)
     
    fig, ax = plt.subplots()
    ax.add_collection(lc)
     
    ax.autoscale()  # sans cela, ou autre set_xlim(), la figure s'affiche sur 0-1
    plt.show()
    J

  5. #5
    Membre actif
    Homme Profil pro
    Touche à tout
    Inscrit en
    Mars 2009
    Messages
    120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Touche à tout

    Informations forums :
    Inscription : Mars 2009
    Messages : 120
    Par défaut
    Merci Julien.

    Je ne comprends pas tout le code, mais je vois que c'est ce que je cherchais.
    Je vais donc étudier cela.
    Merci encore !

  6. #6
    Membre actif
    Homme Profil pro
    Touche à tout
    Inscrit en
    Mars 2009
    Messages
    120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Touche à tout

    Informations forums :
    Inscription : Mars 2009
    Messages : 120
    Par défaut
    Re bonjour,

    Je me suis d'abord acharné (et j'ai ch..) à produire un graphe (visible en direct ici) correspondant à mes besoins.
    J'ai réussi « l'exploit » de n'utiliser que le « plot » de pyplot :
    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
     
    def faire_graphe():
        plt.margins(0) # met les marges à zéro
        plt.figure(figsize=(9,3)) # dimensionne le graphique
        plt.gca().xaxis.set_major_formatter(mdates.DateFormatter("%a %H:00"))
        # normalement du style " lun 09:00 ", mais n'est pas dans le format local
        plt.plot(cpm_dhms, cpm_datas, c='#707070',lw=0.15) # les données, avec les dates (en secondes) en X 
        # c = color (ici un gris un foncé), lw = lineweight (épaisseur du trait 0.15 étant assez fin, mais pas trop)
        plt.plot(cpm_dhms, cpm_mm, c='#276B2F')
        # la moyenne mobile, avec les dates (en secondes) en X, en reprenant la couleur verte du guide de sécurité plus bas dans la page WEB
        plt.ylabel('CPM') # l'étiquette des Y
        plt.gcf().autofmt_xdate() # positionnement automatique des dates/heures (en fait, 45°)
        plt.box(False) #retire les lignes autour du graphique
        plt.grid() # affiche la grille
        plt.savefig(dossier_ram + "cpm_25.png", bbox_inches = 'tight') # sauvegarde sans marges
        # NB : pour le Rpi, le dossier RAM épargne la carte µSD
        plt.close('all') # libère la mémoire
        transfertFTP(dossier_ram + "cpm_25.png") # transfère le fichier dans mon espace web
        os.remove(dossier_ram + "cpm_25.png") # supprime le fichier source
    Et, maintenant que cela fonctionne, reste plus qu'à ajouter les couleurs sur la moyenne mobile.
    Pour tester et comme j'espère ne jamais voir une valeur > 50, j'imagine mettre en rouge tout ce qui est au-dessus de la moyenne pure. (généralement 22.2)
    Alors, ma difficulté avec les exemples est qu'ils utilisent numpy que je ne connais pas. Ok pour la génération de données, mais et même en recherchant dans le WEB, je ne comprends pas la création de segments.
    Je crois que c'est adaptable à mon code sans trop le bouleverser, mais il faudra qu'on m'explique.

    Bien à vous

Discussions similaires

  1. [Débutant] Changer la couleur du texte pour certaines valeurs du PropertyGrid
    Par BasicZX81 dans le forum VB.NET
    Réponses: 14
    Dernier message: 13/01/2022, 18h14
  2. [XL-2010] [VSTO] changer la couleur suivant la valeur
    Par bellak dans le forum Conception
    Réponses: 1
    Dernier message: 23/07/2011, 16h20
  3. [AC-2002] couleur du texte suivant sa valeur dans un état
    Par special-k dans le forum IHM
    Réponses: 2
    Dernier message: 28/09/2010, 17h33
  4. Réponses: 2
    Dernier message: 29/07/2010, 20h51
  5. [MatplotLib] Changer la couleur des barres d'erreurs
    Par Kaeguri dans le forum Calcul scientifique
    Réponses: 1
    Dernier message: 28/03/2008, 14h57

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