简单的答案是它是默认完成的。文本的左下角与xy 指定的位置相关联。现在,正如您在下图中看到的那样,当您以交互方式缩放到其中一个标记时,将保留标记和文本的相对位置。
import matplotlib.pyplot as plt
x=[2,4]
y=[2,3]
fig, ax = plt.subplots()
ax.plot(x, y, 'ro',markersize=23)
offset = 1.0
ax.set_xlim(min(x)-offset, max(x)+ offset)
ax.set_ylim(min(y)-offset, max(y)+ offset)
for x,y in zip(x,y):
ax.annotate(str(y), xy=(x,y))
plt.show()
但是,这看起来相当难看,因为文本现在位于标记的右上象限,有时甚至位于标记的边缘。我想这就是您在xy=(x-0.028,y-0.028) 中添加偏移量 0.028 的原因,因此引入了您现在试图摆脱的行为。发生的情况是默认情况下matplotlib 使用数据的坐标系来定位您的文本。当您缩放时,0.028 个数据单位表示您的帧的比例越来越大,并且文本“漂移”远离您的标记,最终结束于可见的值范围之外。
要摆脱这种行为,您需要更改坐标系。 annotate 参数 textcoords 可以设置为 offset point。这里xytext 允许您指定距离xy 位置的偏移量(以磅为单位):
ax.annotate(str(y), xy=(x,y), xytext=(-5.0,-5.0), textcoords='offset points')
现在具有挑战性的部分是评估要添加到绘图中的文本大小,以确定偏移值。文本可能会更改,但无法在绘制之前确定渲染文本字符串的大小。 See this post on that matter. 在下面的示例代码中,我尝试引入一点灵活性:
import matplotlib.pyplot as plt
x=[2,4]
y=[2,12]
fig, ax = plt.subplots()
ax.plot(x, y, 'ro',markersize=23)
offset = 1.0
ax.set_xlim(min(x)-offset, max(x)+ offset)
ax.set_ylim(min(y)-offset, max(y)+ offset)
for x,y in zip(x,y):
text = str(y)
fontsize, aspect_ratio = (12, 0.5) # needs to be adapted to font
width = len(text) * aspect_ratio * fontsize
height = fontsize
a = ax.annotate(text, xy=(x,y), xytext=(-width/2.0,-height/2.0), textcoords='offset points')
plt.show()
这里,文本是一个长度为 2 的字符串,尽管进行了很多缩放,但它仍然大致位于标记的中心。然而,您需要根据您的字体和字体大小调整此解决方案。非常欢迎提出改进建议。