2017-05-31 91 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

明白了,好的,謝謝 –