通过matplotlib的Artist对象更新文本不生效问题求解
问题原因
你要修改的+1e6是坐标轴的偏移文本,由坐标轴的ScalarFormatter自动维护。你调用set_text()修改内容后,plt.show()触发的图表重绘会让formatter重新生成默认的偏移文本,直接覆盖你手动修改的内容,因此文本修改不生效。而颜色、位置属性不会被formatter重置,因此可以正常生效。
解决方法
方案1:关闭偏移自动计算,保留手动修改的内容
在你原有修改文本的代码后,新增一行关闭formatter的自动偏移功能即可:
import matplotlib.pyplot as plt # 生成图表 data = [1e6 + i for i in range(10)] plt.figure(figsize=(10, 5)) plt.subplot(1, 2, 1) plt.plot(data) plt.title("Normal") plt.subplot(1, 2, 2) plt.plot(data) plt.title("Updated Artist") plt.draw() # 查找目标Text对象 t = plt.gca().findobj(plt.Text) t = next(filter(lambda x: x.get_text() == '+1e6', t)) # 修改位置 pos = t.get_position() pos = (pos[0]+0.1, pos[1]) t.set_position(pos) # 修改属性 t.set_text('1,000,000') t.set_color('red') # 新增这行,禁止formatter自动更新偏移文本 plt.gca().yaxis.get_major_formatter().set_useOffset(False) plt.show()
方案2:直接通过formatter设置偏移文本(更规范)
不需要手动查找Text对象,直接操作formatter的属性修改偏移内容,逻辑更清晰:
import matplotlib.pyplot as plt data = [1e6 + i for i in range(10)] plt.figure(figsize=(10, 5)) plt.subplot(1, 2, 1) plt.plot(data) plt.title("Normal") plt.subplot(1, 2, 2) plt.plot(data) plt.title("Updated Artist") # 直接操作y轴的formatter设置偏移 y_formatter = plt.gca().yaxis.get_major_formatter() y_formatter.set_offset_string('1,000,000') y_formatter.set_useOffset(False) # 修改偏移文本的样式和位置 offset_text = plt.gca().yaxis.get_offset_text() offset_text.set_color('red') offset_text.set_position((offset_text.get_position()[0]+0.1, offset_text.get_position()[1])) plt.show()

内容的提问来源于stack exchange,提问作者Alter
相关产品推荐
相关产品推荐

