Python 设置图例中的最大行数

Python 设置图例中的最大行数,python,matplotlib,Python,Matplotlib,我需要在一个绘图中绘制多个数据集。数据集的数量各不相同,所以我不知道会有多少 如果我只画图例,我会得到下面的MCVE: 如何让plt.legend只绘制前10个图例?我环顾了全班,但似乎没有任何理由设定这样的值 MCVE: 您可以只限制显示的标签数量 import matplotlib.pyplot as plt maxn = 16 for i in range(25): plt.scatter(.5, .5, label=(i//maxn)*"_"+str(i)) plt.legen

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

如果我只画图例,我会得到下面的MCVE:

如何让plt.legend只绘制前10个图例?我环顾了全班,但似乎没有任何理由设定这样的值

MCVE:


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

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()

这种方法之所以有效,是因为图例中忽略了以u开头的标签。这在内部用于为对象提供一个标签,而不在图例中显示它们,但我们当然也可以使用它来限制图例中元素的数量。

我想建议一种获得所需输出的替代方法,我觉得这不太依赖于对图例标签的破解

可以使用获取要放置在图例中的对象的句柄和标签的列表。 在将这些列表传递给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.legendh[::2],l[::2]或任何你想要的东西。

我不知道正确的方法,但一个可能的解决方法可能是在for循环中放入if语句,只使用label=if_u小于10?谢谢@DavidG。这确实是一个解决办法,但我想知道是否有一种不太老练的方法来做这件事。这似乎只在标签上的数字是我的情况下起作用,事实并非如此。这是我的错,我把我的MCVE简化了。我现在就来解决它。@Gabriel即使你的标签不是数字,你也可以保留一个动态构建标签列表的方法,并使用此方法选择标签列表的索引以显示输出优秀,它确实有效!你能解释一下为什么在标签前加上a会阻止它显示吗?我不知道这个功能。
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()