注意
转到末尾下载完整示例代码。
箭头指南#
向绘图中添加箭头补丁。
箭头常用于标注绘图。本教程展示了当绘图上的数据限制改变时,箭头如何表现出不同的行为。通常,绘图上的点可以固定在“数据空间”或“显示空间”中。在数据空间中绘制的对象会在数据限制改变时移动——例如散点图中的点。在显示空间中绘制的对象在数据限制改变时保持静态——例如图形标题或轴标签。
箭头由头部(可能还有尾部)和在起点与终点之间绘制的茎组成,从现在起称之为“锚点”。这里我们展示了三种绘制箭头的用例,具体取决于头部或锚点是否需要固定在数据空间或显示空间中
箭头头部形状固定在显示空间,锚点固定在数据空间
箭头头部形状和锚点都固定在显示空间
整个补丁固定在数据空间
下面依次介绍每种用例。
箭头头部形状固定在显示空间,锚点固定在数据空间#
如果您正在标注绘图,并且不希望在平移或缩放绘图时箭头改变形状或位置,这会很有用。
在这种情况下,我们使用 patches.FancyArrowPatch
。
请注意,当轴限制改变时,箭头形状保持不变,但锚点会移动。

箭头头部形状和锚点都固定在显示空间#
如果您正在标注绘图,并且不希望在平移或缩放绘图时箭头改变形状或位置,这会很有用。
在这种情况下,我们使用 patches.FancyArrowPatch
,并传入关键字参数 transform=ax.transAxes
,其中 ax
是我们添加补丁的Axes对象。
请注意,当轴限制改变时,箭头形状和位置保持不变。
fig, axs = plt.subplots(nrows=2)
arrow = mpatches.FancyArrowPatch((x_tail, y_tail), (x_head, y_head),
mutation_scale=100,
transform=axs[0].transAxes)
axs[0].add_patch(arrow)
arrow = mpatches.FancyArrowPatch((x_tail, y_tail), (x_head, y_head),
mutation_scale=100,
transform=axs[1].transAxes)
axs[1].add_patch(arrow)
axs[1].set(xlim=(0, 2), ylim=(0, 2))

箭头头部形状和锚点都固定在数据空间#
在这种情况下,我们使用 patches.Arrow
,或 patches.FancyArrow
(后者为橙色)。
请注意,当轴限制改变时,箭头形状和位置都会改变。
FancyArrow
的 API 相对笨拙,尤其需要传入 length_includes_head=True
使得箭头的尖端与箭头的起点相距 (dx, dy)
。它之所以包含在此参考中,只是因为它是由 Axes.arrow
返回的箭头类(绿色显示)。
fig, axs = plt.subplots(nrows=2)
arrow = mpatches.Arrow(x_tail, y_tail, dx, dy)
axs[0].add_patch(arrow)
arrow = mpatches.FancyArrow(x_tail, y_tail - .4, dx, dy,
width=.1, length_includes_head=True, color="C1")
axs[0].add_patch(arrow)
axs[0].arrow(x_tail + 1, y_tail - .4, dx, dy,
width=.1, length_includes_head=True, color="C2")
arrow = mpatches.Arrow(x_tail, y_tail, dx, dy)
axs[1].add_patch(arrow)
arrow = mpatches.FancyArrow(x_tail, y_tail - .4, dx, dy,
width=.1, length_includes_head=True, color="C1")
axs[1].add_patch(arrow)
axs[1].arrow(x_tail + 1, y_tail - .4, dx, dy,
width=.1, length_includes_head=True, color="C2")
axs[1].set(xlim=(0, 2), ylim=(0, 2))

plt.show()
脚本总运行时间: (0 分钟 1.748 秒)