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

R语言如何将geom_smooth的Y轴改为百分比变化

问题描述

现有如下R代码,用于绘制标志物随时间变化的平滑曲线:

time = c(1,2,3,1,2,3)
id = c(1,1,1,2,2,2)
biomarker = c(10,50,20,20,80,40)
       
sdata = data.frame(id,time,biomarker)

ggplot() +
  geom_smooth(data = sdata, aes(x=time, y = biomarker), method=loess, color = 'red')

需将Y轴从绝对数值改为百分比变化:以时间1的平均基线值为基准,计算后续时间点的相对增长/下降百分比(例如时间1平均基线为15、时间2数值为30时,Y轴显示100%增长),这是研究的核心重点。

解决方案

要实现该需求,需先计算基线值,再转换数据为百分比变化,最后重新绘图,具体步骤与代码如下:

方法一:基于整体平均基线计算

以所有样本在时间1的标志物平均值作为基准,计算全局百分比变化:

library(ggplot2)

# 原始数据
time = c(1,2,3,1,2,3)
id = c(1,1,1,2,2,2)
biomarker = c(10,50,20,20,80,40)
sdata = data.frame(id,time,biomarker)

# 计算时间1的整体平均基线
baseline_global <- mean(sdata$biomarker[sdata$time == 1])

# 计算每个数据点的百分比变化
sdata$pct_change_global <- ((sdata$biomarker - baseline_global)/baseline_global) * 100

# 绘制平滑曲线
ggplot() +
  geom_smooth(data = sdata, aes(x=time, y = pct_change_global), method=loess, color = 'red') +
  ylab("标志物百分比变化(%)") +
  xlab("时间")

方法二:基于个体基线计算

若需关注个体层面的相对变化,可按每个样本自身时间1的标志物值作为基线:

library(ggplot2)
library(dplyr)

# 原始数据
time = c(1,2,3,1,2,3)
id = c(1,1,1,2,2,2)
biomarker = c(10,50,20,20,80,40)

# 分组计算个体基线与百分比变化
sdata <- data.frame(id,time,biomarker) %>%
  group_by(id) %>%
  mutate(
    baseline_individual = biomarker[time == 1],
    pct_change_individual = ((biomarker - baseline_individual)/baseline_individual) * 100
  ) %>%
  ungroup()

# 绘制平滑曲线
ggplot() +
  geom_smooth(data = sdata, aes(x=time, y = pct_change_individual), method=loess, color = 'red') +
  ylab("个体标志物百分比变化(%)") +
  xlab("时间")

代码说明

  • 整体基线法:适合观察群体层面的平均变化趋势
  • 个体基线法:适合分析个体间的变化差异,需加载dplyr包进行分组计算

内容的提问来源于stack exchange,提问作者Henrik Ode

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 11:02:28