2013-07-12 88 views
0

的各個方面,我必須使用GGPLOT2庫barplot:
變量geom_hline添加到barplot

plot <- qplot(Date, data=cns, 
       geom="bar", binwidth = 1, 
       fill=Type, facets = Name ~ .) 

,給了我一個方位barplot,按名稱。

CN的前11排的樣子:

  Name  Date  Type  Days 
1   Name 1 2013-03-12 Requested 0 
2   Name 1 2013-03-14 Requested 0 
3   Name 1 2013-03-19 Requested 0 
4   Name 2 2013-03-01 Completed 1 
5   Name 2 2013-03-01 Requested 0 
6   Name 2 2013-03-07 Completed 3 
7   Name 2 2013-03-08 Requested 0 
8   Name 2 2013-03-08 Requested 0 
9   Name 3 2013-03-08 Completed 0 
10   Name 3 2013-03-13 Requested 0 
11   Name 3 2013-03-12 Completed 0 

我想水平線添加到每個方面,與天的平均數(具體到面,或名稱)。這也很複雜,因爲列「天」已爲所有類型'請求'輸入0,這意味着要獲得我正在尋找的意思,我真的想要mean(cns$Days)/(NROW(cns)/2)

我想:

plot + geom_hline(aes(yintercept=(sum(cns$Days)/(NROW(cns)/2)))) 

但是,正如我有點期待,它把各方面的相同值的水平線。如果這是有道理的,我希望該行是面向特定的。

可以這樣做嗎?

+0

的基本思想是使一個數據幀所要求的值,並直接傳遞到'geom_hline'。但是你對「平均天數」的含義的描述很不明確,所以我不能說超過這個。 – joran

回答

3

您可以在數據框中創建包含平均值的新列。我將它命名爲y.int,並使用庫plyr中的函數ddply()進行計算。此處的平均值僅適用於TypeCompleted(因爲Requested應排除在外)的值。

library(plyr) 
cns<-ddply(cns,.(Name),transform,y.int=mean(Days[Type=="Completed"])) 

現在使用geom_hline()和新列向每個方面添加行。

plot + geom_hline(aes(yintercept=y.int)) 
+0

,現在閱讀plyr文檔。非常感謝。 – user1893148

+1

通過將'y.int'放入'cns'中,然後調用'geom_hline',您將在每個方面(對應於該方面的'cns'中的每一行繪製多條水平線)。雖然這可能沒有實際效果,但在某些情況下它可能(透明度,反鋸齒,繪圖文件大小)。 –

+0

@BrianDiggs +1你說的對,製作新的數據框可能是更好的方法。 –

2

Didzis's answer一個變種,我會做出你想要每面顯示的彙總數據一個單獨的數據幀。

library("plyr") 
cns.annotate <- ddply(cns, .(Name), summarize, y.int=mean(Days[Type=="Completed"])) 

然後將該數據幀傳遞給geom_hline

qplot(Date, data=cns, 
     geom="bar", binwidth = 1, 
     fill=Type, facets = Name ~ .) + 
    geom_hline(data=cns.annotate, aes(yintercept=y.int)) 

或ggplot而非qplot語法:

ggplot(cns, aes(x=Date)) + 
    geom_bar(aes(fill=Type), binwidth=1) + 
    geom_hline(data=cns.annotate, aes(yintercept=y.int)) + 
    facet_grid(Name ~ .)