fig.canvas.draw()执行后matplotlib坐标轴xlim设置失效如何修复
问题根因
这是set_aspect('equal', 'datalim')的设计逻辑,不是bug:
当使用datalim模式的等宽高比时,matplotlib会在每次触发画布重绘(包括调用fig.canvas.draw())时,自动调整单轴的数值范围,保证x轴、y轴上1单位数值对应的屏幕物理长度完全相等。调整过程中会优先满足等比约束,覆盖手动设置的单轴范围;且datalim模式默认不会裁剪已有数据,只会向外扩展边界,这就是你设置的xlim和draw之后的数值存在偏差的直接原因。
另外你贴的日志里存在一处笔误:传入set_xlim的元组是(27.308915605285073, 5.034483990001178),左边界值大于右边界,会触发x轴反向显示,如果无反向需求需要调换两个值的顺序。
可行解决方案
根据你的使用场景选以下任意一种即可:
- 调整调用顺序,先设置轴范围再配置等宽高比
把set_aspect的调用放到set_xlim、set_ylim等所有范围设置逻辑之后,重绘时matplotlib就不会修改你已经手动指定的x轴边界,只会自动调整y轴范围来匹配等比约束:# 先设置预设的x轴范围 print("setting xlim to : {}".format(self.lower_xlim)) self.ax.set_xlim(*self.lower_xlim) # 所有范围设置完成后再开启等宽高比 self.ax.set_aspect('equal', 'datalim') self.fig.canvas.draw() print("current xlim are {}".format(self.ax.get_xlim())) - 替换aspect模式为
box,严格保留手动设置的轴范围
如果你需要x、y轴范围都严格遵循手动设置值、不允许自动调整,可以把set_aspect的第二个参数从'datalim'改为'box'。该模式下matplotlib会通过调整坐标轴在画布中的物理占比来满足等宽高比要求,不会篡改你设置的lim数值,缺点是当x、y范围比例和画布比例差异较大时,轴周围会出现较多留白:self.ax.set_aspect('equal', 'box') self.ax.set_xlim(*self.lower_xlim) # 任意次重绘都不会修改xlim self.fig.canvas.draw() - 绑定重绘回调强制覆写x轴范围
如果需要保留datalim模式的自动适配特性、同时严格固定x轴范围,可以给画布绑定draw_event回调,在每次matplotlib完成自动调整后,强制把x轴范围改回预设值,该方案不受调用顺序影响,兼容性最好:def fix_xlim(event): self.ax.set_xlim(*self.lower_xlim) # 注册回调,每次重绘完成后自动修正x范围 self.fig.canvas.mpl_connect('draw_event', fix_xlim)
内容的提问来源于stack exchange,提问作者XYZ
相关产品推荐
相关产品推荐

