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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 16:31:33