使用ggplot在R中绘制具有负值的堆积条形图

3

这是我的数据集 -

df<- data.frame(Comparison=c("Control vs SA","Control vs SA","Control vs SA","Control vs SA","Control vs SA","Control vs SA","Control vs SA","Control vs SA","Control vs SA","Control vs SA",
                                         "SA3MA vs SA","SA3MA vs SA","SA3MA vs SA","SA3MA vs SA","SA3MA vs SA","SA3MA vs SA","SA3MA vs SA","SA3MA vs SA","SA3MA vs SA","SA3MA vs SA",
                                         "Control vs HS","Control vs HS","Control vs HS","Control vs HS","Control vs HS","Control vs HS","Control vs HS","Control vs HS","Control vs HS","Control vs HS",
                                         "HSLC vs HS","HSLC vs HS","HSLC vs HS","HSLC vs HS","HSLC vs HS","HSLC vs HS","HSLC vs HS","HSLC vs HS","HSLC vs HS","HSLC vs HS"),
                LFC_Band=c(-4,-2,-1,-0.5,-0.25,0.25,0.5,1,2,4,
                           -4,-2,-1,-0.5,-0.25,0.25,0.5,1,2,4,
                           -4,-2,-1,-0.5,-0.25,0.25,0.5,1,2,4,
                           -4,-2,-1,-0.5,-0.25,0.25,0.5,1,2,4),
                Number_of_Genes=c(-36,-540,-2198,-3025,-6002,6517,3462,2466, 500,1,-620,-2317,-3318,-2748,-2264,2706,2046,3079,3013,2073,-119,-606,
                                  -1640,-2886,-7451,6944,3147,1592, 267,0,26,0,0, -44,-901 -11699,10969, 754,0,12,0))

我想要做的是使用ggplot创建一个堆叠条形图。
chart_x <- ggplot(data = df, aes(y=(Number_of_Genes), 
                                            x=Comparison, group = Comparison))+
  geom_col(aes(fill=(as.factor(LFC_Band))))+
  scale_fill_brewer(palette = "Spectral")
chart_x

结果是 -

stacked graph

但是,如果你看到下半部分基本上是翻转的。上半部分是正确的,即从4到0.25,而下半部分则从-4开始。有没有办法翻转下半部分,使其从-0.25开始?简而言之,我想要的是- Needed! 我用MS画图创建了这个图片,只是为了展示我想要的内容。
我尝试过其他方法,例如将数据分成两部分,但效果并不好。任何帮助都将不胜感激。 :)
2个回答

3
你正在寻找这样的解决方案吗?
library(tidyverse)

df1 <- df %>% 
  filter(Number_of_Genes>=0)
df2 <- df %>% 
  filter(Number_of_Genes<0)

ggplot() + 
  geom_bar(data = df2, aes(x=Comparison, y=Number_of_Genes, group = Comparison, fill=factor(LFC_Band)),stat = "identity") +
  geom_bar(data = df1, aes(x=Comparison, y=Number_of_Genes, group = Comparison, fill=factor(LFC_Band)),stat = "identity") +
  scale_fill_brewer(palette = "Spectral")

enter image description here


我之前尝试过这个解决方案。问题是我没有得到我想要的结果。这个解决方案在另一篇帖子中出现过,但是我无法使其工作。不过还是谢谢你的输入!:)非常感谢。 - Srivats Chari

3
实现您所需结果的一种方案如下:
  1. 在将数据传递给ggplot之前,将转换为因子(factor)(否则我们会失去图例中类别的顺序)。
  2. 删除以使堆栈按进行分组。
  3. 使用两个geom_col,一个用于正值,一个用于负值。
  4. 对于正值反转堆栈的顺序。
  5. 在中添加(否则我们会失去图例中类别的顺序)。
此外,我还将填充(颜色)图例颠倒了顺序,但如果您希望的话可以将其删除。
library(ggplot2)

df$LFC_Band <- factor(df$LFC_Band)

ggplot(data = df, aes(x = Comparison, y = Number_of_Genes, fill = LFC_Band)) +
  geom_col(data = df[df$Number_of_Genes > 0, ], position = position_stack(reverse = TRUE)) +
  geom_col(data = df[df$Number_of_Genes < 0, ]) +
  scale_fill_brewer(palette = "Spectral", drop = FALSE, guide = guide_legend(reverse = TRUE))


正是我所需要的!我没想到我可以使用两个geom_col来表示正负值!:) <3 真是太棒了!感谢您。 - Srivats Chari

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接