R语言如何将500个N=50样本的拟合回归线绘制到同一样本图中?
问题原因
你每次循环都会对绘图变量做重新赋值,且每次赋值都是基于初始的基础绘图对象仅添加当前次抽样的回归线,因此循环结束后最终的绘图对象里仅保留了最后一次循环生成的1条回归线,此前的499条都被覆盖了。
解决方案1:循环内增量叠加图层
修改循环逻辑,每次在已有的绘图对象基础上叠加新图层,而非每次都从初始状态重建绘图:
# 初始化基础绘图 p <- ggplot() + geom_point(data = sample.dat, mapping = aes(x = X1, y = y)) + geom_line(data = lm.fit.dat, aes(y = true.y.fit), color = "blue") + theme_bw() # 循环叠加500条回归线 for(i in 1:500){ df <- linear.dat[sample(1:nrow(linear.dat), size = 50),] # 增量更新p,叠加当前抽样的回归线,se=FALSE直接关闭置信区间无需设置alpha p <- p + geom_smooth(method = lm, data = df, color = "red", size = 0.5, se = FALSE) } # 输出最终绘图 plot(p)
解决方案2:先构造批量抽样数据集再绘图(更推荐)
图层数量较多时循环叠加会降低绘图效率,你可以先把500次抽样的数据整理为带分组标识的合并数据集,一次性映射生成所有回归线:
library(tidyverse) # 生成500次抽样的合并数据集,每次抽样分配唯一的分组ID sample_all <- map_dfr(1:500, function(sample_id){ linear.dat %>% slice_sample(n = 50) %>% mutate(group = sample_id) }) # 一次性绘制所有图层 ggplot() + geom_point(data = sample.dat, aes(x = X1, y = y)) + # 按分组字段分别拟合回归 geom_smooth(data = sample_all, aes(x = X1, y = y, group = group), method = "lm", color = "red", size = 0.5, se = FALSE) + geom_line(data = lm.fit.dat, aes(y = true.y.fit), color = "blue") + theme_bw()
内容的提问来源于stack exchange,提问作者m2479
相关产品推荐
相关产品推荐

