如何使用ggplot基于EcoSim输出的区间频数绘制直方图?
如何用ggplot基于EcoSim预计算的区间频数绘制直方图
你已经从EcoSim 7.1得到了直方图的区间范围(最小值、最大值)和对应区间的模拟次数,但之前的ggplot代码无法生成预期的直方图,问题出在你误用了geom_histogram——这个函数是用来从原始观测数据自动分组计算频数并绘图的,而你手里已经是预计算好的分组频数,应该用geom_col(或geom_bar(stat="identity"))来实现。
你的示例数据
| Histogram Low | Histogram High | # Simulations |
|---|---|---|
| 1.42416 | 1.43086 | 443 |
| 1.43086 | 1.43756 | 1672 |
| 1.43756 | 1.44426 | 2679 |
| 1.44426 | 1.45096 | 2263 |
| 1.45096 | 1.45766 | 1546 |
| 1.45766 | 1.46436 | 857 |
| 1.46436 | 1.47106 | 320 |
| 1.47106 | 1.47776 | 112 |
| 1.47776 | 1.48446 | 39 |
| 1.48446 | 1.49116 | 19 |
| 1.49116 | 1.49785 | 33 |
| 1.49785 | 1.50455 | 16 |
你尝试的错误代码
histmin <- c(1.424,1.431,1.438,1.444,1.451,1.458,1.464,1.471,1.478,1.484,1.491,1.498) histmax <- c(1.431,1.438,1.444,1.451,1.458,1.464,1.471,1.478,1.484,1.491,1.498,1.505) freq <- c(443,1672,2679,2263,1546,857,320,112,39,19,33,16) ecosimhist <- data.frame(histmin, histmax, freq) ggplot(ecosimhist, aes(x=freq)) + geom_histogram(bins=12)
正确的实现方法
步骤1:构造精确的数据框
建议使用EcoSim输出的原始精确数值,避免近似值带来的误差:
# 用原始精确值构造数据框 ecosimhist <- data.frame( histmin = c(1.42416, 1.43086, 1.43756, 1.44426, 1.45096, 1.45766, 1.46436, 1.47106, 1.47776, 1.48446, 1.49116, 1.49785), histmax = c(1.43086, 1.43756, 1.44426, 1.45096, 1.45766, 1.46436, 1.47106, 1.47776, 1.48446, 1.49116, 1.49785, 1.50455), freq = c(443, 1672, 2679, 2263, 1546, 857, 320, 112, 39, 19, 33, 16) )
步骤2:计算区间中点(优化x轴显示)
为了让x轴更直观,计算每个区间的中点作为x轴的位置:
ecosimhist$midpoint <- (ecosimhist$histmin + ecosimhist$histmax) / 2
步骤3:用ggplot绘制柱状图(模拟直方图效果)
使用geom_col直接根据预计算的频数绘图,同时可以添加区间标签优化可读性:
library(ggplot2) ggplot(ecosimhist, aes(x = midpoint, y = freq)) + geom_col(width = 0.0067, fill = "#2c3e50", color = "white") + # width匹配区间宽度(0.0067=1.43086-1.42416) labs( x = "区间范围", y = "模拟次数", title = "EcoSim模拟结果直方图" ) + scale_x_continuous( breaks = ecosimhist$midpoint, labels = paste0(ecosimhist$histmin, " - ", ecosimhist$histmax) ) + theme(axis.text.x = element_text(angle = 45, hjust = 1)) # 旋转x轴标签避免重叠
代码说明
geom_col:用于绘制已知高度的柱状图,对应你已经有的freq数值,替代需要计算频数的geom_histogram。width:设置柱子宽度,匹配EcoSim输出的区间宽度,让图形更接近传统直方图的样式。scale_x_continuous:自定义x轴标签,显示完整的区间范围,提升可读性。
内容的提问来源于stack exchange,提问作者Felipe
相关产品推荐
相关产品推荐

