Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 手动图例中的自定义标记边样式_Python_Matplotlib - Fatal编程技术网

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

Python 手动图例中的自定义标记边样式,python,matplotlib,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', markered

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

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

这非常有效,只是因为我找不到设置标记边缘样式(即实心、虚线、虚线等)的方法。Line2D没有MarkerEdge style特性或类似特性,因此改为设置linestyle似乎不会影响标记边缘样式是否有解决方法?

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

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


我使用的是matplotlib 1.5.3。

我根据第三种方法找到了一个解决方案,并进行了测试。基本上,如果为控制柄指定单个标签,则可以在图例中组合控制柄。因此,您可以从Line2D对象创建直线,然后从散射函数创建标记,后者允许您指定可能需要的任何标记格式:

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

plt.plot([0, 1], [3, 2])
line = Line2D([], [], color='red', linewidth=1.5)

marker = plt.scatter([], [], linewidth=2, edgecolor='black', s=75,
                     c='yellow', linestyle='dotted')
marker.remove()  # The scatter plot had no data, so no markers would have shown up anyway

plt.legend(handles=((line, marker),), labels=('abc',), numpoints=1, scatterpoints=1)
plt.show()

您可以使用带有点边的特殊标记符号,例如,
marker=ur'$\u25CC$'
(完成STIX)

然而,这一数字无法填补

另一方面,
散点
绘图没有任何连接线,因此
散点
线型
确实会影响标记边缘。 因此,您可以将
Line2D
散点
组合在一起,其中直线没有标记,构成背景线,散点负责标记

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

什么是“标记边缘样式”?是否要更改标记边缘的颜色?我很确定我们可以解决任何实际问题(比如“我希望标记边缘看起来像”_____;),但我们不能在不知道它应该做什么的情况下实现一些抽象的“标记边缘样式”。鉴于标记边缘最后是一条线,我希望“标记边缘样式”与“线条样式”相同,即实线、虚线、,虚线等等。已经有了markeredgecolor和markeredgewidth属性(相当于线条的颜色和线宽),但没有我所希望的等效markeredgestyle
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()