Matplotlib已绘制的标题调用set_position无法更新位置如何解决
标题位置无法更新的原因
Axes内置标题虽然也是Text实例,但属于特殊的绑定了自动定位逻辑的文本对象,这就是你修改位置不生效的核心原因:
- 普通
annotate生成的Text对象没有绑定自动位置重算逻辑,调用set_position修改后可以直接生效。 - Matplotlib为了保证标题默认适配轴区域、不会被边缘裁剪,每次画布重绘(包括
plt.pause触发的隐式重绘)都会自动重置标题位置,覆盖你手动设置的数值,所以看起来set_position没有生效,而文本内容修改不会被自动逻辑覆盖,所以可以正常更新。
解决方法
只需要禁用标题的自动定位功能即可,在调用t.set_position()前关闭自动定位:
t._autotitlepos = False
修改后的循环代码片段如下:
for yoffset in range(N_FRAMES): new_position = (t.get_position()[0], t.get_position()[1] - .5 + (yoffset / 2)) newpostext = '(' + ', '.join(f'{pos:.2f}' for pos in new_position) + ')' print(f'Set new position to', newpostext) t._autotitlepos = False # 关闭标题自动定位 t.set_position(new_position) # 此时修改位置可正常生效 a2.set_position(new_position) t.set_text(f"Supposedly repositioned title position: \n (x, y) = {newpostext}") plt.pause(.5)
如果不想使用私有属性,也可以放弃ax.set_title,改用ax.text直接在对应位置创建普通文本对象作为标题,普通文本不会触发自动定位逻辑。
内容的提问来源于stack exchange,提问作者jrbergen
相关产品推荐
相关产品推荐

