R语言绘制DTG图时如何拟合添加高斯平滑曲线
R多坐标轴组合图添加DTG高斯平滑曲线实现方案
核心逻辑:base R绘图中plot()调用会重置坐标系参数,不要在DTG图层绘制完成后再次调用plot(),直接用lines()在当前激活的DTG坐标系下叠加提前计算好的平滑曲线即可。
实现步骤
- 提前计算DTG序列的高斯平滑值,避免绘图过程中坐标系错乱
- 按原有逻辑绘制三层曲线,DTG层
plot()执行完成后直接叠加平滑线 - 按需调整平滑参数、线条样式即可
完整可运行代码
# -------------------------- # 第一步:预处理DTG平滑值 # -------------------------- # 按温度升序整理DTG数据,避免平滑后曲线乱序 dtg_df <- data.frame( temp = data2$Program_Temperature[order(data2$Program_Temperature)], dtg = data2$new[order(data2$Program_Temperature)] ) # 高斯核平滑计算,bandwidth为带宽,值越大曲线越光滑,按需调整 dtg_gauss_smooth <- ksmooth( x = dtg_df$temp, y = dtg_df$dtg, kernel = "normal", bandwidth = 5 # 初始参考值,根据实际平滑效果调整 ) # -------------------------- # 第二步:多坐标轴叠图 # -------------------------- par(mar=c(5, 12, 4, 4) + 2) # 图层1:未扣减重量(左侧第一轴) plot(data2$Program_Temperature, data2$Unsubtracted_Weight, type = 'l', col = 2, xlab = 'Program_Temperature', ylab = 'Unsubtracted_Weight') # 图层2:未扣减热流(右侧轴) par(new = TRUE) # 注意:原代码此处x变量写为data$Program_Temperature,建议统一用data2对应列避免序列错位 plot(data2$Program_Temperature, data2$Unsubtracted_Heat_Flow, type = 'l', col = 3, axes = FALSE, xlab = "", ylab = "", lty = 2) axis(side = 4, at = pretty(range(data2$Unsubtracted_Heat_Flow))) mtext("Unsubtracted_Heat_Flow", side = 4, line = 2) # 图层3:DTG(左侧第二轴) par(new = TRUE) plot(data2$Program_Temperature, data2$new, type = 'l', col = 4, axes = FALSE, xlab = "", ylab = "", lty = 3) # 叠加DTG高斯平滑曲线,不要重新调用plot() lines(dtg_gauss_smooth$x, dtg_gauss_smooth$y, col = "darkorange", lwd = 2) axis(side = 2, at = pretty(range(sort(data2$new))), line = 5) mtext("DTG", side = 2, line = 7) # 可选:添加图例区分曲线 legend("topright", legend = c("未扣减重量", "未扣减热流", "原始DTG", "DTG高斯平滑"), col = c(2, 3, 4, "darkorange"), lty = c(1, 2, 3, 1), lwd = c(1, 1, 1, 2), bty = "n")
调参注意事项
- 平滑带宽
bandwidth根据数据温度间隔调整:曲线过毛刺就增大数值,平滑过度丢失峰形特征就减小数值 - 如果需要做多峰高斯拟合而非核平滑,替换
ksmooth部分为nls多高斯模型的预测值即可,叠加逻辑完全一致 - 所有图层x轴变量尽量统一来自同一个数据框的温度列,避免温度序列长度、排序不一致导致的曲线错位
原绘图参考效果:
内容的提问来源于stack exchange,提问作者Samedov Hadiyyatullah
相关产品推荐
相关产品推荐

