2017-05-31 72 views
0

我有一个我很满意的区域图。我试图在面积图的顶部覆盖一条粗实线。在ggplot的区域图中添加一条总和线

该图是按渠道显示的网站会话,其中每个渠道均为面积图中的组(填充)。我的想法是用一个非常沉重的阿尔法来显示总会话的实线图,显示这些会话的来源。

通过数据是这样的(因为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

如何通过沿着堆积区域图最顶部的折线图添加实线以表示总会话?

+0

换句话说当前图表的最顶部应该有一个坚实的粗线表示总交通量,因为下面的区域堆积 –

+0

@Axeman感谢,我给一个尝试,但没有改变'时间表< - ggplot(数据集,aes(x = Month,y = Sessions,fill = Channel,group = Channel))+ geom_area(alpha = 0.3)+ + stat_summary(aes(group = 1),fun.y = sum,geom =' line')' –

+1

D'oh!我有两个加号++,它可以工作。谢谢! –

回答

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

+0

谢谢你的回答。为了好玩,看看会发生什么,我尝试了group = 2。实际上,我得到了相同的结果。这里的团队号码是怎么处理的?我也试验了离开组队命令并且图表产生了不良结果。所以群组当然是需要的,只是试图了解数字的表示形式 –

+0

这个数字是无关紧要的,它只是将群组设置为常量,即您将覆盖在将审美设置为某个因素(如您的案例中的“x”)时发生的自动分组。 – Axeman

+1

明白了,好的,谢谢 –