R語言數據可視化ggplot添加左右y軸繪制天貓雙十一銷售圖
本文是以天貓雙十一銷量與增長率為例,原始的數據可以參考上一篇文章:用 ggplot 重繪天貓雙十一銷售額圖,這裡不再作過多的介紹。
同時整個的天貓雙十一的銷售額數據分析可以關註:天貓雙十一“數據造假”是真的嗎?
老規矩,先上最終成果(兩張圖隻是顏色的差別):
上圖左邊 y 軸表示增長率的刻度,右邊 y 軸表示銷售額的數據,我們將兩者在同一張圖上進行展現。其實將兩個統計圖在同一個坐標系中呈現不算是這個繪圖的難點,其真正的難點在與刻度的變換以及坐標軸標簽的設定。
下面我們開始一步一步來繪制出上圖所示的圖案~
構造數據集
構造數據集前,我們先看看數據:
年份 | 銷售額 | 增長率 |
---|---|---|
2009 | 0.5 | — |
2010 | 9.36 | 1772.00 |
2011 | 52 | 455.56 |
2012 | 191 | 267.31 |
2013 | 350 | 83.25 |
2014 | 571 | 63.14 |
2015 | 912 | 59.72 |
2016 | 1207 | 32.35 |
2017 | 1682 | 39.35 |
2018 | 2135 | 26.93 |
2019 | 2684 | 25.71 |
由於銷售額與增長率都是近乎相同的量綱(單論數值看,都是在 0-3000 之間),所以我們在事先可以不對數據進行變換,變換為統一的尺度。但我想要在坐標軸上,增長率以百分比的形式顯示,所以需要除以100,但增長率除以100之後,為瞭把我們的兩個 y 軸變換到同一個尺度區間,所以銷售額也需要隨之除以100。(註意,這裡的銷售額除以100 可以不需要具體的實際意義,隻是保證在圖像上呈現效果美觀即可,最後的實際區間我們可以通過修改坐標軸的刻度值實現。)
因此生成數據的代碼如下:
year <- 2009:2019 sales <- c(0.5, 9.36, 52, 191, 350, 571, 912, 1207, 1682, 2135, 2684) growth_rate <- c(NA, diff(sales) / sales[1:(length(sales) - 1)] * 100) dat_overview <- data.frame(year = factor(year), sales = sales / 100, growth_rate = growth_rate / 100)
但經常使用 ggplot 童鞋可能知道,我們沒有辦法直接隻用上述的數據在 ggplot 中進行繪制,需要進行一個變換,也就是將銷售額與增長率並列,並且再加一列變量作為 index,具體操作我們可以使用管道數據處理的 package :tidyr
。(具體的原因與使用方法可參見:tidyr+ggplot2多個變量分層展示)
library(tidyr) dat_overview %>% gather(sales, growth_rate, key = "var", value = "value")
其結果如下:
year var value 1 2009 sales 0.0050000 2 2010 sales 0.0936000 3 2011 sales 0.5200000 4 2012 sales 1.9100000 5 2013 sales 3.5000000 6 2014 sales 5.7100000 7 2015 sales 9.1200000 8 2016 sales 12.0700000 9 2017 sales 16.8200000 10 2018 sales 21.3500000 11 2019 sales 26.8400000 12 2009 growth_rate NA 13 2010 growth_rate 17.7200000 14 2011 growth_rate 4.5555556 15 2012 growth_rate 2.6730769 16 2013 growth_rate 0.8324607 17 2014 growth_rate 0.6314286 18 2015 growth_rate 0.5971979 19 2016 growth_rate 0.3234649 20 2017 growth_rate 0.3935377 21 2018 growth_rate 0.2693222 22 2019 growth_rate 0.2571429
繪制散點
首先我們將數據框中的散點映射到圖像中:
dat_overview %>% gather(sales, growth_rate, key = "var", value = "value") %>% ggplot(aes(x = year, y = value, col = var)) + geom_point(size = 3, alpha = 0.6)
這裡我們使用的是管道數據的 ggplot
的繪制方法,所以數據集直接使用 %>%
連接即可,不需要寫在 ggplot()
函數中。
同時關於繪圖,上面隻是修改瞭我們散點的尺寸與透明度:size = 3, alpha = 0.6
,得到的繪圖如下面所示。
這時候的圖還是非常 吃藕 (chou) 的,下面我們再精雕細琢一些坐標的佈局與名稱。
修改兩坐標軸信息
先直接上代碼:
dat_overview %>% gather(sales, growth_rate, key = "var", value = "value") %>% ggplot(aes(x = year, y = value, col = var)) + geom_point(size = 3, alpha = 0.6) + scale_y_continuous("增長率", labels = scales::percent, sec.axis = sec_axis(~ . * 100, name = "銷售額 (億元)")) + # scale_color_manual(labels = c("增長率", "銷售額 (億元)"), values = c("blue", "red")) + scale_color_discrete(labels = c("增長率", "銷售額 (億元)")) + labs(title = "2009 - 2019 年銷售額與增長率", x = "年份") + theme(legend.position = "bottom", legend.title = element_blank(), plot.title = element_text(hjust = 0.5))
這裡我們新添加瞭 scale_y_continuous(),這裡是修改 y 軸的刻度,首先我們修改瞭 y 軸左軸的名稱,為增長率,然後 label = scales::percent 表示將刻度上的數值以百分比的形式顯示。
最後 sec.axis = sec_axis(~ . * 100, name = “銷售額 (億元)”) 則是添加右側 y 軸 (這裡叫 scecond axis),刻度為原始刻度乘以100,這裡乘以100是由於我們在生成銷售額數據的時候,為瞭容易尺度范圍,除以瞭100,同時添加右側 y 軸的名稱: “銷售額 (億元)”。
scale_color_discrete() 表示將我們的圖例中的名稱進行修改:英文改成中文。
也可以使用註釋中的 scale_color_manual() 函數,同時修改名稱與散點的顏色,這裡添加瞭註釋,需要的童鞋可以取消註釋,同時將 scale_color_discrete() 打上註釋。
接著我們再修改一些主題設置:legend.position = “bottom” 將我們圖例的標簽調整到底部。其它的設置都是一些常規操作,可以翻看前面的博文,這裡就不進行細說瞭。
最後就能得到我們最終的成果!
以上就是R語言數據可視化ggplot添加左右y軸繪制天貓雙十一銷售額的詳細內容,更多關於ggplot添加左右兩邊y軸的資料請關註WalkonNet其它相關文章!
推薦閱讀:
- R語言使用ggplot繪制畫中畫細節放大的方法
- R語言數據可視化tidyr與ggplot2多個變量分層展示舉例實現
- R語言學習ggplot2繪制統計圖形包全面詳解
- R包ggtreeExtra繪制進化樹
- R語言數據可視化ggplot繪制置信區間與分組繪圖技巧