如何在Matplotlib UI中锁定ylim,避免平移时误调整?
锁定Matplotlib子图的Y轴范围,防止误操作平移
方法1:关闭Y轴自动缩放+限制平移工具仅作用于X轴
先设置初始Y轴范围并关闭自动缩放,再修改平移工具的行为,仅允许沿X轴方向平移:
import numpy as np import matplotlib.pyplot as plt from matplotlib.backend_bases import MouseButton xvals = np.arange(0,1000,0.1) yvals1 = np.sin(3*xvals) yvals2 = yvals1 + 30 f, (ax1, ax2) = plt.subplots(2,1,sharex = True) ax1.plot(xvals, yvals1) ax1.set_xlim(2,5) # 设置初始Y轴范围并关闭自动缩放 ax1.set_ylim(-1.3,1.3) ax1.autoscale(axis='y', enable=False) ax2.plot(xvals, yvals2) # 同理设置ax2的Y轴范围并锁定 ax2.set_ylim(28.7, 31.3) ax2.autoscale(axis='y', enable=False) # 自定义平移事件,仅允许X轴方向平移 def restrict_pan_to_x(event): if event.button == MouseButton.LEFT: event.canvas.toolbar.pan(event, 'x') # 绑定事件到画布 f.canvas.mpl_connect('button_press_event', restrict_pan_to_x) plt.show()
方法2:禁用Y轴的导航功能
通过设置Y轴的navigate属性为False,直接让交互工具(平移、缩放)不作用于Y轴:
import numpy as np import matplotlib.pyplot as plt xvals = np.arange(0,1000,0.1) yvals1 = np.sin(3*xvals) yvals2 = yvals1 + 30 f, (ax1, ax2) = plt.subplots(2,1,sharex = True) ax1.plot(xvals, yvals1) ax1.set_xlim(2,5) ax1.set_ylim(-1.3,1.3) # 禁用Y轴导航,阻止交互工具修改Y轴范围 ax1.yaxis.set_navigate(False) ax2.plot(xvals, yvals2) ax2.set_ylim(28.7, 31.3) ax2.yaxis.set_navigate(False) plt.show()
说明
- 两种方法都能锁定Y轴范围,避免误操作导致数据移出屏幕;
- 方法1保留Y轴所有视觉元素,仅限制平移方向,适合需要查看Y轴刻度但不想误操作的场景;
- 方法2更简洁,直接让交互工具忽略Y轴,适合无需对Y轴做任何交互的场景。
内容的提问来源于stack exchange,提问作者eric
相关产品推荐
相关产品推荐

