ggplot2绘制gamlss模型拟合的密度曲线失败问题排查
解决ggplot2绘制gamlss模型Gamma密度曲线不显示的问题
你的ggplot代码无法显示曲线的核心问题有两个:
geom_line(aes(shapex, ratex))完全错误,shapex和ratex是单个数值,不是可映射的变量,也没有生成x轴序列来计算对应密度值- 直方图没有设置为密度刻度,导致曲线和直方图的y轴范围不匹配
修正后的完整代码
library(gamlss) library(ggplot2) data(Orange) # 拟合gamlss模型 mod.g <- gamlss(circumference ~ age, family=GA, data = Orange) pred.g <- predict(mod.g, type = "r") shapex <- (mean(pred.g)/sd(pred.g))^2 ratex <- mean(pred.g)/sd(pred.g)^2 # 生成x轴序列,覆盖circumference的取值范围 x_seq <- seq(min(Orange$circumference), max(Orange$circumference), length.out = 1000) # 计算每个x对应的Gamma密度值 gamma_density <- data.frame( x = x_seq, density = dgamma(x_seq, shape = shapex, rate = ratex) ) # ggplot绘图 ggplot(Orange, aes(x = circumference)) + # 直方图设置为密度刻度,和基础绘图的freq=FALSE对应 geom_histogram(aes(y = ..density..), color = "black", fill = "#225EA8", binwidth=30) + # 调用生成的密度数据框,绘制曲线 geom_line(data = gamma_density, aes(x = x, y = density), color = "blue", linewidth = 2) + labs(y = "Density") + theme(legend.title = element_text(size = 15), legend.text = element_text(size = 17), axis.title = element_text(size = 22), axis.text.x = element_text(color = "black", hjust=1), axis.text.y = element_text(color = "black", hjust=1), axis.text = element_text(size = 15), strip.text.x = element_text(size = 18))
关键修正点说明
- 生成
x_seq序列:确保覆盖数据中circumference的全部范围,用足够多的点让曲线平滑 - 构建密度数据框:把x序列和对应的Gamma密度值存成数据框,供ggplot调用
- 直方图设置
aes(y = ..density..):让直方图的y轴显示密度,和曲线的y轴保持一致,否则曲线可能因为y轴范围不匹配被压缩到看不见 geom_line指定data = gamma_density:明确告诉ggplot用新的数据框来绘制曲线,而不是默认的Orange数据集
内容的提问来源于stack exchange,提问作者user55546
相关产品推荐
相关产品推荐

