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

R语言如何在直方图上叠加Pearson分布密度线与累积分布线?

R语言直方图叠加Pearson I型密度/累积概率曲线实现方案

原有代码失效原因

  • 单独调用plot()绘制dpear、ppear会新建独立绘图窗口,打断直方图的绘图面板,导致后续lines()函数无法把曲线叠加到目标直方图上
  • 累积概率曲线(ppearsonI输出值范围为0~1)和直方图的概率密度轴量纲不匹配,直接用同个坐标轴绘制会导致曲线被压缩到x轴附近,完全无法识别

修正后可直接运行的代码

# 加载依赖包
library(readr)
library(fitdistrplus)
library(moments)
library(PearsonDS)
library(ggplot2)

# 读取数据(替换为本地实际文件路径)
newdata <- read_csv("Downloads/newctdata - Sheet1.csv")

# 以下为参数拟合调试代码,确认pIpars参数正确后可跳过运行
# data <- rpearson(1000, moments = c(mean = 0.5205263, variance = 0.3940497, skewness = 1.747905, kurtosis = 5.706342))
# ppar <- pearsonFitML(data)
# print(unlist(ppar))
# print(unlist(pearsonFitM(moments = empMoments(data))))

# 拟合得到的Pearson I型分布固定参数
pIpars <- list(a = 0.44883385, b = 2.22621271, location = 0.04565093, scale = 3.20779382)
# 生成曲线绘图用x轴序列,范围自动匹配实际数据取值区间
t <- seq(min(newdata$Mean, na.rm = T), max(newdata$Mean, na.rm = T), length.out = 100)

# 1. 绘制概率密度直方图,必须设置prob=TRUE对齐密度轴
hist(newdata$Mean, 
     prob = TRUE, 
     xlab = "Mean Duration of Asymptomatic Infection in Women", 
     ylab = "Probability Density", 
     col = "steelblue", 
     breaks = 12, 
     cex.main = 1.3, 
     cex.axis = 1.5, 
     cex.lab = 1.5)

# 2. 叠加已实现的核密度曲线
lines(density(newdata$Mean, na.rm = T), col = "tomato", lwd = 4)

# 3. 叠加Pearson I型概率密度曲线(dpear)
dpear_vals <- dpearsonI(t, params = pIpars)
lines(t, dpear_vals, col = "darkgreen", lwd = 3, lty = 2)

# 4. 叠加Pearson I型累积概率曲线(ppear),匹配右侧独立y轴
par(new = TRUE) # 保留当前绘图面板不刷新
ppear_vals <- ppearsonI(t, params = pIpars)
plot(t, ppear_vals, 
     type = "l", 
     col = "purple", 
     lwd = 3, 
     lty = 3,
     xlab = NA, ylab = NA, # 不重复显示坐标轴标签
     axes = F) # 暂时隐藏默认坐标轴
# 添加右侧累积概率专用轴
axis(side = 4, cex.axis = 1.5)
mtext("Cumulative Probability", side = 4, line = 3, cex = 1.5)

# 添加图例区分各曲线
legend("topright",
       legend = c("Kernel Density", "Pearson I Density", "Pearson I CDF"),
       col = c("tomato", "darkgreen", "purple"),
       lwd = c(4,3,3),
       lty = c(1,2,3),
       cex = 1.2)

关键实现说明

  • 绘图顺序固定为先画直方图,再依次叠加各条曲线,中途不要随意调用会新建绘图窗口的plot()函数;累积曲线绘制前加par(new=TRUE)参数可保留现有面板,不会覆盖已有绘图内容
  • 核密度曲线、Pearson I型概率密度曲线和直方图的概率密度轴量纲一致,可直接通过lines()叠加
  • Pearson I型累积概率曲线单独匹配右侧y轴,取值范围01对应累积概率0100%
  • 生成曲线的x轴序列范围自动匹配实际数据的最小、最大值,避免硬编码序列范围导致曲线和直方图错位

内容的提问来源于stack exchange,提问作者cbjdfall

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 14:06:31