繁体   English   中英

设置图例的最大行数

[英]Set the maximum number of rows in legend

我需要在一个图中绘制多个数据集。 数据集的数量各不相同,所以我事先不知道会有多少。

如果我只是画图例,我会得到这个(下面的 MCVE):

在此处输入图像描述

我如何告诉plt.legend()只绘制前 10 个图例? 我查看了plt.legends()类,但似乎没有理由设置这样的值。

MCVE

import numpy as np
import matplotlib.pyplot as plt

dataset = []
for _ in range(20):
    dataset.append(np.random.uniform(0, 1, 2))

lbl = ['adfg', 'dfgb', 'cgfg', 'rtbd', 'etryt', 'frty', 'jklg', 'jklh',
       'ijkl', 'dfgj', 'kbnm', 'bnmbl', 'qweqw', 'fghfn', 'dfg', 'hjt', 'dfb',
       'sdgdas', 'werwe', 'dghfg']

for i, xy in enumerate(dataset):
    plt.scatter(xy[0], xy[1], label=lbl[i])
plt.legend()
plt.savefig('test.png')

您可以限制显示的标签数量。

import matplotlib.pyplot as plt

maxn = 16
for i in range(25):
    plt.scatter(.5, .5, label=(i//maxn)*"_"+str(i))
plt.legend()
plt.show()

在此处输入图像描述

此方法当然也适用于文本标签:

import numpy as np
import matplotlib.pyplot as plt

labels = ["".join(np.random.choice(list("ABCDEFGHIJK"), size=8)) for k in range(25)]
maxn = 16
for i,l in enumerate(labels):
    plt.scatter(.5, .5, label=(i//maxn)*"_"+l)
plt.legend()
plt.show()

在此处输入图像描述

这样做的原因是图例中忽略了以"_"开头的标签。 这在内部用于给对象一个标签而不在图例中显示它们,但我们当然也可以使用它来限制图例中的元素数量。

我想建议另一种方法来获得您想要的输出,我觉得它不太依赖图例标签的“破解”。

您可以使用函数Axes.get_legend_handles_labels()来获取要放入图例中的对象的句柄列表和标签。 在将它们传递给plt.legend()之前,您可以随意截断这些列表。 例如:

import numpy as np
import matplotlib.pyplot as plt

dataset = []
for _ in range(20):
    dataset.append(np.random.uniform(0, 1, 2))

lbl = ['adfg', 'dfgb', 'cgfg', 'rtbd', 'etryt', 'frty', 'jklg', 'jklh',
       'ijkl', 'dfgj', 'kbnm', 'bnmbl', 'qweqw', 'fghfn', 'dfg', 'hjt', 'dfb',
       'sdgdas', 'werwe', 'dghfg']

fig, ax = plt.subplots()
for i, xy in enumerate(dataset):
    ax.scatter(xy[0], xy[1], label=lbl[i])

h,l = ax.get_legend_handles_labels()
plt.legend(h[:3], l[:3])   # <<<<<<<< This is where the magic happens
plt.show()

您甚至可以显示所有其他标签plt.legend(h[::2], l[::2])或您想要的任何其他标签。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM