下面截图中的注释箭头不直,真让我发疯我错过了什么我怀疑这与我指定xy和xytext位置的方式有关,但是它们都有相同的y。
python - matplotlib.pyplot.annotate中箭头的控制角度-LMLPHP
这就是我指定注释的方式:

plt.annotate('Head Motion Cutoff',
             xy=[data.shape[0], motion_cutoff],
             xytext=[data.shape[0]+12, motion_cutoff],
             fontsize=14,
             arrowprops=dict(fc='#A9A9A9',
                             ec='#A9A9A9',
                             arrowstyle='simple',
                             shrinkA=4,
                             shrinkB=4))

最佳答案

问题是箭头默认连接到文本的中心。
但是,可以使用arrowproperties的relpos参数更改箭头连接的位置。

plt.annotate(...,  arrowprops=dict(..., relpos=(0, 0)) )

相对位置是在文本边框的坐标中指定的。
python - matplotlib.pyplot.annotate中箭头的控制角度-LMLPHP
对于底部对齐的文本,可以选择relpos=(0,0)
对于居中对齐的文本,可以选择relpos=(0,0.5)
对于顶部对齐的文本,可以选择relpos=(0,1)
一个问题是,如果文本不包含任何字符(比如这里的"g"),它会一直向下,那么relpos=(0,0.2)可能是有意义的。
例子:
import matplotlib.pyplot as plt
fig, ax = plt.subplots(1, dpi=200)
ax.grid(color='k', alpha=0.5, ls=':')

plt.annotate('Head Motion Cutoff',
         xy=[0.1, 0.8],
         xytext=[60, 0],
         verticalalignment = "baseline",
         arrowprops=dict(arrowstyle='simple',
                         fc='#A9A9A9', ec='#A9A9A9',
                         shrinkA=4, shrinkB=4,
                         relpos=(0, 0.2)),
         fontsize=11,
         textcoords="offset points")



ap = dict(fc='#A9A9A9', ec='#A9A9A9', arrowstyle='simple',
          shrinkA=4, shrinkB=4)

fontsize = 11
aligns = ["bottom", "top", "center"]
positions =  [dict(relpos=(0, 0.)),dict(relpos=(0, 1)),dict(relpos=(0, 0.5))]
kw = dict(fontsize=fontsize, textcoords="offset points")


for i, (align,pos) in enumerate(zip(aligns,positions)):
    ap.update(pos)
    kw.update(dict(arrowprops=ap))
    plt.annotate('Head Motion Cutoff (va={})'.format(align),
             xy=[0.1, i*0.2+0.2],
             xytext=[60, 0],
             va=align, ha="left", **kw)

plt.show()

python - matplotlib.pyplot.annotate中箭头的控制角度-LMLPHP

10-07 20:01