我想对标签列表进行排序,我从Matplotlib中的图例中获得的句柄在标签中字符串的最后一个字符之后。
到目前为止,我试图结合这个线程:在matplotlib图例中,项目的顺序是如何确定的?有了这条线:如何排序字符串的最后一个字符列表不幸的是,这并没有奏效。下面是我的代码:
handles, labels = ax.get_legend_handles_labels()
handles, labels = zip(*sorted(zip(labels, handles), key = lambda t:[0]))
leg = ax.legend(handles, labels,loc='best', ncol=2, shadow=True, fancybox=True)
基本上什么都不做。
以下是打印结果:
print(handles)
print(labels)
[<matplotlib.lines.Line2D object at 0x7fd6182ddcd0>, <matplotlib.lines.Line2D object at 0x7fd6182ddb50>, <matplotlib.lines.Line2D object at 0x7fd6448ddc10>, <matplotlib.lines.Line2D object at 0x7fd6448ddf50>, <matplotlib.lines.Line2D object at 0x7fd6609cb790>, <matplotlib.lines.Line2D object at 0x7fd6609cb190>, <matplotlib.lines.Line2D object at 0x7fd660ac5f10>, <matplotlib.lines.Line2D object at 0x7fd660ac5e90>, <matplotlib.lines.Line2D object at 0x7fd619404d10>, <matplotlib.lines.Line2D object at 0x7fd645fcb9d0>]
['Demo_4 maximum', 'Demo_4 mean', 'Demo_5 maximum', 'Demo_5 mean', 'Demo_6 maximum', 'Demo_6 mean', 'Demo_7 maximum', 'Demo_7 mean', 'Demo_8 maximum', 'Demo_8 mean']
你就快成功了。
一行有一些需要修改的地方handles, labels = zip(*sorted(zip(labels, handles), key = lambda t:[0]))
如果您希望收到
handles, labels,
,那么您必须按照相同的顺序进行压缩:zip(handles, labels)
按第一个列表排序的键将是
lambda t: t[0]
(注意t)。但是因为我们现在首先有句柄,其次是标签,所以按标签排序,它将是lambda t: t[1]
(1是第二个列表,在本例中是标签)但是您不希望按标签排序,而是按标签的最后一个字符排序。通过
s[-1]
得到字符串s
的最后一个字符。因此,键应该是lambda t: t[1][-1]
([1],因为标签在第二个位置;[-1](因为您想要每个标签的最后一个字符)。
:
handles, labels = zip(*sorted(zip(handles, labels), key = lambda t: t[1][-1]))