2017-06-12 6 views
5

Ich habe ein Streudiagramm mit 3 verschiedenen Farben erstellt und möchte die Farbe des Symbols und den Text in der Legende übereinstimmen.matplotlib: Übereinstimmung Legend Textfarbe mit Symbol in Streudiagramm

Ein schöner solution gibt es für den Fall der Liniendiagramme:

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()) 

jedoch Streudiagramm Farben nicht durch get_lines() .Für den Fall von 3 Farben ich glaube, ich manuell den Text zugegriffen werden kann Farben festlegen können ein- by-one mit z. text.set_color('r'). Aber ich war neugierig, ob das automatisch als Zeilen gemacht werden kann. Vielen Dank!

+0

Wie wäre es 'get_children' oder 'get_patches'? Können Sie ein funktionierendes Beispiel angeben? Vielleicht möchten Sie in die Legenden-Methoden für andere Ideen schauen: https://matplotlib.org/1.3.0/api/legend_api.html –

+0

@AleksanderLidtke Danke für die Vorschläge! Ich habe 'leg.get_patches()' vorher versucht und nichts kehrt zurück. Ich habe gerade 'leg.get_children()' versucht und es gibt 'matplotlib.offsetbox.VPacker' und' matplotlib.patches.FancyBboxPatch' Objekte zurück, von denen keines die Eigenschaft 'get_color()' hat. Der Lösungslink hat ein Arbeitsbeispiel für Linien, sorry mit Streudiagrammen Ich habe nur ein nicht funktionierendes Beispiel ... – Phyinmi

+0

ein nicht funktionierendes Beispiel ist in Ordnung. Bitte machen Sie ein einfaches Beispiel, das zeigt, wie Sie die Streudiagramme und die Legende erstellen. Wenn es nicht funktioniert, sag bitte, welche Fehler du bekommst. –

Antwort

0

Dies scheint kompliziert, aber gibt Ihnen, was Sie wollen. Vorschläge sind willkommen. Ich verwende ax.get_legend_handles_labels(), um die Marker zu erhalten und tuple(handle.get_facecolor()[0]) zu verwenden, um das Matplotlib-Farbtupel zu erhalten. Hergestellt ein Beispiel mit einem wirklich einfachen Streudiagramm wie folgt aus:

Edit:

Als ImportanceOfBeingErnest in seiner answer zeigte:

  1. leg.legendHandles die Legende zurück behandelt;
  2. Liste anstelle von Tupel, kann verwendet werden, um Matplotlib-Farbe zuzuweisen.

Codes werden als vereinfacht:

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() 

Was ich ist bekam: enter image description here

4

Streudiagramme eine facecolor und eine edgecolor haben. Der Legendenhandler für eine Streuung ist ein PathCollection.

So können Sie Schleife über die Legende Griffe und stellen Sie die Textfarbe auf die facecolor der Legende Griff

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

komplette Code:

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

Danke für die Erwähnung der 'legendHandles'! Irgendwie habe ich es im doc nicht gefunden, obwohl es scheinbar die gleichen Ergebnisse liefert wie 'get_legend_handles_labels()' – Phyinmi

+0

Danke, dass du 'leg.legendHandles' angezeigt hast und die Farbe als' liste' hast. Viel gelernt! –

+1

'legend.legendHandles' ist die Liste von Handles, die tatsächlich in der Legende sind, während' ax.get_legend_handles_labels() 'die Liste von Handles und Labels zurückgibt, die sich für die Legenden qualifizieren.Der Unterschied wäre also sichtbar, wenn nicht alle Künstler in der Legende oder Künstler in die Legende eingefügt würden, die nicht Teil der Handlung sind. – ImportanceOfBeingErnest

Verwandte Themen