You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 15:50:29