ggplot2中geom_histogram结合facet_wrap绘制频率直方图的问题
解决ggplot2中geom_histogram结合facet_wrap时的频率计算问题
你的核心需求是:按Sample分面后,每个分面内的var2分组各自计算频率(即组内每个直方图柱子的计数占该组在当前分面中总观测数的比例)。原代码手动指定group==1和group==2的方式仅适用于单一分面场景,分面后会因为全局计算组总数导致频率混乱,以下是两种可行的解决方案:
方案一:预处理数据(推荐,逻辑清晰)
先计算每个Sample+var2组合的总观测数,再基于此计算频率:
library(dplyr) library(ggplot2) # 预处理:计算每个Sample-var2组合的总观测数 myTestDF_summary <- myTestDF %>% group_by(Sample, var2) %>% mutate(group_total = n()) %>% ungroup() # 绘制分面频率直方图 ggplot(myTestDF_summary, aes(x = Val1, fill = var2)) + geom_histogram( aes(y = after_stat(count)/group_total), position = "identity", alpha = 0.5, bins = 30 ) + facet_wrap(~Sample) + labs(title = '分面频率直方图', x = "Val1", y = "Frequency") + theme_minimal()
方案二:直接在ggplot中动态计算频率
利用after_stat结合ave函数,按分面(panel)和分组(group)动态计算组内总数:
library(ggplot2) ggplot(myTestDF, aes(x = Val1, fill = var2)) + geom_histogram( aes(y = after_stat(count / ave(count, group, panel, FUN = sum))), position = "identity", alpha = 0.5, bins = 30 ) + facet_wrap(~Sample) + labs(title = '分面频率直方图', x = "Val1", y = "Frequency") + theme_minimal()
原代码问题解释
原代码中sum(count[group==1])是全局计算所有分面中group==1的总计数,而非当前分面内该组的计数,分面后不同Sample的同组数据会被混在一起计算,导致频率失真。上述两种方案都确保了频率计算的范围限定在当前分面的对应分组内。
内容的提问来源于stack exchange,提问作者Max_IT
相关产品推荐
相关产品推荐

