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
相关产品推荐
相关产品推荐

