如何在R中绘制两组数据的并列直方图并解决显示问题
解决R中两组数据的并列直方图问题(含样本量差异适配)
针对样本量差异大导致的图表截断、以及堆叠直方图不符合需求的问题,分别提供base R和ggplot2的解决方案:
Base R 实现并列相对频数直方图
核心思路:统一两组的分组区间,计算相对频数替代原始计数,用barplot实现并列展示
# 提取两组数据的corr值 corr_group1 <- corr_7269$corr corr_group2 <- corr_n$corr # 确定共同的分组区间(可根据数据分布调整步长,此处用0.01) common_breaks <- seq(min(c(corr_group1, corr_group2)), max(c(corr_group1, corr_group2)), by = 0.01) # 获取两组直方图的统计数据(不直接绘图) hist_group1 <- hist(corr_group1, breaks = common_breaks, plot = FALSE) hist_group2 <- hist(corr_group2, breaks = common_breaks, plot = FALSE) # 计算相对频数(计数/总样本量) freq_group1 <- hist_group1$counts / length(corr_group1) freq_group2 <- hist_group2$counts / length(corr_group2) # 绘制并列直方图 barplot( rbind(freq_group1, freq_group2), beside = TRUE, # 开启并列模式 col = c("steelblue", "coral"), names.arg = round(hist_group1$mids, 2), # 用区间中点作为X轴标签 ylab = "相对频数", xlab = "rho值", main = "两组数据rho值的并列直方图", legend.text = c("n+1", "n_1"), args.legend = list(x = "topright") )
ggplot2 实现并列相对频数直方图
核心思路:用position="dodge"关闭堆叠,将Y轴切换为相对频数
方法1:基于密度的相对频数
library(ggplot2) combinedregioncorr <- rbind(corr_7269, corr_n) ggplot(combinedregioncorr, aes(x = corr, fill = models)) + geom_histogram( position = "dodge", # 并列而非堆叠 binwidth = 0.01, # 统一分组宽度 alpha = 0.7 ) + aes(y = ..density..) + # 切换为相对频数(密度) labs( x = "rho values different groups", y = "相对频数", title = "两组数据rho值的并列直方图" ) + scale_fill_manual(values = c("steelblue", "coral")) + theme_minimal()
方法2:基于每组比例的相对频数
ggplot(combinedregioncorr, aes(x = corr, fill = models, group = models)) + geom_histogram( position = "dodge", binwidth = 0.01, alpha = 0.7 ) + stat_count(aes(y = ..prop..)) + # 计算每组内部的比例 labs( x = "rho values different groups", y = "相对频数", title = "两组数据rho值的并列直方图" ) + scale_fill_manual(values = c("steelblue", "coral")) + theme_minimal()
内容的提问来源于stack exchange,提问作者Rhea Bedi
相关产品推荐
相关产品推荐

