如何使用 geom_bar 将连续变量映射到 y 轴?

How to map a continuous variable to the y-axis with geom_bar?

我有一些基因组数据已按染色体分箱,每个分箱的值介于 0 和 1 之间。这是一个示例:

Chr Bin Value
1   1   0.40 
1   2   0.12
1   3   0.45
1   4   0.67
2   1   0.32
2   2   0.12
3   1   0.22
3   2   0.44
3   3   0.55
4   1   0.21

需要注意的重要一点是染色体(上面的"Chr")有不同的长度,因此它们有不同数量的箱子。我可以用以下内容正确表示:

ggplot(dat, aes(Chr)) + coord_flip() + geom_bar()

这只是显示了 bin 数量的条形图。我想做的是用连续值填充条形图,这就是我遇到麻烦的地方。我的尝试:

ggplot(dat, aes(x=Chr, y=Value, color=Value)) + coord_flip() + theme_bw() + geom_bar(stat="identity") + scale_color_gradient("Value", low = "white", high = "black")

这会生成我想要的那种图,但是 y 轴现在不正确并且没有显示 bin 的计数(我猜是因为我正在将值映射到 y?)。如何在 y 轴上绘制 bin 的计数并填充连续变量而不弄乱刻度?

如果我理解你的问题,我认为你想要 fill 美学而不是 color。此外,根据您的评论,Bin 似乎是一个 bin ID,而不是每个 Chr 值的 bin 计数。因此,在下面的代码中,我们只是为 Bin 的每个值创建一个等于 1 的新变量 bin.count。然后我们使用 y=bin.count 这样每个 Bin 都算一次。我还在每个栏中添加了文本标签,以防您想要标记它们。

library(dplyr)

ggplot(dat %>% mutate(bin.count=1) %>%
         group_by(Chr) %>%
         mutate(bin.pos = cumsum(bin.count) - 0.5*bin.count), 
       aes(x=Chr, y=bin.count, fill=Value)) + 
  coord_flip() + theme_bw() + 
  geom_bar(stat="identity") + 
  geom_text(aes(label=paste0("Bin ID: ", Bin), y=bin.pos), colour="white") +
  scale_fill_gradient("Value", low = "white", high = "black", 
                      limits=c(0,max(dat$Value))) +
  scale_y_continuous(breaks=0:4) +
  labs(y="Bins")