如何在ggplot2的geom_point绘图中添加平均趋势线以估计整体趋势?
在ggplot分面子图中添加整体趋势线的解决方案
首先,你的原始代码采用宽格式数据,这种格式不太方便拟合跨所有测量点的整体趋势线。我们先将数据转换为长格式,再添加趋势线,同时保留原有患者线段和测量点的展示效果。
步骤1:转换数据格式
使用tidyr::pivot_longer合并宽格式的温度数据,同时为每个测量值匹配对应的时间点(注意你原代码里的days和day应为同一类时间变量,这里做对应匹配):
library(tidyr) library(dplyr) # 将宽格式数据转为长格式,每个测量点对应一行 df_long <- df %>% pivot_longer( cols = c(temp_1, temp_2), # 要合并的温度列 names_to = "measurement", # 标记测量类型的新列(基线/第二次) values_to = "temp_value" # 存储温度值的新列 ) %>% # 为每个测量值匹配对应的时间:temp_1对应基线时间days,temp_2对应第二次测量时间day mutate(time = ifelse(measurement == "temp_1", days, day))
步骤2:修改绘图代码添加趋势线
用转换后的长数据绘图,保留原有的患者连接线段,再通过geom_smooth()在每个分面内拟合整体趋势:
library(ggplot2) p <- ggplot(data = df_long, aes(x = time, y = temp_value, color = measurement)) + # 绘制所有测量点,自动匹配红/蓝颜色 geom_point(show.legend = TRUE) + # 绘制患者的连接线段(用原宽数据,避免继承颜色映射) geom_segment( data = df, aes(x = days, y = temp_1, xend = day, yend = temp_2, color = NULL), inherit.aes = FALSE ) + # 自定义颜色映射,保持你原有的图例设置 scale_color_manual( name = "Measurements", breaks = c("temp_1", "temp_2"), values = c("red", "blue") ) + # 坐标轴范围设置 xlim(0, 20) + ylim(70, 100) + # 添加分面内的趋势线:用线性拟合,如需平滑趋势可替换为method="loess" geom_smooth(method = "lm", se = FALSE, color = "black", linewidth = 1) + # 按treatment分面 facet_grid(~ treatment) + theme(legend.position = "bottom") print(p)
关键说明
geom_smooth(method = "lm"):在每个treatment分面子图中拟合线性趋势线,如果需要非线性平滑趋势,将method参数改为"loess"即可。se = FALSE:关闭趋势线的置信区间,若需要展示置信区间,改为se = TRUE即可。- 线段单独使用原宽数据绘制:避免线段被颜色映射影响,保持统一的默认样式(也可手动指定
color参数修改线段颜色)。
内容的提问来源于stack exchange,提问作者Newcomer
相关产品推荐
相关产品推荐

