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

