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 :

Controle d'entrées de légende


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Curieux
    Inscrit en
    Avril 2020
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2020
    Messages : 114
    Par défaut Controle d'entrées de légende
    Bonjour,
    j'ai un souci mon code fonctionne ^^, mais je ne comprends pas la solution trouvée, obtenue par erreur.

    Je m'explique, je trace deux nuages de points et une droite avec matplotlib, jusque-là tout va bien. Mon souci commence avec le désir de changer l'ordre des entrées de la légende qui par défaut me met le 'plt.plot' en premier quel que soit l'ordre d'appel des tracés, contrairement au scatter, qui change en fonction de l'ordre d'appel.

    Bon je farfouille les docs de matplotlib, fait ma popote d'erreurs qui m'envoient ici : https://matplotlib.org/tutorials/int...legend-handles. À partir de là, je mets les tracés dans des variables t1, t2, t3 et en suivant ce que dit le tuto de la documentation j'écris :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    t1, =plt.plot(...)
    t2, =plt.scatter(...)
    t3, =plt.scatter(...)
     
    plt.legend([t2, t3, t1], ['Données up', 'Données down', 'Régression'])
    et la j'ai cette erreur "TypeError: cannot unpack non-iterable PathCollection object" qui point sur le label du t2. En gros je crois qu'il n'est pas d'accord avec ce que je lui demande.

    puis je fini par lui dire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    t1, =plt.plot(...)
    t2 =plt.scatter(...)
    t3 =plt.scatter(...)
     
    plt.legend([t2, t3, t, ['Donnéeses up', 'Données down', 'Régression'])
    et la, ba ça marche... Quand il n'y a que des plt.plot ou plt.scatter, l'ordre des appels des tracés donne l'ordre des entrées de la légende mais quand on mélange les deux....

    Pourquoi dois-je mettre une "," qu'au niveau du plt.plot et pas au niveau des plt.scatter. Sauf erreur de ma part je n'ai pas dans les docs me permettant de comprendre cela.

    La syntaxe fonction mais est-ce une erreur qui fonctionne ou est-ce la solution ?

    merci

  2. #2
    Membre Expert

    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
    Par défaut
    Indice 1 :

    doc de plt.plot :

    Returns:

    lines - A list of Line2D objects representing the plotted data.
    doc de plt.scatter :

    Returns:

    paths - PathCollection
    Indice 2 :

    On peut tracer plusieurs courbes avec 1 seule instruction plot.

    Indice 3 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    une_liste = [1]
    i, = une_liste
    print(i)

  3. #3
    Membre confirmé
    Homme Profil pro
    Curieux
    Inscrit en
    Avril 2020
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2020
    Messages : 114
    Par défaut
    Bonjour IG_53,

    alors si je comprends bien, c'est que plot.scatter ne retourne pas une liste mais que plt.plot oui.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    t1 =plt.plot(...)
    t2 =plt.scatter(...)
    t3 =plt.scatter(...)
     
    print(type(t2))
    print(type(t1))
    Effectivement car le retour est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <class 'matplotlib.collections.PathCollection'>
    <class 'list'>
    alors que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    t1, =plt.plot(...)
    t2 =plt.scatter(...)
    t3 =plt.scatter(...)
     
    print(type(t2))
    print(type(t1))
    retourne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <class 'matplotlib.collections.PathCollection'>
    <class 'matplotlib.lines.Line2D'>
    Donc dans "plt.legend([t1,t3,t1],['..','...','.'])" les variables t1,t2 et t3 ne doivent pas être des listes. Je vois bien que dans l'indice 2

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    une_liste = [1, 2, 3]
    i = une_liste
     
    print(i)
     
    une_liste = [1]
    i, = une_liste
     
    printprintprint(i)
    La premiere sortie retourne la liste [1,2,3] alors que le i, retourne la valeur unique dans la liste, elle retourne 1. Effectivement je ne comprenais pas ce que faisait cette association (i, =), quel est son nom que je me renseigne car à mon niveau je ne l'ai pas encore vue dans mes lectures.

    Bon je suis loin de tout avoir compris, mais j'en perçois un peu plus.

    Merci

  4. #4
    Membre Expert

    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
    Par défaut
    C'est lié à l'unpacking. Voici un peu de lecture là dessus
    http://sametmax.com/quest-ce-que-lun...-quoi-ca-sert/
    et google t'en proposeras aussi plein d'autre avec ce mot clé.

    De manière général, l'unpacking te permet la chose suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    uneliste = [1,2,3]
    a,b,c = uneliste
    print(a)
    print(b)
    print(c)
    et c'est valable pour une liste de longueur quelconque, suffit de bien mettre le bon nombre de variable à gauche du signe =.


    NB1 : Il y a une fonctionalités, si tu ne veux pas de tous les termes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    uneliste = [1,2,3]
    a,_ = uneliste
    print(a)
    NB2 : Quand on fait de l'unpacking sur une liste à un seul élément, effectivement on peut passer à côté, car la seule différence c'est cette petite virgule.

  5. #5
    Membre confirmé
    Homme Profil pro
    Curieux
    Inscrit en
    Avril 2020
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2020
    Messages : 114
    Par défaut
    Super,

    je vais aller regarder cela, pour le coup je vois un peu l'utilité de l'unpacking.
    Par contre pour la fonctionnalité je regarde aussi dans le lien que tu m'as envoyé, car
    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
    >>> uneliste = [1,2,3]
    >>> a,_ = uneliste
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    ValueError: too many values to unpack (expected 2)
    >>> a,b,_ = uneliste
    >>> print(a)
    1
    >>> print(b)
    2
    >>> print(c)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    NameError: name 'c' is not defined
    >>>
    ou ailleurs pour tenter de comprendre. Laisse moi essayer de comprendre cette fonctionnalité aussi je tenterais d'expliqué ce retour.

    Merci

  6. #6
    Membre Expert

    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
    Par défaut
    Oui autant pour moi, j'ai tapé le code un peu vite : il faut quand même autant de _ que de termes ignorés.

    Donc par exemple dans une liste à 4 éléments, si seul le premier et le dernier termes t'intéressent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    uneliste = [1,2,3,4]
    a,_,_,b = uneliste

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

Discussions similaires

  1. Controle croisé entre 2 feuilles
    Par Excel_man dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 15/01/2013, 09h53
  2. Réponses: 2
    Dernier message: 17/03/2011, 14h13
  3. Réponses: 2
    Dernier message: 15/04/2010, 17h47
  4. [legend] Ajouter une entrée à une légende
    Par jijiz dans le forum MATLAB
    Réponses: 11
    Dernier message: 13/08/2008, 15h10
  5. Réponses: 1
    Dernier message: 11/08/2008, 22h15

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