2014-07-10 20 views
22

Obecnie tworzę wykres słupkowy z dużą ilością danych taksonomicznych i chcę tylko pokazać znaczące gatunki w legendzie (z ~ 500 chcę pokazać ~ 25). Czy istnieje prosty sposób na zrobienie tego? Poniżej znajduje się kod mam:Pokaż tylko niektóre elementy w legendzie Python Matplotlib

labels=['0','20','40','60','80','100','120'] 
ax1=subj1df.plot(kind='barh', stacked=True,legend=True,cmap='Paired', grid=False) 
legend(ncol=2,loc=2, bbox_to_anchor=(1.05, 1), borderaxespad=0.) 
label1=['Baseline','8h','24h','48h','96h','120h'] 
ax1.set_yticklabels(label1, fontdict=None, minor=False) 
plt.title('Subject 1 Phyla',fontweight='bold') 
plt.savefig('Subject1Phyla.eps', format='eps', dpi=1000) 
ax1.set_xticklabels(labels) 

Edit: Próbowałem, dodając to, aby pokazać tylko jeden wpis legendy, jednak zwraca tylko pusta legenda:

h, l = ax1.get_legend_handles_labels() 
legend(l[4],h[4],ncol=2,loc=2, bbox_to_anchor=(1.05, 1), borderaxespad=0.) 
+0

znaczy chcesz wykreślić wszystkich 500 zmiennych, ale pokazują tylko wybrane 25 w legendzie? – ThePredator

Odpowiedz

4

często włóż pustą etykietę legendy I don nie chcę pokazać. Zrobiłem bardzo prosty przykład, który mam nadzieję, ci pomoże. Będziesz musiał dostosować to do własnych danych, ale elementy, których potrzebujesz, powinny tam być.

import matplotlib.pyplot as plt 
import numpy as np 

myY=np.random.randint(20, size=10) 
myX=np.arange(0,len(myY)) 

selected=[5,10,15] 

fig = plt.figure() 
for X,Y in zip(myX,myY): 
    if Y in selected: 
     mylabel="label = %s"%(Y); mycolor='blue' 
    else: 
     mylabel=None; mycolor='red' 
    plt.scatter(X,Y,50, color=mycolor, label=mylabel) 
plt.legend() 
plt.show() 

ten tworzy następujący wykres: enter image description here

+2

'legend' również pobiera listę artystów i listę etykiet, aby dokładnie kontrolować, co dzieje się z Twoją legendą. – tacaswell

+0

To może działać, ale czy istnieje sposób, aby wybrać listę ciągów wpisów legendy, które chcę? moja fabuła to skumulowany wykres słupkowy z wieloma wpisami. – Broncos423

+0

Pewnie. Dla każdego z twoich wpisów (identyfikowanych przez X, Y i nazwę) sprawdź, czy twój bieżący wpis znajduje się na liście wybranych etykiet, dla których chcesz wyświetlić legendę. Trudno Ci to pokazać, chyba że pokażesz więcej informacji o tym, jak wyglądają Twoje dane. –

53

To działa:

plt.plot(x, y,label='_nolegend_') 

source

+4

CO?!? Działa idealnie, ale to takie nieoczekiwane rozwiązanie :) – Owen

2

Z jakiegoś powodu obie odpowiedzi nie działa dla sytuacji kopalni. Co pracował, a właściwie został wskazany powyżej:

legenda trwa również listę artystów oraz listę etykiet dokładnie kontrolować, co się dzieje w twojej legendy - tacaswell lip 11 '14 na 4:46

import pandas as pd 
import matplotlib.pyplot as plt 
import pylab 

pd.Series(range(10)).plot(color = 'grey') 
x = list(range(10)) 
y = [i + 1 for i in x] 
scat1 = plt.scatter(x, y) 

pylab.legend([scat1],['moved points'], loc = 'upper left') 

plt.show() 

wynik kodu: The result of the code:

Powiązane problemy