R堆积条总数百分比

时间:2015-09-07 17:13:43

标签: r ggplot2

我有一个如下所示的数据集:

colour  week    value
Blue    201523  374
Blue    201524  310
Blue    201525  300
Green   201523  1951
Green   201524  2299
Green   201525  2111
Red     201523  414
Red     201524  361
Red     201525  279

我希望生成一个叠加图,其中总值与按时间分组的时间百分比。

以下代码给出了正确的图,但是使用绝对值而不是总数的百分比(数据集保存为df):

  g <- ggplot(data = df)
  g <- g + geom_bar(stat = 'identity', aes(x = Time, y = value, fill = Colour)) + scale_y_continuous(labels = percent)
  g <- g + labs(x = 'Timespan', y = '') + guides(fill = guide_legend(reverse = FALSE))
    theme(legend.text = element_text(size = 12), axis.title.x = element_text(size = 14, vjust = -0.5, face = 'bold'), legend.title = element_text(size = 14),
          axis.text.x = element_text(angle = 45, size = 10.5))
  g

有没有办法在ggplot的调用中获得总数的百分比?或者如果没有,可以在ggplot调用之前使用ddply函数执行此操作?

1 个答案:

答案 0 :(得分:0)

这样的东西?

library(ggplot2)
df$pct <- df$value/ave(df$value,df$week,FUN=sum)  

ggplot(df, aes(x=week, y=pct, fill=tolower(colour))) + 
  geom_bar(stat="identity")+
  scale_fill_identity("color", guide="legend")

几点说明:

  1. 可以在aes(y=value/sum(value),...)的调用中使用ggplot,但不幸的是,聚合函数(如sum(...) )不尊重隐式分组fill=...定义。因此,您可以获得所有值的总和,而不仅仅是给定组的值。如果你想要后者,你必须像上面那样扩充data.frame。
  2. 至少可以说,你对颜色的使用是折磨的。不要在数据集中定义颜色,根据数据中的含义为组提供语义名称。让ggplot担心颜色。我不得不使用scale_fill_identity(...)来覆盖ggplot的默认配色方案。