下面截图中的注释箭头不直,真让我发疯我错过了什么我怀疑这与我指定xy和xytext位置的方式有关,但是它们都有相同的y。
这就是我指定注释的方式:
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)) )
相对位置是在文本边框的坐标中指定的。
对于底部对齐的文本,可以选择
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()