使用 ggplot 划分每组的直方图计数

Posted

技术标签:

【中文标题】使用 ggplot 划分每组的直方图计数【英文标题】:Divide histogram counts per group using ggplot 【发布时间】:2021-10-13 22:19:41 【问题描述】:

我有一个这样的数据框:

df2:

# A tibble: 38,161 x 5
   chromosome insRangeBegin cohort gender Cases
   <chr>              <dbl> <chr>  <chr>  <dbl>
 1 chr1              819957 WL-SA  F        173
 2 chr1              820179 WL-SA  F        173
 3 chr1             1610917 WL-PB  F        199
 4 chr1             1923485 WL-PB  F        199
 5 chr1             2098854 WL-SA  M        113
 6 chr1             4051411 WL-SA  F        173
 7 chr1             4099335 WL-SA  F        173
 8 chr1             4257094 WL-SA  F        173
 9 chr1             4346601 WL-SA  F        173
10 chr1             4348046 WL-SA  F        173
# … with 38,151 more rows

假设对于每个染色体,我想为每个群组和性别绘制一个直方图,其中计数除以该群组和性别的“病例”列中的数字。

目前我使用以下代码生成直方图:

df2 %>% filter(chromosome == "chr1") %>% ggplot(.) + geom_histogram(aes(x=insRangeBegin, fill=cohort), binwidth=5e6, position="stack") + facet_wrap(~gender, scales="free") + xlim(c(0, 249250621))

我得到:

但计数(y 轴)并未标准化为病例数(例如,我在 WL-SA F 中的计数比 WL-SA M 中的计数更多,因为它们来自 173 例,而 113 例)。 我想得到相同的图表,但 WL-SA F 的计数除以 173,WL-SA M 的计数除以 113 等,在每个 bin 中。所需结果是每个病例的计数直方图,其中病例数在“病例”列中指定。

【问题讨论】:

【参考方案1】:

解决方案是使用权重

> df2$weights<-1/df2$Cases
> df2 %>% filter(chromosome == "chr1") %>% ggplot(., aes(x=insRangeBegin, weights=weights)) + geom_histogram(aes(fill=cohort), breaks = seq(0, 249250621, 5e6), position="stack") + facet_wrap(~gender, scales="free")

【讨论】:

以上是关于使用 ggplot 划分每组的直方图计数的主要内容,如果未能解决你的问题,请参考以下文章

ggplot中分组/计数/数据的直方图

在ggplot直方图中排序计数

将“整体”组添加到facet_wrap(ggplot2)

dc.js百分比直方图-组的大小

R语言ggplot2可视化:可视化堆叠的直方图添加每个分组的每个bin的计数标签在堆叠直方图的bin中的每个分组部分添加数值标签

用 ggplot 填充直方图 - 改变颜色