手动图例中的自定义标记边缘样式

Fer*_*ndr 3 python matplotlib

我想手动为绘图创建一个图例,它不直接引用绘图中的任何数据,例如:

import matplotlib.pyplot as plt
from matplotlib.lines import Line2D

plt.plot([0, 1], [3, 2])
line = Line2D([], [], label='abc', color='red', linewidth=1.5, marker='o',
              markerfacecolor='yellow', markeredgewidth=1.5, markersize=16)
plt.legend(handles=[line], numpoints=1)
plt.show()
Run Code Online (Sandbox Code Playgroud)

结果图

这很好用,因为我也找不到设置标记边缘样式(即实线、虚线、点线等)的方法。Line2D 没有 markeredgestyle 属性或类似属性,并且设置 linestyle 似乎不会影响标记边缘样式。有什么解决方法吗?

我想到了一些方法,但我不确定它们的可行性:

  • 使用与 Line2D 完全不同的东西。它需要在图例中显示,具有与 Line2D 相同的格式选项,以及额外的标记边缘样式。不确定这样的类是否存在
  • 创建一个从 Line2D 派生的自定义类并自己实现该标记边缘样式
  • 在绘图本身中创建数据,然后将其从那里删除,同时以某种方式将其保留在图例中。不确定是否存在允许我在实际图表中执行此操作的类。请注意,它必须同时包含一个标记和一条线。我能想到的最接近的事情是对标记使用散点图,对线条使用绘图,但这会显示两个图例条目(除非有办法将它们组合成一个)

理想情况下,线条样式和标记边缘样式可能不同,但如果有一种方法可以更改标记边缘样式,涉及覆盖线条样式,我也会采用它。

我正在使用 matplotlib 1.5.3。

Imp*_*est 6

您可以使用带有虚线边缘的特殊标记符号,例如marker=ur'$\u25CC$' (完整的 STIX符号表)。

import matplotlib.pyplot as plt
from matplotlib.lines import Line2D

plt.plot([0, 1], [3, 2])
line = Line2D([], [], label='abc', color='red', linewidth=1.5, marker=ur'$\u25CC$',
              markeredgecolor='indigo', markeredgewidth=0.5, markersize=16)
plt.legend(handles=[line], numpoints=1)
plt.show()
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

但是这个不能填。

另一方面,scatter绘图没有任何连接线,因此linestylea 的scatter确实会影响标记边缘。因此,您可以组合 aLine2D和 a scatter,其中线条没有标记并构成背景线,而散点图负责标记。

import matplotlib.pyplot as plt
from matplotlib.lines import Line2D

plt.plot([0, 1], [3, 2])
line = Line2D([], [], label='abc', color='red', ls="-", linewidth=1.5)
sc1 = plt.scatter([],[],s=14**2,facecolors='yellow', edgecolors='blue',
            linestyle='--')
sc2 = plt.scatter([],[],s=14**2,facecolors='gold', edgecolors='indigo',
            linestyle=':', linewidth=1.5)
plt.legend([(line,sc1), (line,sc2)], ["abc", "def"], numpoints=1)

plt.show()
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明