我有相当的时间来理解geom_bar()
和position="dodge"
。 我试图让一些条形图出两组。 最初的数据是从两个不同的数据帧。 每这个问题 ,我把我的数据在长格式。 我的例子:
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值。 现在看来似乎只是采取从每名因子水平最高的y值从test
的y值。 它不再对它们求和。
每一些其他问题(如这一个和这一个 ,我还试图加入group=
选项没有成功(产生与上述相同的回避情节):
ggplot(df, aes(x=factor(names), y=values, fill=factor(num), group=factor(num))) +
geom_bar(stat="identity", position="dodge")
我不明白为什么堆叠的伟大工程和回避不只是把它们并排而不是在上面。
ETA:我发现了一个最近的问题有关这对谷歌ggplot组的建议,添加alpha=0.5
,看看发生了什么事情。 这并不是说ggplot正在从每个分组中的最大值; 它实际上是过度绘制彼此的每个值之上吧。
看来,当使用position="dodge"
,ggplot预计每X仅有一个Y。 我接触温斯顿张,这个一个ggplot开发商确认,以及询问是否可以这样改变,因为我看不到优势。
看来, stat="identity"
应该告诉ggplot相符的y=val
通过内部aes()
而不是恰好没有单独计数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