
matplotlib 在绘制多条数据线时,若某条数据存在极端异常值(如超大绝对值),会导致 y 轴自动缩放至极大范围,使其他正常波动的曲线在视觉上退化为“水平线”,实则并非数据错误,而是尺度失衡所致。
该问题本质是 Matplotlib 自动设置 y 轴范围(ylim)时,被某列数据中的离群异常值主导——例如在 FTBS_nonlin_out[4] 中,数值可能因数值不稳定性(如 FTBS 格式在非线性对流下的放大误差)暴增至约 -2e18 量级。而 FTBS_nonlin_out[0.0] 初始态仅在 [-5, 5] 区间波动。当二者共绘于同一坐标系时,Matplotlib 将 y 轴设为 [-2e18, 0],此时幅度仅 ~10 的正弦波形在像素级渲染中完全不可分辨,视觉上即呈现为一条“扁平蓝线”。
可通过以下方式快速诊断与修复:
✅ 诊断方法(推荐优先执行):
print("y-range for t=0.0:", FTBS_nonlin_out[0.0].min(), FTBS_nonlin_out[0.0].max())
print("y-range for t=4: ", FTBS_nonlin_out[4].min(), FTBS_nonlin_out[4].max())✅ 修复方案(三选一):
-
显式限制 y 轴范围(最直接):
ax1.set_ylim(-30, 10) # 根据初始态合理范围设定
-
过滤异常值后再绘图(保障可视化鲁棒性):
# 仅保留合理数值(例如 |y| < 1e3) valid_mask = np.abs(FTBS_nonlin_out[4]) < 1e3 ax1.plot(FTBS_nonlin_out.index[valid_mask], FTBS_nonlin_out.loc[valid_mask, 4], label='t=4')
-
使用对数/对称对数坐标(慎用,需业务允许):
ax1.set_yscale('symlog', linthresh=1e-2) # 处理跨量级数据
⚠️ 根本原因提醒:
本例中 FTBS_nonlin 函数未做数值稳定性控制(如通量限制器、CFL 条件校验),dt=0.5 与 dx=1.0(因 L=J=100)导致 CFL 数 c·dt/dx = 0.5
总结:Matplotlib 不会“画错线”,它忠实地按数据和坐标系渲染;所谓“扁平线”,往往是坐标轴尺度被异常值绑架的视觉假象。养成绘制前检查数据极值、善用 ax.set_ylim() 或 plt.margins() 的习惯,可规避 90% 此类困惑。










