使用matplotlib箭头缩放

时间:2017-11-19 03:02:39

标签: python python-3.x matplotlib

我正在尝试在matplotlib中的两个(散点)节点之间绘制一个箭头。我尝试使用此代码使用connection patch绘制它:

import matplotlib.pyplot as plt
import matplotlib as mpl

fig, ax = plt.subplots()
nodes = ax.scatter([1,2], [3,2], s=300)
arrow = mpl.patches.ConnectionPatch((1,3),(2,2), "data", "data", arrowstyle="-|>", shrinkA=5, shrinkB=5, mutation_scale=20, fc="w")
ax.add_patch(arrow)
fig.show()

获得:

enter image description here

哪个看起来不错。但是,当我放大其中一个节点时,箭头会消失: enter image description here

当我使用fancy arrow patch时使用以下(类似)代码:

import matplotlib.pyplot as plt
import matplotlib as mpl

fig, ax = plt.subplots()
nodes = ax.scatter([1,2], [3,2], s=300)
arrow = mpl.patches.FancyArrowPatch((1,3), (2,2), arrowstyle='-|>', shrinkA=5, shrinkB=5, mutation_scale=20, fc='w')
ax.add_patch(arrow)
plt.show()

我得到相同的情节但可以进行缩放:

enter image description here

有人能解释为什么使用ConnectionPatch没有发生这种情况吗?

1 个答案:

答案 0 :(得分:2)

您观察到的行为由_annotation_clip的{​​{1}}属性引导。通常,当在图形的两个部分之间显示箭头时,如果要连接的其中一个部分位于可见范围之外,则不希望显示箭头。这就是为什么ConnectionPatch默认设置为_annotation_clip的原因。

如果您仍想使用True并显示箭头,即使其中一个点位于轴外,您也可以将该属性设置为ConnectionPatch

False

完整示例:

arrow.set_annotation_clip(False)

enter image description here

请注意,当import matplotlib.pyplot as plt import matplotlib as mpl fig, ax = plt.subplots() nodes = ax.scatter([1,2], [3,2], s=300) arrow = mpl.patches.ConnectionPatch((1,3),(2,2), "data", "data", clip_on=True, arrowstyle="-|>", shrinkA=5, shrinkB=5, mutation_scale=20, fc="w") arrow.set_annotation_clip(False) ax.add_patch(arrow) plt.show() ConnectionPatch参数都设置为coordsA时,使用coordsB原则上与使用"data" FancyArrowPatchConnectionPatch相同1}}子类FancyArrowPatch提供其他变换以及混合变换。