按字符串的最后一个字符对压缩列表(字符串,"Line2D"的实例)进行排序



我想对标签列表进行排序,我从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]))
  1. 如果您希望收到handles, labels,,那么您必须按照相同的顺序进行压缩:zip(handles, labels)

  2. 按第一个列表排序的键将是lambda t: t[0](注意t)。但是因为我们现在首先有句柄,其次是标签,所以按标签排序,它将是lambda t: t[1](1是第二个列表,在本例中是标签)

  3. 但是您不希望按标签排序,而是按标签的最后一个字符排序。通过s[-1]得到字符串s的最后一个字符。因此,键应该是lambda t: t[1][-1]([1],因为标签在第二个位置;[-1](因为您想要每个标签的最后一个字符)。

:

handles, labels = zip(*sorted(zip(handles, labels), key = lambda t: t[1][-1]))

最新更新