【发布时间】:2012-07-21 04:32:45
【问题描述】:
我有很多时间了解geom_bar() 和position="dodge"。我试图制作一些条形图来说明两组。最初,数据来自两个单独的数据帧。根据this question,我将我的数据以长格式放置。我的例子:
test <- data.frame(names=rep(c("A","B","C"), 5), values=1:15)
test2 <- data.frame(names=c("A","B","C"), values=5:7)
df <- data.frame(names=c(paste(test$names), paste(test2$names)), num=c(rep(1,
nrow(test)), rep(2, nrow(test2))), values=c(test$values, test2$values))
我使用该示例是因为它类似于支出与预算示例。每个names 因子级别的支出有很多行,而预算只有一个(每个类别一个预算金额)。
对于堆积条形图,这很好用:
ggplot(df, aes(x=factor(names), y=values, fill=factor(num))) +
geom_bar(stat="identity")
特别要注意 y 值的最大值。它们是来自test 的数据与顶部蓝色显示的test2 值的总和。
根据我读过的其他问题,我只需添加 position="dodge" 以使其成为并排图与堆叠图:
ggplot(df, aes(x=factor(names), y=values, fill=factor(num))) +
geom_bar(stat="identity", position="dodge")
看起来不错,但请注意新的最大 y 值。似乎它只是从test 的每个名称因子级别中获取最大 y 值作为 y 值。它不再对它们求和。
根据其他一些问题(如this one 和this one,我还尝试添加group= 选项但没有成功(产生与上述相同的躲避图):
ggplot(df, aes(x=factor(names), y=values, fill=factor(num), group=factor(num))) +
geom_bar(stat="identity", position="dodge")
我不明白为什么堆叠的效果很好,而躲避的不只是将它们并排而不是放在上面。
预计到达时间:我在 ggplot google 群组上找到了一个 recent question,并建议添加 alpha=0.5 以查看发生了什么。并不是 ggplot 从每个分组中获取最大值;它实际上是在每个值的顶部绘制条形图。
似乎在使用position="dodge" 时,ggplot 预计每个 x 只需要一个 y。我联系了 ggplot 开发人员 Winston Chang 以确认并询问是否可以更改,因为我没有看到优势。
似乎stat="identity" 应该告诉 ggplot 计算在 aes() 内部传递的 y=val 而不是在没有 stat="identity" 和不传递 y 值时发生的单个计数。
目前,解决方法似乎是(对于上面的原始 df)进行聚合,因此每个 x 只有一个 y:
df2 <- aggregate(df$values, by=list(df$names, df$num), FUN=sum)
p <- ggplot(df2, aes(x=Group.1, y=x, fill=factor(Group.2)))
p <- p + geom_bar(stat="identity", position="dodge")
p
【问题讨论】: