gpt4 book ai didi

python - matplotlib PatchCollection 绘制超标箭头补丁

转载 作者:太空宇宙 更新时间:2023-11-04 04:54:22 25 4
gpt4 key购买 nike

让我们使用 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()

看起来不错

enter image description here

现在,让我们使用 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()

有人可以澄清发生了什么吗? enter image description here

最佳答案

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/

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