2017-06-12 17 views
5

Zrobiłem wykres punktowy z 3 różnych kolorach i chcę dopasować kolor symbol i tekst w legendzie.matplotlib: mecz kolor tekstu legenda o symbolu w wykres punktowy

Miła solution istnieją w przypadku działek linia:

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

Jednak kolory wykres punktowy nie mogą być dostępne przez get_lines() .W przypadku 3 kolorach myślę, że mogę ręcznie ustawić kolory tekstu jedno- osobno przy użyciu np. text.set_color('r'). Ale byłem ciekawy, czy można to zrobić automatycznie jako linie. Dzięki!

+0

Jak o 'get_children' lub 'get_patches'? Czy możesz podać minimalny przykład pracy? Można zajrzeć do metod Legenda do innych pomysłów: https://matplotlib.org/1.3.0/api/legend_api.html –

+0

@AleksanderLidtke Dzięki za sugestie! Próbowałem 'leg.get_patches()' przed i nic nie zwraca. Właśnie próbowałem 'leg.get_children()' i zwraca 'matplotlib.offsetbox.VPacker' i' matplotlib.patches.FancyBboxPatch' obiektów, z których żaden nie ma właściwości 'get_color()'. Łącze rozwiązania ma działający przykład dla linii, przepraszam z działkami rozproszonymi Mam tylko niedziałający przykład ... – Phyinmi

+0

niedziałający przykład jest w porządku. Proszę, po prostu zrób prosty przykład, który pokazuje, w jaki sposób tworzysz wykresy rozproszenia i legendę. Jeśli to nie działa, po prostu powiedz, jakie błędy otrzymasz. –

Odpowiedz

0

to wydaje się skomplikowane, ale daje Ci to, co chcesz. Sugestie są mile widziane. Używam ax.get_legend_handles_labels(), aby uzyskać znaczniki i użyć tuple(handle.get_facecolor()[0]), aby uzyskać krotkę koloru matplotlib. Wykonane przykład z naprawdę prosty wykres punktowy jak ten:

Edit:

Jak ImportanceOfBeingErnest wskazał w Jego answer:

  1. leg.legendHandles zwróci obsługuje legendę;
  2. Lista, zamiast krotki, może być użyta do przypisania koloru matplotlib.

Kody są uproszczone jak:

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

Co mam to: enter image description here

4

Wykresy rozrzutu mają facecolor oraz edgecolor. Obsługa legendy dla rozproszenia to PathCollection.

Więc można pętli nad uchwytami legendy i ustawić kolor tekstu do facecolor legendy obsłużyć

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

Kompletna kod:

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

Dzięki za wzmiankę o 'legendHandles'! Jakoś nie znalazłem tego w dokumencie, chociaż wydaje się, że daje takie same wyniki jak 'get_legend_handles_labels()' – Phyinmi

+0

Dziękuję za pokazanie 'leg.legendHandles' i kolor jako' list'. Nauczyłem się wiele! –

+1

'legend.legendHandles' to lista uchwytów, które faktycznie znajdują się w legendzie, podczas gdy' ax.get_legend_handles_labels() 'zwraca listę uchwytów i etykiet, które kwalifikują się do legendy.Różnica byłaby widoczna, gdyby nie wszyscy artyści w legendzie lub umieszczający artystów w legendzie, którzy nie są częścią fabuły. – ImportanceOfBeingErnest

Powiązane problemy