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其它相關文章!

推薦閱讀: