让我们使用FancyArrowPatch在两个散点之间绘制一个箭头:
import matplotlib.pyplot as plt
import matplotlib as mpl
fig, ax = plt.subplots()
points = ax.scatter([0,1],[0,1], marker='o', s=300)
arrow = mpl.patches.FancyArrowPatch((0,0), (1,1), arrowstyle='-|>', mutation_scale=20)
ax.add_patch(arrow)
fig.show()
看起来还可以
现在,让我们进行相同的绘图,但使用PatchCollection
import matplotlib.pyplot as plt
import matplotlib as mpl
fig, ax = plt.subplots()
points = ax.scatter([0,1],[0,1], marker='o', s=300)
arrow = mpl.patches.FancyArrowPatch((0,0), (1,1), arrowstyle='-|>', mutation_scale=20)
col = mpl.collections.PatchCollection([arrow])
ax.add_collection(col)
fig.show()
有人可以澄清发生了什么吗?
最佳答案
FancyArrowPatch
主要设计用于注释。显然缺乏与其他修补程序的兼容性,因此与PatchCollection不兼容。 (正如@tom在评论中所指出的那样,它链接到[this issue])。
一种解决方法是从箭头的路径创建一个新补丁并将该新补丁添加到集合中。这不允许保留FancyArrowPatch
的所有功能,因此最后是否完全不使用PatchCollection并不是更好的解决方案。
import matplotlib.pyplot as plt
import matplotlib as mpl
import matplotlib.patches as mpatches
fig, ax = plt.subplots()
points = ax.scatter([0,1],[0,1], marker='o', s=300)
arrow1 = mpatches.FancyArrowPatch((0,0), (1,1), arrowstyle='-|>', mutation_scale=50)
arrow2 = mpatches.FancyArrowPatch((.7,0), (0.1,0), arrowstyle='->', mutation_scale=30)
def arrows2collection(ax, arrows,**kw):
p = []
for arrow in arrows:
ax.add_patch(arrow)
path = arrow.get_path()
p.append(mpatches.PathPatch(path,**kw))
arrow.remove()
col = mpl.collections.PatchCollection(p,match_original=True)
ax.add_collection(col)
return col
col = arrows2collection(ax, [arrow1,arrow2], linewidth=1)
plt.show()
关于python - matplotlib PatchCollection绘制了比例过大的箭头补丁,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47408540/