我有一个使用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))))
但是,正如我所期望的那样,它在每个方面都放置了相同值的水平线。如果有意义的话,我希望这条线是特定方面的。
可以这样做吗?
答案 0 :(得分:4)
您可以在数据框中创建包含平均值的新列。我将其命名为y.int
,并使用库ddply()
中的函数plyr
进行计算。此处的平均值仅针对Type
为Completed
的值计算(应排除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 ~ .)