1

我有一个使用 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

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

我试过:

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

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

这可以做到吗?

4

2 回答 2

5

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

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

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

plot + geom_hline(aes(yintercept=y.int))
于 2013-07-12T16:19:08.967 回答
3

Didzis 答案的一个变体,我将为您要在每个方面显示的摘要数据制作一个单独的数据框。

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 ~ .)
于 2013-07-12T17:39:17.460 回答