我正在尝试在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()
获得:
当我使用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()
我得到相同的情节但可以进行缩放:
有人能解释为什么使用ConnectionPatch
没有发生这种情况吗?
答案 0 :(得分:2)
您观察到的行为由_annotation_clip
的{{1}}属性引导。通常,当在图形的两个部分之间显示箭头时,如果要连接的其中一个部分位于可见范围之外,则不希望显示箭头。这就是为什么ConnectionPatch
默认设置为_annotation_clip
的原因。
如果您仍想使用True
并显示箭头,即使其中一个点位于轴外,您也可以将该属性设置为ConnectionPatch
,
False
完整示例:
arrow.set_annotation_clip(False)
请注意,当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"
FancyArrowPatch
时ConnectionPatch
相同1}}子类FancyArrowPatch
提供其他变换以及混合变换。