R语言循环生成多变量直方图时stat_function动态取参数问题
你遇到的问题核心是stat_function参数中硬编码了table$a,导致不会跟随循环变量动态取值,修改方案如下:
修复注意事项
- 不要用
function作为自定义函数名,这是R的保留关键字,会触发语法错误 - 字符串向量定义要闭合引号,你原代码中
"d缺少右侧引号 - 动态取数据框的列使用
[[运算符,table[[i]]可以随循环变量i读取对应列的数值 - 若要正态曲线和直方图显示匹配,直方图y轴需要映射为密度值,对应
y = after_stat(density)
修复后可运行代码
library(ggplot2) library(dplyr) # 定义要绘制的列名向量 col_list <- c("a", "b", "c", "d") # 自定义绘图函数,传入数据集作为参数 plot_norm_hist <- function(table){ for (i in col_list){ result <- table %>% ggplot(aes(x = !!as.name(i)))+ # 直方图映射为密度轴和正态曲线匹配,binwidth可根据数据分布调整 geom_histogram(aes(y = after_stat(density)), binwidth = 1, fill = "skyblue", alpha = 0.7) + # 动态读取当前循环列的均值和标准差,添加na.rm=T避免空值报错 stat_function(fun = dnorm, args = list(mean = mean(table[[i]], na.rm = T), sd = sd(table[[i]], na.rm = T)), color = "red", linewidth = 1) print(result) } } # 调用函数,传入你的join_boin表 plot_norm_hist(join_boin)
如果你业务逻辑中确实需要用amount作为y轴,可自行修改geom_histogram的映射,同时对dnorm的输出做对应缩放,匹配amount的数值范围即可。
内容的提问来源于stack exchange,提问作者island1996
相关产品推荐
相关产品推荐

