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

如何用ggplot在R中绘制正确的流行病最终规模分布直方图?

解决ggplot直方图与基础hist频率一致的问题

你遇到的核心问题是:基础绘图中手动修改的是频率(区间样本占总样本的比例),而ggplot的..density..是概率密度,二者定义不同,所以结果不匹配。

修正思路

基础代码里h$density = h$counts/sum(h$counts)计算的是每个区间的频率,要在ggplot中得到相同结果,需要将y轴映射改为..count../sum(..count..)——用区间样本数除以总样本数,直接计算频率。

修正后的ggplot代码

# 先将向量转为数据框(ggplot更适配数据框输入)
df <- data.frame(f = f)

ggplot(df, aes(x = f)) + 
  geom_histogram(aes(y = ..count../sum(..count..)), colour = 1, fill = "white") +
  ylim(0, 1)

进阶:匹配基础hist的区间划分

如果需要和基础hist的区间完全一致,可以先通过hist()获取断点参数,再传给ggplot:

# 先获取基础hist的区间断点,不绘图
h <- hist(f, plot = FALSE)

ggplot(data.frame(f = f), aes(x = f)) + 
  geom_histogram(aes(y = ..count../sum(..count..)), 
                 colour = 1, fill = "white", 
                 breaks = h$breaks) +
  ylim(0, 1)

这样得到的直方图不管是区间划分还是y轴频率数值,都会和你手动修改的基础hist结果完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 04:35:54