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


看起来还可以

python - matplotlib PatchCollection绘制了比例过大的箭头补丁-LMLPHP

现在,让我们进行相同的绘图,但使用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()


有人可以澄清发生了什么吗?
python - matplotlib PatchCollection绘制了比例过大的箭头补丁-LMLPHP

最佳答案

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/

10-12 17:34