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
相关产品推荐
相关产品推荐

