首页 > 解决方案 > 将文本添加到轴间箭头

问题描述

昨天我问了一个基于误解的问题。我现在更清楚我实际上在问什么。

我想在两个轴之间绘制一个箭头,并在它旁边有文本,就像我在这里手动绘制的一样:

在此处输入图像描述

import matplotlib.pyplot as plt
from matplotlib import patches
import numpy as np

fig = plt.figure()

X, Y = np.mgrid[-1:1:.1, -1:1:.1]
Z = X+Y

ax1 = fig.add_subplot(311)
ax2 = fig.add_subplot(313)
ax1.contourf(X, Y, Z)
ax2.contourf(X, Y, -Z)

con = patches.ConnectionPatch((0,0),
                              (0,0),
                              coordsA="data",
                              coordsB="data",
                              arrowstyle="<|-",
                              mutation_scale=20,
                              axesA=ax2,
                              axesB=ax1)
ax2.add_artist(con)

fig.show()

可以使用 .在一个轴内将带有文本的箭头放在旁边ax.annotate()。可以使用 来在轴之间绘制箭头ConnectionPatch。但是,文档说:

ConnectionPatch 就像一个没有文本的注释。虽然在大多数情况下建议使用注释功能,但当您想要连接不同轴上的点时,ConnectionPatch 很有用。

因此,听起来 API 并未以用户友好的方式涵盖这两者(轴间箭头和文本)。

好的……但至少有一种可口的方式来解决这个问题,对吧?我昨天的问题的答案是基于我的误解。所以,我希望有一个基于我重新提出的问题的更好的解决方案。

那么,是否有一种可靠的方法可以将文本添加到轴间箭头(如ConnectionPatch),而无需摆弄坐标ax.text或诸如此类的废话?

标签: pythonmatplotlib

解决方案


“坐标摆弄”解决方案需要很少的代码并且非常灵活:

import matplotlib.pyplot as plt
from matplotlib import patches
import numpy as np

fig = plt.figure()

X, Y = np.mgrid[-1:1:.1, -1:1:.1]
Z = X+Y

ax1 = fig.add_subplot(311)
ax2 = fig.add_subplot(313)
ax1.contourf(X, Y, Z)
ax2.contourf(X, Y, -Z)

xy1, xy2 = (0,0), (0,0)
con = patches.ConnectionPatch(xy2,
                              xy1,
                              coordsA="data",
                              coordsB="data",
                              arrowstyle="<|-",
                              mutation_scale=20,
                              axesA=ax2,
                              axesB=ax1)
ax2.add_artist(con)

# calculate center of inter-axes arrow in figure pixels
xy = np.mean([ax1.transData.transform(xy1), ax2.transData.transform(xy2)],
  axis=0)
plt.annotate(" arrow label", xy, xycoords='figure pixels', va='center')

plt.show()

结果如下:标记箭头


推荐阅读