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

