Matplotlib的图例:如何先按行而不是按列对条目排序

w8biq8rn  于 2023-03-19  发布在  其他
关注(0)|答案(1)|浏览(170)

默认情况下,Matplotlib按列对图例中的条目进行排序,例如:

In [48]: from matplotlib.pyplot import subplots, show
    ...: f, ax = subplots(figsize=(6, 2), constrained_layout=True)
    ...: for i in range(1, 10):
    ...:     ax.plot((0,1),(0,1), label=str(i))
    ...: ax.legend(ncol=4, loc=3)
    ...: show()

但我更喜欢按行列出条目,例如
我可以重新排序句柄和标签,并调用ax.legend传递重新排序的列表(如果在注解中要求,我会将其作为答案发布),但 * 我想知道是否有更直接和直接的方法来指示Matplotlib按照我想要的那样做 *,这样我就不必在我将要编写的50%的Matplotlib脚本中复制和粘贴重新排序解决方案...

5f0d552i

5f0d552i1#

可以使用Axes方法get_legend_handles_labels获取艺术家和标签的句柄列表,然后调用legend传递重新排序的列表。
为了对列表重新排序,我们观察到

  • legend将列表中的第一个元素放置在第一列中,然后继续处理后面的列/项,
  • 列具有可变长度,但是除了最后一行之外,所有行必须具有相同长度(即,ncol),此外,在每列中,项之间的增量必须等于ncol

也就是说,可以使用分片为每个列生成一个子列表,列的长度自动为正确的长度......,并最终使用sum将子列表连接到重新排序的子列表中。

In [59]: from matplotlib.pyplot import subplots, show
    ...: reorder = lambda l, nc: sum((l[i::nc] for i in range(nc)), [])
    ...: 
    ...: f, ax = subplots(figsize=(6, 2), constrained_layout=True)
    ...: for i in range(1, 10):
    ...:     ax.plot((0,1),(0,1), label=str(i))
    ...: h, l = ax.get_legend_handles_labels()
    ...: ax.legend(reorder(h, 4), reorder(l, 4), ncol=4, loc=3)
    ...: show()

相关问题