You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

InterpolatedUnivariateSpline与ax.fill_between低Y值填充异常问题

问题分析与修复方案

1. 异常发生的原因

你遇到的填充区域反向问题,核心是**fill_between参数传错了**!

看你代码里的这行关键代码:

ax.fill_between(X, newTime, newIntensity, alpha=0.5)

fill_between的第二个参数应该是填充的基线Y值,但你传入的是newTime——也就是X轴的保留时间数值(16左右)。

  • 当用高Y值(Y2,百万级别)时,Y值远大于16,填充区域是newIntensity(百万级)和基线16之间,看起来是正常的“峰与基线”填充;
  • 当用低Y值(原始Y,1-8区间)时,Y值小于16,填充区域就变成了16(newTime)和newIntensity(1-8)之间,自然就反向了。

这和Y值大小无关,本质是参数传递错误导致基线用错了。

2. 稳健的修复方法

只需要把fill_between的第二个参数改成正确的基线Y值即可,常见的选择有两种:

  • 用0作为基线(色谱图最常用的基线);
  • 用数据的最低值作为基线,比如np.min(Y)或np.min(newIntensity)。

另外,你的newTime其实和原始X完全一致(因为np.linspace(X[0], X[-1], len(X))生成的就是和X长度相同的线性空间,而X本身已经是线性递增的),所以可以直接用原始X,不需要额外生成newTime。

修改后的完整代码:

X = [16.08278,16.090878,16.098978,16.107077,16.115177,16.123279,16.13138,16.139482,16.147586,16.155689,16.163793,16.171899,16.180004,16.18811,16.196218,16.204325,16.212433,16.220543,16.228652,16.236762,16.244874,16.252985,16.261097,16.269211,16.277324,16.285439,16.293554,16.30167,16.309786,16.317904,16.326021,16.334139,16.342259,16.350379,16.358499,16.366621,16.374742]
Y = [1.496555,1.766111,2.074339,2.426317,2.825952,3.274024,3.764088,4.288722,4.839724,5.406741,5.978055,6.536869,7.064041,7.540824,7.948076,8.267242,8.48543,8.596198,8.598762,8.492928,8.279867,7.962899,7.55062,7.059239,6.508092,5.91964,5.318298,4.7234,4.148229,3.602356,3.094568,2.635609,2.231337,1.882143,1.58295,1.328678,1.113859]
Y2 = [1496555,1766111,2074339,2426317,2825952,3274024,3764088,4288722,4839724,5406741,5978055,6536869,7064041,7540824,7948076,8267242,8485430,8596198,8598762,8492928,8279867,7962899,7550620,7059239,6508092,5919640,5318298,4723400,4148229,3602356,3094568,2635609,2231337,1882143,1582950,1328678,1113859]
# Toggle low vs high Y-values
#Y = Y2
import matplotlib.pyplot as plt
import numpy as np
from scipy.interpolate import InterpolatedUnivariateSpline

fig = plt.figure(figsize=(8, 6))
ax = fig.add_subplot(111)
plt.plot(X, Y, 'b-')
plt.legend(['Raw Data'], loc='best')
plt.xlabel("Retention Time [m]")
plt.ylabel("Intensity [au]")

# 直接使用原始X即可,无需额外生成newTime
f = InterpolatedUnivariateSpline(X, Y)
newIntensity = f(X)

# 使用0作为基线,填充峰与基线之间的区域
ax.fill_between(X, 0, newIntensity, alpha=0.5)

plt.show(fig)

这样修改后,不管Y值是高还是低,填充区域都会正确显示在峰和基线之间,完全不需要缩放Y值来规避问题。

内容的提问来源于stack exchange,提问作者Bas Jansen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:31:19