备注
前往结尾 下载完整示例代码。
Arrow 指南#
向图中添加箭头补丁。
箭头常用于标注图表。本教程展示了如何在图表的数据限制改变时绘制行为不同的箭头。通常,图表上的点可以在“数据空间”或“显示空间”中固定。在数据空间中绘制的内容会在数据限制改变时移动——例如散点图中的点。在显示空间中绘制的内容在数据限制改变时保持静止——例如图表标题或轴标签。
箭头由一个头部(可能还有一个尾部)和一个在起点和终点之间绘制的茎组成,从现在起我们称之为“锚点”。这里我们展示了三种绘制箭头的用例,取决于头部或锚点是否需要在数据或显示空间中固定:
头部形状在显示空间中固定,锚点在数据空间中固定
显示空间中头部形状和锚点固定
整个补丁在数据空间中修复
下面依次介绍每个用例。
import matplotlib.pyplot as plt
import matplotlib.patches as mpatches
x_tail = 0.1
y_tail = 0.5
x_head = 0.9
y_head = 0.8
dx = x_head - x_tail
dy = y_head - y_tail
头部形状在显示空间中固定,锚点在数据空间中固定#
如果你在标注一个图表,并且不希望箭头在平移或缩放图表时改变形状或位置,这会很有用。
在这种情况下,我们使用 patches.FancyArrowPatch。
请注意,当轴的限制改变时,箭头的形状保持不变,但锚点会移动。
fig, axs = plt.subplots(nrows=2)
arrow = mpatches.FancyArrowPatch((x_tail, y_tail), (x_head, y_head),
mutation_scale=100)
axs[0].add_patch(arrow)
arrow = mpatches.FancyArrowPatch((x_tail, y_tail), (x_head, y_head),
mutation_scale=100)
axs[1].add_patch(arrow)
axs[1].set(xlim=(0, 2), ylim=(0, 2))

显示空间中头部形状和锚点固定#
如果你在标注一个图表,并且不希望箭头在平移或缩放图表时改变形状或位置,这会很有用。
在这种情况下,我们使用 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()