如何在x轴设为log刻度时自动更新因x负值产生NaN后的ylim
解决Matplotlib logx轴下y轴范围未自动适配可见数据的问题
当x轴设为log刻度时,Matplotlib只是隐藏了x≤0的点,但计算y轴范围时仍会把这些点的y值纳入考量,这就是y轴范围未自动更新的核心原因。下面是几个实用的解决思路:
方法1:提前过滤无效数据(最直接)
在绘图前就筛选出x>0的有效数据,这样绘图时只会基于可见数据计算y轴范围:
import numpy as np import matplotlib.pyplot as plt x = np.arange(-10, 11, 1) y = x # 筛选x>0的有效数据 mask = x > 0 plt.plot(x[mask], y[mask], marker='d') plt.xscale('log') plt.show()
方法2:基于可见数据手动调整y轴范围
如果不想修改原始数据,可以在设置log刻度后,提取曲线中可见点的y值来更新y轴范围:
import numpy as np import matplotlib.pyplot as plt x = np.arange(-10, 11, 1) plt.plot(x, x, marker='d') plt.xscale('log') # 获取当前轴对象 ax = plt.gca() # 获取曲线的原始数据 line = ax.lines[0] x_data = line.get_xdata() y_data = line.get_ydata() # 筛选出x>0对应的y值 valid_y = y_data[x_data > 0] # 设置y轴范围为有效数据的极值 ax.set_ylim(valid_y.min(), valid_y.max()) plt.show()
方法3:强制基于可见元素重新计算范围(进阶)
ax.relim()默认会包含所有数据(包括不可见的),我们可以通过参数指定只考虑可见元素:
import numpy as np import matplotlib.pyplot as plt x = np.arange(-10, 11, 1) plt.plot(x, x, marker='d') plt.xscale('log') ax = plt.gca() # 仅基于可见元素重新计算数据范围 ax.relim(visible_only=True) # 自动更新轴视图 ax.autoscale_view() plt.show()
内容的提问来源于stack exchange,提问作者swagner
相关产品推荐
相关产品推荐

