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

R语言使用ggplot绘制3个X变量曲线及Y均值线的实现问题

你直接调用geom_line是对原始散点按数据行顺序连线,数据中X值为随机分布未排序,所以会出现密集杂乱的折线。你需要的是每个X变量与Y的趋势线,先将宽数据转成长格式再添加对应图层即可,实现方案如下:

步骤1:数据预处理

首先把宽格式数据集转为长格式,方便ggplot分组映射:

library(tidyr)
library(ggplot2)
# 生成示例数据集
df1 <- data.frame( Y = rnorm(1000,400:450),
                   X1 = rnorm(1000,-4:5),
                   X2 = rnorm(1000,-4:5),
                   X3 = rnorm(1000,-4:5)
)
# 宽格式转长格式
df_long <- pivot_longer(df1, cols = starts_with("X"), names_to = "X_variable", values_to = "X_value")

步骤2:绘图代码

方案A:绘制平滑拟合曲线(最接近参考图效果)

ggplot(df_long, aes(x = X_value, y = Y, color = X_variable)) +
  # 绘制每个X变量对应Y的平滑拟合曲线,se=FALSE去掉置信区间
  geom_smooth(se = FALSE, linetype = 2) +
  # 添加Y的均值水平线
  geom_hline(yintercept = mean(df1$Y), color = "black", linetype = 1, linewidth = 1) +
  # 匹配你给定的变量取值范围
  xlim(-4, 4) +
  ylim(400, 540) +
  # 样式调整
  labs(x = "X取值", y = "Y取值", color = "X变量类别") +
  theme_bw()

方案B:绘制分箱均值折线

如果你不需要平滑拟合,想展示X分箱后对应Y的均值变化,可使用stat_summary实现:

ggplot(df_long, aes(x = round(X_value, 1), y = Y, color = X_variable)) +
  stat_summary(fun = mean, geom = "line", linetype = 2) +
  geom_hline(yintercept = mean(df1$Y), color = "black", linetype = 1, linewidth = 1) +
  xlim(-4, 4) +
  ylim(400, 540)

可选调整项

  • 可修改geom_smooth的method参数调整拟合方式,比如method = "lm"得到线性拟合直线,默认loess为局部加权拟合,更适配非线性趋势。
  • 可自行调整linetype、color、linewidth参数修改线条样式。

内容的提问来源于stack exchange,提问作者Mudar Saied

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 23:36:03