问题与GGPLOT2,geom_bar和位置=“躲避”:层叠有正确的y值,回避不(Issue wit

2019-06-17 12:07发布

我有相当的时间来理解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

Answer 1:

我认为这个问题是要在值堆放num组,和值之间躲闪num 。 这可能有助于看看当你添加一个大纲酒吧发生了什么。

library(ggplot2)
set.seed(123)
df <- data.frame(
  id     = 1:18,
  names  = rep(LETTERS[1:3], 6),
  num    = c(rep(1, 15), rep(2, 3)),
  values = sample(1:10, 18, replace=TRUE)
)

默认情况下,有一个堆放很多酒吧 - 你只是不明白,他们是独立的,除非你有一个轮廓:

# Stacked bars
ggplot(df, aes(x=factor(names), y=values, fill=factor(num))) + 
  geom_bar(stat="identity", colour="black")

如果你躲闪,你所值之间躲开吧num ,但也有可能是每个值中的多个酒吧num

# Dodged on 'num', but some overplotted bars
ggplot(df, aes(x=factor(names), y=values, fill=factor(num))) + 
  geom_bar(stat="identity", colour="black", position="dodge", alpha=0.1)

如果您还添加了id为分组变种,它会闪避所有的人:

# Dodging with unique 'id' as the grouping var
ggplot(df, aes(x=factor(names), y=values, fill=factor(num), group=factor(id))) + 
  geom_bar(stat="identity", colour="black", position="dodge", alpha=0.1)

我想你想要的是既闪避和堆栈,但你不能两者都做。 所以,最好的办法是自己总结的数据。

library(plyr)
df2 <- ddply(df, c("names", "num"), summarise, values = sum(values))

ggplot(df2, aes(x=factor(names), y=values, fill=factor(num))) + 
  geom_bar(stat="identity", colour="black", position="dodge")



文章来源: Issue with ggplot2, geom_bar, and position=“dodge”: stacked has correct y values, dodged does not
标签: r plot ggplot2