如何用Python为多序列比对的香农熵值列表绘制平滑曲线
多序列比对香农熵平滑曲线实现方案
你需要的插值方法为PCHIP(分段三次Hermite插值多项式),该方法完全匹配你的两个要求:
- 插值曲线严格经过所有原始计算得到的熵值顶点
- 原始值为0的位置插值结果也为0,不会出现普通三次样条的过冲问题,也不会产生不符合物理意义的负熵值
代码修改说明
你无需修改熵计算部分的代码,仅需要替换绘图部分的逻辑即可,修改后的完整绘图代码如下:
from scipy.interpolate import PchipInterpolator # 原始数据准备 x = np.arange(len(clustal_omega1)) # 原始残基位置x坐标 y = np.array(clustal_omega1) # 原始熵值y坐标 # 生成高密度插值x坐标,数值越高曲线平滑度越高 x_smooth = np.linspace(x.min(), x.max(), 300) # 执行PCHIP插值 pchip = PchipInterpolator(x, y) y_smooth = pchip(x_smooth) # 绘制平滑曲线 plt.figure(figsize=(18,10)) plt.plot(x_smooth, y_smooth, 'r', linewidth=2) # 可选:保留原始数据点做校验,取消下方注释即可 # plt.scatter(x, y, c='r', s=10) plt.xlabel('Residue', fontsize=16) plt.ylabel("Shannon's entropy", fontsize=16) plt.ylim(bottom=0) # 额外固定y轴最小值为0,避免显示异常 plt.show()
方案优势说明
普通三次样条插值(比如你导入的make_interp_spline默认实现)为了保证曲线二阶可导、整体光滑,会在数据突变或者连续平坦区域(比如熵值恒为0的保守序列区)出现过冲,生成不符合实际意义的负熵值。PCHIP插值专门针对这类场景优化,保证插值结果始终符合原始数据的单调性,不会出现过冲问题。
内容的提问来源于stack exchange,提问作者satyam sangeet
相关产品推荐
相关产品推荐

