在R中使用ggplot2绘制分组列的条形图,如何取消堆叠?

4

我试图将下面的数据作为分组条形图绘制出来。我已经按照其他网友的建议更改了geom_bar中的position="",但似乎并没有成功。我所得到的只是一个堆积条形图。这是我最近的尝试:

ggplot(data = IFNg, aes(x = IFNg$Location, y = IFNg$`Fold Change`)) + 
    geom_bar(position = 'identity', stat = "identity", fill = IFNg$Day) + 
    ylab("Fold Change (log_2)") + geom_errorbar(limits, width=0.15)

我也尝试了以下方法,结果是堆叠图,但此图的颜色不同:
ggplot(data = IFNg, aes(x = IFNg$Location, y = IFNg$`Fold Change`, 
    fill= IFNg$Day)) + geom_bar(position = 'identity', stat = "identity") + 
    ylab("Fold Change (log_2)") + geom_errorbar(limits, width=0.15)

以下是我的代码和数据:

在这里输入图片描述

dat <- structure(list(Day = c(1L, 3L, 7L, 21L, 1L, 3L, 7L, 21L, 1L, 
3L, 7L, 21L), Order = c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L, 
3L, 3L), Target = c("IFN-g", "IFN-g", "IFN-g", "IFN-g", "IFN-g", 
"IFN-g", "IFN-g", "IFN-g", "IFN-g", "IFN-g", "IFN-g", "IFN-g"), 
Location = c("Duodenum", "Duodenum", "Duodenum", "Duodenum", 
"Duodenum (Lymph)", "Duodenum (Lymph)", "Duodenum (Lymph)", 
"Duodenum (Lymph)", "Proximal Jejunum", "Proximal Jejunum",
"Proximal Jejunum", "Proximal Jejunum"), `Fold Change` = c(-1.750896098,
-2.194886907, -0.838822724, 0.680612172, -0.375563984, 0.650154987, 
0.844897327, -0.228441603, -1.298230671, -1.173634963, -1.877736135, 
0.787322978), StDev = c(0.027477611, 0.029974897, 0.19025044, 1.235986647,
0.055798435, 0.086102327, 0.115422155, 0.34470734, 0.020947691, 0.165294027,
0.040111751, 0.035010207)), .Names = c("Day", "Order", "Target", "Location",
"Fold Change", "StDev"), class = c("tbl_df", "data.frame"), row.names = c(NA,-12L))

IFNg <- dat[dat$Target == 'IFN-g', ]

limits <- aes(ymax = IFNg$`Fold Change` + IFNg$StDev,
    ymin = IFNg$`Fold Change` - IFNg$StDev)

1
aes() 中不要使用 $。你可以使用 data 参数告诉 ggplot 使用哪个数据框。将向量 x = data$column 传递给 aes 而不是列名 x = column 可能会导致问题。同样地,(但从另一方面来说),所有 美学映射到数据列都需要在 aes() 中,包括 fill = Day - Gregor Thomas
谢谢@Gregor。我已经尝试了建议的两个更改,但是图形仍然是堆叠的。不确定出了什么问题... - James Wade
你的图形并不是真正的堆叠式。它只是将所有的条形放置在一个点上,这样你就可以看到“较高”的条形在“较矮”的条形后面。你想让你的图形看起来像什么?你想要一个分组条形图吗?如果是这样,请使用 position = "dodge" - aosmith
感谢 @aosmith 的建议。不幸的是,position = "dodge" 在我的图表上没有任何变化。不确定为什么。 - James Wade
1
很可能是因为 Day 不是一个 factor。在 aes 中使用 fill = factor(Day) - aosmith
1个回答

7
你大部分的问题是因为你输入了不该输入的东西,比如 data$column 而不是 column。此外,你的 Day 是数字型的,但如果要按照 Day 定义不同的并排柱状图,则需要将其离散化(转换成因子)。
我还想指出,?geom_bar 帮助页面并不是很长,并且有这段话:
默认情况下,出现在同一位置的多个 x 会被 position_stack 堆叠在一起。如果你想让它们侧向闪避,请参见 ?position_dodge。最后,position_fill 显示每个 x 的相对比例,通过堆叠条形图然后拉伸或压缩到相同的高度来实现。
通常,position='dodge' 就可以正常工作,但在这种情况下,它会混淆并认为你的误差线宽度是要躲避的宽度,所以我们将使用完整的 position=position_dodge()
# No data$ inside aes()!!!
limits <- aes(ymax = `Fold Change` + StDev,
    ymin = `Fold Change` - StDev)

ggplot(data = IFNg,
  # group lets `ggplot` know we want different errorbars/bars for each day
       aes(x = Location, y = `Fold Change`, group = factor(Day))
    ) +
    geom_bar(
        stat = "identity",
        aes(fill = factor(Day)),
        position = position_dodge(width = 0.9)
    ) +
    ylab("Fold Change (log_2)") +
    geom_errorbar(
        limits,
        width = 0.15,
        position = position_dodge(width = 0.9)
    )

enter image description here


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