将文本添加到轴间箭头

时间:2018-12-24 10:07:22

标签: python matplotlib

昨天我基于一个误解问了a question。我现在知道我到底在问什么。

我想在两个轴之间绘制一个箭头,并在其旁边放置文本,就像我在此处手动绘制一样:

enter image description here

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()

{strong> {}可以在一个箭头旁边带有文本箭头。轴之间的绘制箭头可以使用ax.annotate()完成。但是,文档说:

  

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

因此,听起来这两种API(轴间箭头和文本)都没有以用户友好的方式被API覆盖。

好的...但是必须至少有一种可口的方法来实现这一目标,对吧?昨天我对这个问题的回答是基于我的误解。因此,我希望有一个更好的解决方案,基于我重新设计的问题。

因此,是否有一种健壮的方法可将文本添加到轴间箭头(如ConnectionPatch),而又不摆弄坐标和ConnectionPatch或此类废话?

1 个答案:

答案 0 :(得分:2)

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

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()

结果如下:labeled arrow