【问题标题】:Show only certain items in legend Python Matplotlib仅显示图例 Python Matplotlib 中的某些项目
【发布时间】:2014-09-01 02:10:11
【问题描述】:

我目前正在绘制大量分类数据的堆叠条形图,并且只希望在图例中显示重要的物种(在 ~500 个中我希望显示 ~25 个)。有没有一种简单的方法可以做到这一点?以下是我的代码:

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

【问题讨论】:

  • 您的意思是要绘制所有 500 个变量,但在图例中只显示选定的 25 个?

标签: python matplotlib legend


【解决方案1】:

我经常为不想显示的图例插入一个空标签。我做了一个非常简单的例子,希望对你有所帮助。您需要根据自己的数据对其进行调整,但您需要的元素应该在那里。

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

这将创建以下图:

【讨论】:

  • legend 还采用艺术家列表和标签列表来精确控制您的传奇中的内容
  • 这可以工作,但是有没有办法让 selected 成为我想要的图例条目的字符串列表?我的情节是许多条目的堆积条形图。
  • 当然。对于您的每个条目(由 X、Y 和名称标识),检查您当前的条目是否在要为其显示图例的选定标签列表中。除非您显示有关数据外观的更多信息,否则很难向您展示如何执行此操作。
  • 尝试使用 label='nolegend' 的指示解决方案
  • Philipp 表示label='_nolegend_'(注意下划线),请参阅jlansey 的答案。
【解决方案2】:

这行得通:

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

source

【讨论】:

  • 什么?!?完美运行,但这是一个意想不到的解决方案:)
  • 年度黑客。
  • 嗯。可怜的混蛋希望他的标签上写着_nolegend_
  • 开发者有什么理由选择这个而不是label=None
  • 所有以_ 开头的内容都会从图例中跳过。
【解决方案3】:

无论出于何种原因,这两个答案都不适用于我的情况。什么有效,实际上是上面指出的:

legend 还采用艺术家列表和标签列表来精确控制您的传奇中的内容 – tacaswell 2014 年 7 月 11 日 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()

代码结果:

【讨论】:

  • 干净的解决方案可以正确扩展,谢谢分享
【解决方案4】:

你也可以使用空字符串变量:

    plt.plot(xData, yData, ..., label=str())

通过传递一个空的 str() 对象,它不会写下任何东西。

Matplotlib API reference

【讨论】:

  • 或为自己节省 3 个字符并写 label=""
猜你喜欢
  • 2018-09-06
  • 2020-02-05
  • 2014-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-19
相关资源
最近更新 更多