在ggplot中的区域图中添加一个总计线

时间:2017-05-31 08:24:01

标签: r ggplot2

我有一张我很满意的区域图表。我试图在区域图的顶部覆盖一条粗实线。

该图是按频道划分的网站会话,其中每个频道都是区域图中的组(填充)。我的想法是,我将展示一个完整会话的实线图表,其中包含非常重的alpha,显示这些会话的来源。

数据看起来像这样(因为ggplot函数依赖于数据结构)

> str(dataset)
'data.frame':   144 obs. of  5 variables:
 $ Month       : Factor w/ 24 levels "May-2015","Jun-2015",..: 1 2 3 4 5 6 7 8 9 10 ...
 $ Channel     : Factor w/ 6 levels "Facebook","Youtube",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ Sessions    : num  5065 4226 4779 5736 6350 ...

> head(dataset, n = 20)
      Month  Channel Sessions
1  May-2015 Facebook     5065
2  Jun-2015 Facebook     4226
3  Jul-2015 Facebook     4779
4  Aug-2015 Facebook     5736
5  Sep-2015 Facebook     6350
6  Oct-2015 Facebook     6199
7  Nov-2015 Facebook     8474
8  Dec-2015 Facebook     8340
9  Jan-2016 Facebook    11376
10 Feb-2016 Facebook    11290
11 Mar-2016 Facebook    13255
12 Apr-2016 Facebook    16693
13 May-2016 Facebook    14618
14 Jun-2016 Facebook    14208
15 Jul-2016 Facebook    14016
16 Aug-2016 Facebook    14978
17 Sep-2016 Facebook    14559
18 Oct-2016 Facebook    10583
19 Nov-2016 Facebook     6930
20 Dec-2016 Facebook     8918

我的区域图表:

timeline <- ggplot(dataset, aes(x = Month, y = Sessions,fill = Channel, group = Channel)) +
  geom_area(alpha = 0.7) +

# This piece right here is where I tried to add a solid line
  geom_line(data = dataset, inherit.aes = FALSE, aes(x = Month, y = Sessions, group = Month)) +

  theme(axis.text.x=element_text(angle=90, hjust=1))

我成功并包括geom_area(alpha = 0.7),因为这会产生一个很好的区域图表。

但下一行会导致意外行为:

geom_line(data = dataset, inherit.aes = FALSE, aes(x = Month, y = Sessions, group = Month))

我希望看到一条连续的线覆盖在顶部,而是得到一系列破碎的垂直条。请参阅输出底部的黑线。我尝试添加/删除命令group = Month但是没有改变任何内容:enter image description here

如何通过折叠区域图表顶部的折线图添加实线来表示总会话数?

1 个答案:

答案 0 :(得分:2)

虽然你在那里展示了一些不错的数据,但它实际上并不是可重现的。从帮助文件我们可以做到:

series <- data.frame(
  time = c(rep(1, 4),rep(2, 4), rep(3, 4), rep(4, 4)),
  type = rep(c('a', 'b', 'c', 'd'), 4),
  value = rpois(16, 10)
)
ggplot(series, aes(time, value)) +
  geom_area(aes(fill = type))

要计算总和,我们必须实际总结这些区域,这可以通过stat_summary完成:

ggplot(series, aes(time, value)) +
  geom_area(aes(fill = type)) +
  stat_summary(fun.y = sum, geom = "line", size = 2)

如果需要,您可以将aes(group = 1)添加到stat_summary。这样可以确保仅针对xy进行计算,而无需进一步分组,并且线路已连接。它会覆盖自动分组,当您将美学设置为因子时会发生这种分组。如果x是一个因素,这也会有所帮助,就像你的例子一样。

像您一样使用geom_line,为每个x坐标创建多个值(每个Channel一个)。enter image description here