将变量geom_hline添加到条形图的所有方面

时间:2013-07-12 15:59:39

标签: r ggplot2

我有一个使用ggplot2库的条形图:

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

这给了我一个刻面的条形图,名字。

前11行的cns看起来像:

            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

我想在每个方面添加一条水平线,平均天数(特定于方面或名称)。这也很复杂,因为列“Days”为所有Type'Requested'输入了0,这意味着为了获得我正在寻找的平均值我真的想要mean(cns$Days)/(NROW(cns)/2)

我试过了:

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

但是,正如我所期望的那样,它在每个方面都放置了相同值的水平线。如果有意义的话,我希望这条线是特定方面的。

可以这样做吗?

2 个答案:

答案 0 :(得分:4)

您可以在数据框中创建包含平均值的新列。我将其命名为y.int,并使用库ddply()中的函数plyr进行计算。此处的平均值仅针对TypeCompleted的值计算(应排除Requested)。

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

现在使用geom_hline()和新列为每个方面添加行。

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

答案 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 ~ .)