Search code examples
pythonmatplotliblegend

Show only certain items in legend


I currently am plotting a stacked bar graph of a large amount of taxonomic data, and only wish to show significant species in the legend (out of ~500 I wish to show ~25). Is there a simple way to do this? Below is the code I have:

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: tried adding this to show only one legend entry, however only returns an empty legend:

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

Solution

  • I often insert an empty label for legends I don't want to show. I made an extremely simple example which I hope will help you. You will need to tweak this to your own data but the elements you need should be there.

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

    This creates the following plot: enter image description here