2012-11-14 55 views
2

使用這些數據的工作:geom_bar停止時,羣加

library(ggplot2) 
dd <- data.frame(id = c("A", "A", "B", "B"), prepost = c("pre", "post"), 
     value = 1:4) 

這一個工程:

qplot(id, value, data = dd, fill = prepost, geom = "bar") 

然而,下一個給指定的錯誤消息。兩者之間的唯一區別是在命令的末尾添加group = prepost;然而,因爲我們已經寫了fill = prepost,無論如何應該是默認組。

> qplot(id, value, data = dd, fill = prepost, geom = "bar", group = prepost) 
Error in pmin(y, 0) : object 'y' not found 

我們可以通過添加stat = "identity"這樣解決了最後一個:

qplot(id, value, data = dd, fill = prepost, geom = "bar", group = prepost, 
     stat = "identity") 

我有兩個問題:

(一)爲什麼這給了錯誤消息qplot不行當其他人工作? (b)如果我們使用連續的y審美與geom_bar那麼如果沒有指定stat應該發生什麼?從第一個qplot似乎在這種情況下,它似乎stat="identity"但存在group指定stat="identity"或不顯示差異。

(順便說一句,這個問題似乎有點雖然它足夠的不同有關,這似乎並沒有回答這個問題:Issue with ggplot2, geom_bar, and position="dodge": stacked has correct y values, dodged does not

回答

1

一個很好的問題!

我將呼應@joran

一個先前的評論我發現一般人都用ggplot較少混淆,一旦他們學會停止使用qplot

qplot調用可以使用

重新創建
ggplot(dd) + geom_bar(aes(x = id, y = value, fill = prepost)) 

現在,如果您閱讀geom_bar的幫助,它會列出它的美學erstands,group是不是其中之一(所以也許你不能期望它如你所願地工作)

如果你閱讀group的幫助,你會發現它是一種美學,它可以讓你覆蓋所有離散變量的默認交互。

如果組單獨prepost,你是不是由離散x軸可變id,其默認將被包括在內分組,

因此

ggplot(dd) + 
geom_bar(aes(x=id, y = value, fill = prepost, group = interaction(id, prepost))) 

作品,但分組是完全多餘,因爲這是默認設置。

如果僅指定prepostid爲您的分組,它混淆了stat_bin(即搗弄數字爲條形圖創造價值的基本方法。因此,你需要使用stat_identity代替。


編輯:由OP在下面的評論指出,這是關係到一個known issue,並給在下一版本更好的警告(或TH在github

當前開發版本從新聞

  • stat_bin現在生產時,它使用具有集合或 映射y值警告消息。以前,有可能使用stat_bin和 也設置/映射y值;如果每個組有一個y值,則 將顯示來自數據的y值,而不是每個組的 個案的計數。此用法已過時,將在未來的ggplot2版本 中刪除。 (溫斯頓張。修正了#632)
+1

(a)見?aes_group_order (b)當您提供融化數據ggplot,它不知道你是否已經總結數據,或者沒有。 'stat = identity'只是告訴ggplot數據已經被彙總了。在「geom_bar」的幫助中包含了這些內容:「有時候,條形圖不是用作分佈摘要,而是用點圖來代替。通常,最好使用點圖(請參閱geom_point),因爲它具有更好的數據墨水比率。然而,如果你確實想創建這種類型的圖,你可以將y設置爲你已經計算的值,並且使用stat ='identity'' –

+0

@mnel,我不認爲這與'qplot'有什麼關係''與'ggplot1,因爲這也失敗了:'ggplot(dd,aes(id,value,fill = prepost,group = prepost))+ geom_bar() '但是在你的另一點上你是對的 - 我忘記了id '。但是,儘管如此,當我們添加'stat =「identity」'時仍然有效,所以仍然存在問題(b)。 – user1189687

+0

@brandon,當然它適用於'stat =「identity」'。我已經在提問中提到過了。 – user1189687