2012-07-22 158 views
12

我有相当的时间了解geom_bar()position="dodge"。我试图制作一些说明两个组的棒图。数据最初来自两个独立的数据框。每this question,我把我的数据以长格式。我的例子:问题与ggplot2,geom_bar和位置=“闪避”:堆叠有正确的y值,闪避不

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") 

stacked plot

特别要注意的y值马克塞斯。它们是来自test的数据的总和,其中test2的值在上面显示为蓝色。

基于我读过的其他问题,我只需添加position="dodge",使之成为并排侧情节与堆叠之一:

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

dodged

它看起来很棒,但请注意新的最大值。看起来它只是从test的每个名称因子水平中获取y值的最大y值。它不再总结它们。

每其他一些问题(如this onethis one,我也尝试添加了group=选项没有成功(产生相同的回避情节如上):

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

我不明白为什么堆叠的伟大工程而回避不只是把它们并排而不是在顶部


ETA:我发现了一个recent question这个对ggplot谷歌组与建议添加alpha=0.5看看发生了什么。 ggplot不是从每个分组中获取最大值;它实际上是为每个值重叠绘制条形图。

看来,当使用position="dodge"时,ggplot只需要每x一个y。我联系了ggplot开发人员Winston Chang,以确认以及询问这是否可以改变,因为我没有看到优势。

看来stat="identity"应该告诉ggplot相符通过内部aes()强似没有Y值时会发生不stat="identity"和个人计数y=val

现在,解决办法似乎是(对于上述原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 

correct

回答

16

我认为这个问题是要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") 

Stacked bars

,您会获得在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) 

Dodged on num

如果您还添加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) 

Dodge all bars

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

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") 

Summarized beforehand

+0

明白了。指出我实际上要求避开和堆叠,这对你很有帮助。一个谬论:当不使用'stat =“identity”'(基本上是制作一个直方图),是不是ggplot“叠加”个别计数,而躲避其他特性?即使如此,我也没有问题,只是现在它是如何工作的。我以为我在代码中做错了什么! – Hendy 2012-07-23 21:48:01

+2

'geom_bar'可能有点令人困惑,因为它用于两个不同的目的:有时它用于绘制您提供的y值,有时它会计算每个值的数量并将该数值用作y值(使用' STAT = “BIN”')。后者的行为是默认的(你可以用'ggplot(df,aes(x = factor(names),fill = factor(num)))+ geom_bar(color =“black”)''看到它。在这种情况下,“堆叠”不完全相同 - 它是摘要_stat_,而通常的堆叠是_position adjustment_。这些事情发生在ggplot管道的不同阶段。 – wch 2012-07-24 00:59:11

+0

感谢您的解释。汇总不是什么大问题,现在我知道我需要,这是从困惑中迈出的一大步:) – Hendy 2012-07-24 18:25:12