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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:30:22