You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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  

问题根源

  1. 数据集构建逻辑错误:你将子集dht与原数据dataHaploid行绑定后,再进行多重条件筛选,这导致All Loci组和Divergent Loci组的筛选范围并非严格的包含关系——本质上是在合并后的数据集里分别筛选了两个独立子集,而非保证Divergent Loci是All Loci的真子集。
  2. 分箱规则不统一: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 19:00:33