2017-06-12 2 views
5

J'ai créé un nuage de points avec 3 couleurs différentes et je veux faire correspondre la couleur du symbole et du texte dans la légende.matplotlib: faire correspondre la couleur du texte de la légende avec le symbole dans le nuage de points

Une belle solution existe pour le cas des parcelles de ligne:

leg = ax.legend() 

# change the font colors to match the line colors: 
for line,text in zip(leg.get_lines(), leg.get_texts()): 
    text.set_color(line.get_color()) 

Cependant, les couleurs de courbe de dispersion ne sont pas accessibles par get_lines() .Pour le cas de 3 couleurs, je pense que je peux définir manuellement les couleurs de texte de un par-un en utilisant par exemple. text.set_color('r'). Mais j'étais curieux de savoir si cela peut être fait automatiquement en lignes. Merci!

+0

Que diriez-vous 'get_children' ou 'get_patches'? Pourriez-vous fournir un exemple de travail minimum? Vous voudrez peut-être regarder dans les méthodes de légende pour d'autres idées: https://matplotlib.org/1.3.0/api/legend_api.html –

+0

@AleksanderLidtke Merci pour les suggestions! J'ai essayé 'leg.get_patches()' avant et rien ne revient. J'ai juste essayé 'leg.get_children()' et il retourne les objets 'matplotlib.offsetbox.VPacker' et' matplotlib.patches.FancyBboxPatch', dont aucun n'a la propriété 'get_color()'. Le lien de la solution a un exemple de travail pour les lignes, désolé avec des diagrammes de dispersion je n'ai qu'un exemple non-travail ... – Phyinmi

+0

un exemple non-travail est bien. S'il vous plaît, faites juste un exemple simple qui montre comment vous créez les diagrammes de dispersion et la légende. Si cela ne fonctionne pas, dites simplement quelles erreurs vous obtenez. –

Répondre

0

Cela semble compliqué mais ne vous donne ce que vous voulez. Les suggestions sont les bienvenues. J'utilise ax.get_legend_handles_labels() pour obtenir les marqueurs et utiliser tuple(handle.get_facecolor()[0]) pour obtenir le tuple couleur matplotlib. Fait un exemple avec un diagramme de dispersion très simple comme ceci:

Edit:

Comme ImportanceOfBeingErnest a souligné dans son answer:

  1. leg.legendHandles retournera la légende poignées;
  2. La liste, au lieu de tuple, peut être utilisée pour affecter la couleur matplotlib.

Les codes sont simplifiées:

import matplotlib.pyplot as plt 
from numpy.random import rand 


fig, ax = plt.subplots() 
for color in ['red', 'green', 'blue']: 
    x, y = rand(2, 10) 
    ax.scatter(x, y, c=color, label=color) 

leg = ax.legend() 
for handle, text in zip(leg.legendHandles, leg.get_texts()): 
    text.set_color(handle.get_facecolor()[0]) 

plt.show() 

Ce que je suis est: enter image description here

4

Les diagrammes de dispersion ont une facecolor et un edgecolor. Le gestionnaire de légende pour un nuage de points est un PathCollection.

vous pouvez donc en boucle sur les poignées de légende et définir la couleur du texte à l'facecolor de la légende gérer

for h, t in zip(leg.legendHandles, leg.get_texts()): 
    t.set_color(h.get_facecolor()[0]) 

Code complet:

import matplotlib.pyplot as plt 
import numpy as np 

fig, ax = plt.subplots() 
for i in range(3): 
    x,y = np.random.rand(2, 20) 
    ax.scatter(x, y, label="Label {}".format(i)) 

leg = ax.legend() 

for h, t in zip(leg.legendHandles, leg.get_texts()): 
    t.set_color(h.get_facecolor()[0]) 

plt.show() 

enter image description here

+0

Merci d'avoir mentionné 'legendHandles'! D'une manière ou d'une autre je ne l'ai pas trouvé dans le document, bien qu'il semble donner les mêmes résultats que 'get_legend_handles_labels()' – Phyinmi

+0

Merci d'avoir montré 'leg.legendHandles' et de colorer comme' list'. Appris beaucoup! –

+1

'legend.legendHandles' est la liste des descripteurs qui se trouvent dans la légende, alors que' ax.get_legend_handles_labels() 'renvoie la liste des descripteurs et des étiquettes qui pourraient être dans la légende.Ainsi, la différence serait visible si l'on excluait tous les artistes de la légende ou en mettant dans la légende des artistes qui ne font pas partie de l'intrigue. – ImportanceOfBeingErnest