备注
Go to the end 下载完整的示例代码.
箭头指南#
向绘图添加箭头补丁.
箭头通常用于注释绘图.本教程展示了当绘图上的数据限制发生变化时,如何绘制行为不同的箭头.一般来说,绘图上的点可以固定在"数据空间"或"显示空间"中.在数据空间中绘制的东西会在数据限制改变时移动--例如散点图中的点.在显示空间中绘制的东西在数据限制改变时保持静态--例如图形标题或轴标签.
箭头由一个头部(可能还有一个尾部)和一个在起始点和结束点之间绘制的杆组成,从现在开始称为"锚点".这里我们展示了绘制箭头的三个用例,具体取决于头部或锚点是否需要固定在数据或显示空间中:
头部形状固定在显示空间中,锚点固定在数据空间中
头部形状和锚点固定在显示空间中
整个补丁固定在数据空间中
下面依次介绍每个用例.
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()