使用stat = "sum"的ggplot geom_bar

6

我想绘制一个柱状图,将一个变量沿着两个维度求和,一个维度将沿着 x 方向展开,另一个维度将垂直堆叠。

我期望以下两个指令可以实现相同的功能,但它们不能。只有第二个指令给出了预期的输出(在此我自己聚合数据)。

我希望了解第一种情况下发生了什么,并且是否有一种方法可以使用 ggplot2 的内置聚合功能来获得正确的输出。

library(ggplot2)
library(dplyr)
p1 <- ggplot(diamonds,aes(cut,price,fill=color)) + 
  geom_bar(stat="sum",na.rm=TRUE)

产生以下图表:

enter image description here

p2 <- ggplot(diamonds %>%
                group_by(cut,color) %>%
                summarize_at("price",sum,na.rm=T),
              aes(cut,price,fill=color)) +
  geom_bar(stat="identity",na.rm=TRUE)

产生以下图片:

enter image description here

这里应该是我们的柱状图顶部,但p1没有提供这些值:

diamonds %>% group_by(cut) %>% summarize_at("price",sum,na.rm=TRUE)
# # A tibble: 5 x 2
# cut    price
# <ord>    <int>
# 1      Fair  7017600
# 2      Good 19275009
# 3 Very Good 48107623
# 4   Premium 63221498
# 5     Ideal 74513487
1个回答

10
您可能误解了geom_barstat选项。在这种情况下,由于您希望每个因子的值在每个条形图中被累加,并且根据每个颜色中该总和的比例来着色,因此可以简化对geom_col的调用,该调用使用值作为条形图的高度;因此“汇总”了每个类别中的所有值。例如,以下内容将提供所需的输出:
p1 <- ggplot(diamonds,aes(cut,price,fill=color)) + 
        geom_col(na.rm=TRUE)

如果你想在使用geom_bar函数时调用统计函数,则需要使用"identity"统计函数:

p1 <- ggplot(diamonds,aes(cut,price,fill=color)) + 
        geom_bar(stat = "identity", na.rm=TRUE)

如需更多信息,请参考此帖子:https://dev59.com/Zobca4cB1Zd3GeqPcO9t#27965637


1
另外,我认为 ggplot(diamonds,aes(cut,fill=color,weight = price)) + geom_bar(na.rm=TRUE) 也会产生与 p2 相同的结果。 - joran
1
它对我来说没有出错,你运行了吗?你可能没有注意到我正在使用“weight”美学,而不是“y”美学。这会有所不同。 - joran
糟糕!没有注意到那部分。您的原样也可以。 - creutzml
1
太好了!它还解决了我之前的困惑,使用stat_identity技术上你会得到一堆叠在一起的条形图,但由于它们具有相同的颜色,看起来就像是一个总和。该链接还展示了stat_summary的很酷的用法,这是我之前不知道的。 - moodymudskipper
1
那个链接虽然回答了问题,但找起来还是出奇的困难!哈哈,不过很高兴能帮到你 :) - creutzml
显示剩余4条评论

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