如何在基础R中预先确定多直方图的合适ylim以避免绘图范围不足?
如何在基础R中预先确定多直方图的合适ylim参数以完整显示所有直方图?
当然有办法解决这个问题!核心思路是先提前计算出两个数据集在相同分箱规则下的直方图频数最大值,然后用这个最大值来设置第一个直方图的ylim参数,这样后续添加的第二个直方图就不会被截断了。
具体实现步骤:
- 先生成并准备数据(为了结果可复现,建议设置随机种子):
set.seed(123) data1 <- sqrt(runif(100)) data2 <- 1 - sqrt(runif(1000))
- 计算两个数据集的直方图统计信息(不绘图):
使用hist()函数的plot = FALSE参数,可以只返回直方图的统计结果(比如分箱、频数等)而不绘制图形。这样我们就能拿到两个数据集在相同分箱下的频数数据:
# 统一分箱规则,和原代码保持一致 breaks <- seq(from=0, to=1, length.out=21) # 获取两个直方图的统计结果 hist_stats1 <- hist(data1, breaks = breaks, plot = FALSE) hist_stats2 <- hist(data2, breaks = breaks, plot = FALSE)
- 确定最大频数,设置ylim:
从两个统计结果中提取counts(各分箱的频数),找到最大值,以此作为ylim的上限:
max_freq <- max(hist_stats1$counts, hist_stats2$counts)
- 绘制直方图:
现在绘制第一个直方图时指定ylim = c(0, max_freq),再添加第二个直方图就不会出现截断问题了:
# 绘制第一个直方图 hist(data1, border = 'red', breaks = breaks, col = 'red', angle = 45, density=10, xlim=c(0, 1), ylim = c(0, max_freq)) # 添加第二个直方图 hist(data2, border = 'blue', breaks = breaks, col = 'blue', angle = 135, density=10, add=T)
原理说明:
当你用plot = FALSE调用hist()时,它会返回一个包含直方图所有关键信息的列表,其中counts字段就是每个分箱的观测数量。通过比较两个数据集的最大频数,我们就能确保绘图区域的y轴范围足够容纳两个直方图的所有内容,避免后续添加的图形被截断。
内容的提问来源于stack exchange,提问作者user1424739
相关产品推荐
相关产品推荐

