如何确定matplotlib图例中项目的顺序?

2024-05-18 12:22:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我不得不重新订购一个传奇中的项目,而我认为我不应该这样做。我试着:

from pylab import *
clf()
ax=gca()
ht=ax.add_patch(Rectangle((1,1),1,1,color='r',label='Top',alpha=.01))
h1=ax.bar(1,2,label='Middle')
hb=ax.add_patch(Rectangle((1,1),1,1,color='k',label='Bottom',alpha=.01))
legend()
show()

最后底部在中间上方。我怎样才能得到正确的订单?它不是由创建顺序决定的吗?

Code results in the wrong legend item order

更新:可以使用以下命令强制执行订单。我想这可能是最简单的方法,而且看起来很尴尬。问题是什么决定了最初的顺序?

hh=[ht,h1,hb]
legend([ht,h1.patches[0],hb],[H.get_label() for H in hh])

Tags: 订单alphaadd顺序hhaxh1label
3条回答

顺序是确定的,但是私有元素的一部分可以随时更改,请参见代码here(元素self.*是已添加的艺术家的列表,因此句柄列表首先按类型排序,其次按添加的顺序排序)。

如果要显式地控制图例中元素的顺序,请像在编辑中那样组合处理程序和标签的列表。

在其他一些问题上有轻微的变化。列表order的长度应与图例项的数量相同,并手动指定新顺序。

handles, labels = plt.gca().get_legend_handles_labels()
order = [0,2,1]
plt.legend([handles[idx] for idx in order],[labels[idx] for idx in order])

下面是对图例中的条目进行排序的快速片段。它假设您已经添加了带有标签的绘图元素,例如

ax.plot(..., label='label1')
ax.plot(..., label='label2')

然后是主位:

handles, labels = ax.get_legend_handles_labels()
# sort both labels and handles by labels
labels, handles = zip(*sorted(zip(labels, handles), key=lambda t: t[0]))
ax.legend(handles, labels)

这只是对http://matplotlib.org/users/legend_guide.html中列出的代码的简单改编

相关问题 更多 >

    热门问题