如何在R的ggplot2中标准化平滑曲线使Y轴起始值为100
标准化平滑曲线实现多数据集对比
我来帮你搞定这个标准化需求,让所有平滑曲线的起始点都统一为100,这样不同数据集的价格趋势对比会直观很多!
核心思路是:先为每个数据集生成平滑曲线的拟合值,再对每个组的拟合值做**(当前值/组内第一个拟合值)×100**的标准化,最后把标准化后的曲线和原始数据点一起可视化。
步骤1:合并多数据集(如果还未完成)
如果你目前是用多个独立的数据框(比如df1、df2),先把它们合并成一个带分组标识的数据框,方便后续批量处理:
library(tidyverse) # 合并数据集并添加分组列,按需扩展数据集数量 combined_df <- bind_rows( df1 %>% mutate(dataset = "数据集1"), df2 %>% mutate(dataset = "数据集2"), df3 %>% mutate(dataset = "数据集3") )
步骤2:计算标准化后的平滑拟合值
这里直接用predict函数获取平滑曲线的拟合值,同时完成标准化操作(默认使用geom_smooth的loess方法,如果你用了其他方法比如lm,替换掉loess即可):
# 按数据集分组,计算标准化平滑值 normalized_data <- combined_df %>% group_by(dataset) %>% arrange(date) %>% # 确保日期按时间顺序排列,保证第一个点是起始基准点 mutate( # 生成平滑拟合值 smooth_fit = predict(loess(price ~ as.numeric(date), data = cur_data())), # 标准化:将组内第一个拟合值设为100,其余值按比例缩放 normalized_fit = (smooth_fit / first(smooth_fit)) * 100 ) %>% ungroup()
步骤3:绘制标准化后的图表
用处理好的数据画图,同时将Y轴起始值固定为100:
ggplot(normalized_data, aes(x = date)) + # 绘制原始数据点,保留透明度避免重叠遮挡 geom_point(aes(y = price, color = dataset), alpha = 0.5) + # 绘制标准化后的平滑曲线,加粗线条突出趋势 geom_line(aes(y = normalized_fit, color = dataset), linewidth = 1) + # 设置Y轴从100开始,最大值自动适配数据 ylim(100, NA) + # 添加清晰的标签提升可读性 labs( x = "日期", y = "标准化价格(基准=100)", color = "数据集" ) + theme_minimal()
额外提示
- 如果你的平滑方法不是
loess(比如用了geom_smooth(method = "gam")),只需把代码里的loess替换成对应的模型函数即可。 - 务必确保每个数据集的
date列是按时间顺序排列的,否则第一个拟合值可能不是你预期的起始基准点。
内容的提问来源于stack exchange,提问作者Jay J
相关产品推荐
相关产品推荐

