【问题标题】:Matplotlib, legend with multiple different markers with one labelMatplotlib,具有多个不同标记和一个标签的图例
【发布时间】:2025-12-26 12:00:16
【问题描述】:

这是一个简化的情节:

我希望能够为一组不同的标记设置一个标签,而不是让每个数据点标记都有一个单独的标签。我希望能够拥有这样的传奇:

<triangle> <square> <hexagon> <diamond> <circle> Shotcrete strength data points
<green line> 10 minute strength
<blue line> 60 minute strength
<yellow line> 1 day strength
<orange line> 7 day strength
<red line> 28 day strength

我想这样做是因为在最后的绘图中,我将拥有三组数据点,并且显示 18 个(3 组 * 6 点/组)标记/标签组合会很混乱。

我在 Python 2.7 中使用 Matplotlib。

【问题讨论】:

  • 对于使用 Python 和 matplotlib v 3.0 及更高版本遇到类似问题的人,我发布到 this question 的答案可能会有所帮助。

标签: python matplotlib


【解决方案1】:

注意:此答案作为正确答案的指南 - 但它不能解决所述问题。有关 matplotlib 不支持补丁集合的问题,请参阅下面的编辑。


如果您想要完全自定义,一种方法是使用所谓的代理艺术家:

from pylab import *

p1 = Rectangle((0, 0), 1, 1, fc="r")
p2 = Circle((0, 0), fc="b")
p3 = plot([10,20],'g--')
legend([p1,p2,p3], ["Red Rectangle","Blue Circle","Green-dash"])

show()

您可以在此处准确地指定您希望图例的外观,甚至可以使用非标准的绘图形状(补丁)。

编辑:这种方法有一些困难,matplotlib only supports these Artists in a legend 无需调整。 matplotlib v1.0及更早版本,支持的艺术家如下。

Line2D
Patch
LineCollection
RegularPolyCollection
CircleCollection

您对多个分散点的请求将使用Patch Collection 完成,上面不支持。从理论上讲,使用 v1.1,这是可能的,但我不知道如何。

【讨论】:

  • 我目前正在使用伪线来制作我的传奇。我想我可能可以使用这样的东西(matplotlib.sourceforge.net/users/…):code z = np.random.randn(10) p1a, = plt.plot(z, "ro", ms=10, mfc=" r", mew=2, mec="r") # 红色实心圆 p1b, = plt.plot(z[:5], "w+", ms=10, mec="w", mew=2) # 白色交叉 plt.legend([p1a, (p1a, p1b)], ["Attr A", "Attr A+B"]) code 将多个标记合并到一行中。
  • @CrazyArm 据我了解,您必须为&lt;triangle&gt; &lt;square&gt; &lt;hexagon&gt; &lt;diamond&gt; &lt;circle&gt; 定义一个自定义形状,这就是我提供解决方案的原因。您可以从散点图源(或从散点图本身)中提取符号形状,并将其与自定义形状一起用作legend 的输入。
  • 谢谢。我想我知道如何在图例中制作一个单独的自定义标记(一个矩形,或者你提到的圆形),但我不知道如何组合其中的两个。这 (matplotlib.sourceforge.net/examples/api/scatter_piecharts.html) 通过重叠多个符号来做到这一点,但我不知道他们会如何在图例上显示它。
  • 另外,您的代码会在图例中生成两个矩形(一个红色,一个蓝色),而不是一个圆形的矩形。
  • @CrazyArm 您的解决方案帮助我解决了我的问题:*.com/questions/28732845/…。谢谢!