本文是以天貓雙十一銷量與增長率為例,原始的數(shù)據(jù)可以參考上一篇文章:用 ggplot 重繪天貓雙十一銷售額圖,這里不再作過多的介紹。
同時整個的天貓雙十一的銷售額數(shù)據(jù)分析可以關(guān)注:天貓雙十一“數(shù)據(jù)造假”是真的嗎?
老規(guī)矩,先上最終成果(兩張圖只是顏色的差別):
上圖左邊 y 軸表示增長率的刻度,右邊 y 軸表示銷售額的數(shù)據(jù),我們將兩者在同一張圖上進行展現(xiàn)。其實將兩個統(tǒng)計圖在同一個坐標(biāo)系中呈現(xiàn)不算是這個繪圖的難點,其真正的難點在與刻度的變換以及坐標(biāo)軸標(biāo)簽的設(shè)定。
下面我們開始一步一步來繪制出上圖所示的圖案~
構(gòu)造數(shù)據(jù)集
構(gòu)造數(shù)據(jù)集前,我們先看看數(shù)據(jù):
年份 | 銷售額 | 增長率 |
---|---|---|
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 |
由于銷售額與增長率都是近乎相同的量綱(單論數(shù)值看,都是在 0-3000 之間),所以我們在事先可以不對數(shù)據(jù)進行變換,變換為統(tǒng)一的尺度。但我想要在坐標(biāo)軸上,增長率以百分比的形式顯示,所以需要除以100,但增長率除以100之后,為了把我們的兩個 y 軸變換到同一個尺度區(qū)間,所以銷售額也需要隨之除以100。(注意,這里的銷售額除以100 可以不需要具體的實際意義,只是保證在圖像上呈現(xiàn)效果美觀即可,最后的實際區(qū)間我們可以通過修改坐標(biāo)軸的刻度值實現(xiàn)。)
因此生成數(shù)據(jù)的代碼如下:
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)
但經(jīng)常使用 ggplot 童鞋可能知道,我們沒有辦法直接只用上述的數(shù)據(jù)在 ggplot 中進行繪制,需要進行一個變換,也就是將銷售額與增長率并列,并且再加一列變量作為 index,具體操作我們可以使用管道數(shù)據(jù)處理的 package :tidyr。(具體的原因與使用方法可參見:tidyr+ggplot2多個變量分層展示)
library(tidyr) dat_overview %>% gather(sales, growth_rate, key = "var", value = "value")
其結(jié)果如下:
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
繪制散點
首先我們將數(shù)據(jù)框中的散點映射到圖像中:
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)
這里我們使用的是管道數(shù)據(jù)的 ggplot 的繪制方法,所以數(shù)據(jù)集直接使用 %>% 連接即可,不需要寫在 ggplot() 函數(shù)中。
同時關(guān)于繪圖,上面只是修改了我們散點的尺寸與透明度:size = 3, alpha = 0.6,得到的繪圖如下面所示。
這時候的圖還是非常 吃藕 (chou) 的,下面我們再精雕細琢一些坐標(biāo)的布局與名稱。
修改兩坐標(biāo)軸信息
先直接上代碼:
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 表示將刻度上的數(shù)值以百分比的形式顯示。
最后 sec.axis = sec_axis(~ . * 100, name = "銷售額 (億元)") 則是添加右側(cè) y 軸 (這里叫 scecond axis),刻度為原始刻度乘以100,這里乘以100是由于我們在生成銷售額數(shù)據(jù)的時候,為了容易尺度范圍,除以了100,同時添加右側(cè) y 軸的名稱: "銷售額 (億元)"。
scale_color_discrete() 表示將我們的圖例中的名稱進行修改:英文改成中文。
也可以使用注釋中的 scale_color_manual() 函數(shù),同時修改名稱與散點的顏色,這里添加了注釋,需要的童鞋可以取消注釋,同時將 scale_color_discrete() 打上注釋。
接著我們再修改一些主題設(shè)置:legend.position = "bottom" 將我們圖例的標(biāo)簽調(diào)整到底部。其它的設(shè)置都是一些常規(guī)操作,可以翻看前面的博文,這里就不進行細說了。
最后就能得到我們最終的成果!
以上就是R語言數(shù)據(jù)可視化ggplot添加左右y軸繪制天貓雙十一銷售額的詳細內(nèi)容,更多關(guān)于ggplot添加左右兩邊y軸的資料請關(guān)注服務(wù)器之家其它相關(guān)文章!
原文鏈接:https://kanny.blog.csdn.net/article/details/103301608