R语言ggplot绘图:用Rosin-Rammler方程实现类geom_density平滑效果
用R实现Rosin-Rammler方程拟合并绘制类密度图的方法
完全可以实现,核心步骤是拟合Rosin-Rammler方程的参数,再生成拟合曲线与经验密度图叠加。以下是具体操作:
1. 明确Rosin-Rammler的概率密度形式
用于密度图的Rosin-Rammler概率密度函数为:
rosin_rammler_density <- function(x, xn, k) { (k / x) * (x / xn)^k * exp(-(x / xn)^k) }
其中:
x:粒径变量xn:特征粒径(待拟合参数)k:分布指数(待拟合参数)
2. 拟合参数(分两种数据场景)
场景1:已有粒径-密度配对数据
假设你有提前计算好的密度数据,直接用非线性最小二乘法拟合:
# 示例数据(替换成你的真实数据) df <- data.frame( x = seq(1, 10, 0.5), y = c(0.02, 0.05, 0.08, 0.12, 0.15, 0.18, 0.16, 0.13, 0.10, 0.07, 0.05, 0.03, 0.02, 0.015, 0.01, 0.008, 0.005, 0.003, 0.002) ) # 用nls拟合,start是参数初始猜测(根据数据范围调整) fit <- nls(y ~ rosin_rammler_density(x, xn, k), data = df, start = list(xn = 5, k = 2)) # 查看拟合结果 summary(fit)
场景2:只有原始粒径数据(无密度)
先通过density()函数计算经验密度,再拟合:
# 示例原始粒径数据(替换成你的数据) raw_data <- data.frame(x = rgamma(1000, shape = 2, scale = 3)) # 计算经验密度 dens_obj <- density(raw_data$x) dens_df <- data.frame(x = dens_obj$x, y = dens_obj$y) # 拟合参数 fit <- nls(y ~ rosin_rammler_density(x, xn, k), data = dens_df, start = list(xn = 3, k = 2))
如果nls收敛失败,换用optim最小化残差平方和:
residuals_fun <- function(params) { xn <- params[1] k <- params[2] pred <- rosin_rammler_density(dens_df$x, xn, k) sum((dens_df$y - pred)^2) } optim_fit <- optim(par = c(5, 2), fn = residuals_fun) xn_opt <- optim_fit$par[1] k_opt <- optim_fit$par[2]
3. 绘制类geom_density的拟合图
用ggplot2叠加经验密度(可选)和Rosin-Rammler拟合曲线:
library(ggplot2) # 生成拟合曲线的x序列 x_seq <- seq(min(dens_df$x), max(dens_df$x), length.out = 100) # 计算拟合值(如果用nls拟合) fit_y <- predict(fit, newdata = data.frame(x = x_seq)) # 如果用optim拟合,替换成:fit_y <- rosin_rammler_density(x_seq, xn_opt, k_opt) fit_df <- data.frame(x = x_seq, y = fit_y) # 绘图 ggplot() + # 经验密度曲线(可选,对应geom_density的效果) geom_line(data = dens_df, aes(x, y), color = "gray", linetype = "dashed", size = 0.8) + # Rosin-Rammler拟合曲线 geom_line(data = fit_df, aes(x, y), color = "red", size = 1) + labs(x = "粒径", y = "密度", title = "Rosin-Rammler分布拟合") + theme_minimal()
注意事项
- 参数初始猜测要合理:
xn参考数据的中位粒径,k一般在1-4之间,根据数据分布调整; - 如果你的数据是累积分布,改用Rosin-Rammler累积函数
F(x) = 1 - exp(-(x/xn)^k),拟合逻辑一致。
内容的提问来源于stack exchange,提问作者GurskiyI
相关产品推荐
相关产品推荐

