2014-07-10 2 views
22

현재 엄청난 양의 분류 데이터가 포함 된 누적 막대 그래프를 플로팅하고 범례에 중요한 종을 표시하려고합니다 (~ 500 개 중 ~ 25 개를 표시하고 싶음). 이 작업을 수행하는 간단한 방법이 있습니까? 아래 코드 나는이된다범례 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) 

편집 :

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

당신이 당신의 500 개 모든 변수를 플롯하려는 의미하지만, 보여 만 당신의 전설 (25)를 선택? – ThePredator

답변

4

가 나는 종종 전설 나는 돈을 위해 빈 라벨을 삽입합니다, 그러나 단지 빈의 전설을 반환 하나의 범례 항목을 표시하려면이 추가 시도 보여주고 싶지 않아. 나는 당신을 도울 희망이있는 매우 간단한 예를 만들었습니다. 이를 자신의 데이터로 조정해야하지만 필요한 요소가 있어야합니다.

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

이 다음 플롯을 생성합니다 는 enter image description here

+2

'legend'는 아티스트 목록과 레이블 목록을 가져와 전설에 들어가는 것을 정확하게 제어합니다. – tacaswell

+0

이 방법이 효과가있을 수 있지만 내가 원하는 범례 항목의 문자열 목록으로 선택된 방법이 있습니까? 내 음모는 많은 항목이 겹쳐져있는 막대 그림입니다. – Broncos423

+0

예. 각 항목 (X, Y 및 이름으로 식별)에 대해 현재 항목이 범례를 표시 할 선택한 레이블 목록에 있는지 확인하십시오. 데이터를 표시하는 방법에 대한 자세한 정보를 표시하지 않는 한이를 수행하는 방법을 보여주기가 어렵습니다. –

53

이 작동 :

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

source

+4

무엇을?!? 완벽하게 작동하지만 그것은 예상치 못한 해결책입니다 :) – Owen

2

어떤 이유로 모두 답변을 내 상황을 위해 작동하지 않았다. 무슨 일을하고, 실제로 위에서 언급 한 :

전설도 정확하게 전설로 전환을 제어하는 ​​작가의 목록과 라벨의 목록을 소요 - 4시 46분

에서 tacaswell 7월 11일 '14
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() 

코드의 결과 : The result of the code: