R语言geom_histogram分组分箱不一致问题求助
叠加直方图分箱不一致问题调试与解决
我尝试绘制两个直方图的叠加图,一个代表全部数据,另一个代表符合条件的子集。导入.csv文件为数据框后,构建带分类的新数据框并使用ggplot绘图,但出现异常:蓝色(子集)出现了红色(全集)没有的实心区域,而子集本应是全集的一部分;单独绘制全集时这些分箱无数据,说明分箱方案不一致。我尝试修改数据集构建代码、调整分箱数、设置binwidth=0.01和boundary=0,但问题仍存在。
我的代码如下:
dataHaploid=read.csv("Graphes/Hap.csv") dataHaploid$Group="All Loci" dht=dataHaploid[dataHaploid$Divergence>.01, ] dht$Group="Divergent Loci" dataHaploid <- rbind(dataHaploid,dht) dha=dataHaploid[dataHaploid$BetaDist==0, ][dataHaploid[dataHaploid$BetaDist==0, ]$SignalWidth==10, ][dataHaploid[dataHaploid$BetaDist==0, ][dataHaploid[dataHaploid$BetaDist==0, ]$SignalWidth==10, ]$EcolWidth==10, ] dhaa =ggplot(dha, aes(MeanRecombinationRate, fill=Group)) + geom_histogram(alpha=.5, position="identity", bins=25) + ylim(0,100)+xlim(0,.5) dhaa
问题根源
- 数据集构建逻辑错误:你将子集
dht与原数据dataHaploid行绑定后,再进行多重条件筛选,这导致All Loci组和Divergent Loci组的筛选范围并非严格的包含关系——本质上是在合并后的数据集里分别筛选了两个独立子集,而非保证Divergent Loci是All Loci的真子集。 - 分箱规则不统一:ggplot默认会为每个分组单独计算分箱边界,即使设置了相同的
bins或binwidth,也可能因两组数据的分布差异导致分箱错位,出现视觉上的异常。
解决步骤
1. 修正数据集构建逻辑,确保子集是全集的真子集
先筛选出符合BetaDist、SignalWidth、EcolWidth条件的基础数据集,再从中拆分出全集和子集,保证子集完全包含在全集内:
dataHaploid=read.csv("Graphes/Hap.csv") # 先筛选共同的条件:BetaDist=0、SignalWidth=10、EcolWidth=10 dha_base <- subset(dataHaploid, BetaDist == 0 & SignalWidth == 10 & EcolWidth == 10) # 生成全集分组 all_loci <- dha_base all_loci$Group <- "All Loci" # 从全集中筛选出Divergent Loci子集 divergent_loci <- subset(dha_base, Divergence > 0.01) divergent_loci$Group <- "Divergent Loci" # 合并两个分组(此时Divergent Loci是All Loci的严格子集) dha <- rbind(all_loci, divergent_loci)
2. 强制使用统一分箱边界
通过breaks参数手动指定分箱的起止和步长,确保两个分组使用完全一致的分箱规则:
# 手动定义分箱边界:从0到0.5,步长0.02(对应25个分箱,与原代码bins=25匹配) breaks_seq <- seq(from = 0, to = 0.5, by = 0.02) # 绘制直方图,使用统一分箱 dhaa <- ggplot(dha, aes(MeanRecombinationRate, fill = Group)) + geom_histogram(alpha = 0.5, position = "identity", breaks = breaks_seq) + ylim(0, 100) + xlim(0, 0.5) dhaa
额外调试技巧
- 验证两组数据的数值范围:
# 查看All Loci的MeanRecombinationRate范围 range(all_loci$MeanRecombinationRate) # 查看Divergent Loci的MeanRecombinationRate范围 range(divergent_loci$MeanRecombinationRate) - 查看每个分箱的计数,确认子集计数不超过全集:
table(cut(dha$MeanRecombinationRate, breaks = breaks_seq), dha$Group)
内容的提问来源于stack exchange,提问作者Isaac Linn
相关产品推荐
相关产品推荐

