R语言按性别分组绘制带钟形曲线的直径直方图实现咨询
解决方案
你目前用的是lattice包的直方图函数,只需在原有代码基础上添加密度轴配置和自定义面板函数,就能在每个性别分面的直方图上叠加正态分布钟形曲线,修改后代码如下:
# 需确保已加载dplyr和lattice包 body %>% histogram(~ diameter|gender, col="dodgerblue3", layout=c(1,2), data=., xlab="Diameter", type = "density", # 将直方图Y轴改为密度维度,和正态曲线单位匹配 panel = function(x, ...) { # 先绘制原有直方图 panel.histogram(x, ...) # 计算当前分面对应性别组的直径均值、标准差 mu <- mean(x, na.rm = TRUE) sigma <- sd(x, na.rm = TRUE) # 生成平滑的拟合曲线坐标 x_line <- seq(min(x, na.rm = T), max(x, na.rm = T), length.out = 100) y_line <- dnorm(x_line, mean = mu, sd = sigma) # 绘制红色拟合曲线,可自行调整颜色、线宽参数 panel.lines(x_line, y_line, col = "firebrick", lwd = 2) })
注意事项
- 必须添加
type = "density"参数:默认直方图Y轴是样本计数,正态曲线输出的是密度值,二者量级差异极大,不加的话曲线会几乎贴在X轴上看不到。 - 如果你需要保留计数Y轴,可以将密度值做坐标换算:把上面的y_line计算逻辑替换为
y_line <- dnorm(x_line, mean = mu, sd = sigma) * length(x) * hist(x, plot = F)$breaks[2]即可。 - 代码中的
na.rm = TRUE是为了自动跳过缺失值,避免计算均值、标准差时报错。
内容的提问来源于stack exchange,提问作者manavhs13
相关产品推荐
相关产品推荐

