2012-07-22 101 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