密度图与直方图结果不一致问题求助(含ggplot2代码)
问题:ggplot2直方图与密度图形态不匹配排查方向
我有两个数据框,tableOfGraphData是vdjtoolTableTwo的严格子集(为该数据框与另一数据框的交集),二者都包含变量及对应的计数。用ggplot2绘制直方图与密度图时,发现同一数据的密度图和直方图形态不匹配:直方图里蓝色的vdjtoolTableTwo数据低频值占比更高、整体偏左,红色的tableOfGraphData数据整体偏右,但密度图的相对形态完全不符合这个特征;给密度图加adjust=1/5参数后,问题反而更严重。
绘图代码
ggplot()+ geom_histogram(data = vdjtoolTableTwo, aes(x = log10(frequency), y = after_stat(density), weight = count), fill=rgb(0,0,1,1/4)) + geom_density(data = vdjtoolTableTwo, aes(x = log10(frequency), y = after_stat(density), weight = count), fill="black", alpha = 0.25)+ geom_histogram(data = tableOfGraphData, aes(x = log10(frequency.y), y = after_stat(density), weight = count.y), fill=rgb(1,0,0,1/4)) + geom_density(data = tableOfGraphData, aes(x = log10(frequency.y), y = after_stat(density), weight = count.y), fill = "red", alpha = 0.25)+ coord_cartesian(xlim = scale)
结果说明
- 初始结果:蓝色直方图偏左、低频占比高,红色直方图偏右,但对应蓝色数据的黑色密度图、对应红色数据的红色密度图,形态和直方图特征完全相反。
- 添加
adjust=1/5后:密度图的形态异常问题进一步加剧。
排查方向
- 统一直方图分箱宽度:默认
geom_histogram的binwidth是自动计算的,两个直方图可能用了不同分箱宽度导致视觉偏差。显式设置统一的binwidth(比如binwidth=0.1),确保分箱逻辑一致后再对比。 - 验证权重参数逻辑:
weight在直方图和密度图中的计算逻辑是否一致。可以尝试去掉weight,用展开后的原始数据(而非汇总计数)重新绘图,看形态是否匹配。 - 核对x轴变量一致性:确认
log10(frequency)和log10(frequency.y)是同一含义的变量,是否存在频率计算方式不同导致的log转换偏差。 - 调整核密度带宽:默认带宽可能不适合数据分布,尝试手动设置
geom_density的bw参数(而非adjust),比如bw=0.2,观察密度图是否和直方图形态匹配。 - 检查子集数据正确性:确认
tableOfGraphData确实是vdjtoolTableTwo的严格子集,排查交集计算时的变量匹配、过滤条件是否出错,可通过对比总计数、抽样数据点验证。 - 移除坐标限制测试:
coord_cartesian(xlim = scale)可能截断数据导致计算偏差,去掉该限制后查看完整分布,判断是否是截断引发的形态不匹配。
内容的提问来源于stack exchange,提问作者3luke33
相关产品推荐
相关产品推荐

