gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 21:40:19 24 4
gpt4 key购买 nike

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

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

Resulting plot

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

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

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

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

我正在使用 matplotlib 1.5.3。

最佳答案

您可以使用特殊的标记符号,它有一个虚线边缘,例如marker=ur'$\u25CC$'(完成 STIX symbol table)。

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

enter image description here

但这不能填写。

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

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

enter image description here

关于python - 手动图例中的自定义标记边缘样式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45786714/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com