我需要在一个图中绘制几个数据集。数据集的数量各不相同,因此我不知道先验数量会有多少。
如果我只画出传说,我会得到这个(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')
答案 0 :(得分:3)
您可以限制显示的标签数量。
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()
这样做的原因是图例中忽略以"_"
开头的标签。这在内部用于为对象提供标签而不在图例中显示它们,但我们当然也可以使用它来限制图例中元素的数量。
答案 1 :(得分:1)
我想建议一种替代方法来获得所需的输出,我觉得它更少依赖于传奇标签的“黑客”。
您可以使用function 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])
或其他任何您想要的内容。