雙軸圖形的優缺點,以R畫出客製化雙軸圖形
本篇文章將會介紹雙軸圖形的優缺點、實務上的使用和如何以R畫出客製化的雙軸圖形。

Photo by Luke Chesser on Unsplash
雙軸圖形的優缺點,以R畫出客製化雙軸圖形
本篇文章將會介紹雙軸圖形的優缺點、實務上的使用和如何以R畫出客製化的雙軸圖形。
雙軸圖形
雙軸圖形常被稱雙Y軸圖形 (Dual Axis Chart),是商業領域中常用的圖形之一。呈現趨勢時,會使用使用線形圖 (Line Chart)或長條圖(Bar Chart),通常Y軸擺在左邊,有時為了要比較兩種數值,會將第二個Y軸擺在右邊,能標記兩種不同資料單位的區間。
如下圖左邊Y軸為Volume,代表某產品每季流通在市場的數量,範圍為0~43,000,右邊Y軸為Value,代表某產品每季流通在市場的總市值,範圍為0~420,000,000。

常見的雙軸圖形還有品質管理使用的柏拉圖 (Pareto Chart),常用在不良品的分析,左邊Y軸為次數,右邊Y軸為次數占總次數的累積百分比,柏拉圖常用來歸納導致瑕疵的重要原因,例如佔總次數80%的原因。

Pareto Chart
雙軸圖形的優缺點
優點
- 呈現兩個維度的資訊
- 一次呈現兩個軸的趨勢,方便比較
缺點
- 由於兩個Y軸的尺度 (Scale)不同,容易誤解上升和下降的幅度相同
舉例來說,下圖的左邊Y軸為Volume,代表某產品每季的流通在市場的數量,第二個Y軸為Value,代表某產品每季的流通在市場的總市值。2017Q1到2017Q2間。在圖中,Value的上升比例約為Volume的兩倍,但實際上兩軸的尺度分別是0~43000和0~500,000,000,Volume上升了647,上升的比例約為1.97%,而Value上升了17,904,284,增加的比例約為5.94%,然而兩者上升的幅度天差地遠。

註: 圖中數字為非真實數據, 僅為範例參考
實務上的使用
The R Graph Gallery中的”Dual Y axis in R”一文中介紹使用latticeExtra套件中的doubleYScale()來繪製雙軸圖形,然而結論是奉勸讀者盡量不用使用此類型圖形。
看到這邊,可能會不禁有疑問既然實務上容易讓觀看者造成誤解,那為什麼還要使用呢? 雖然雙軸圖形容易造成誤解,但這是報告中常出現的圖形,可以表達兩種維度的資訊。
身為資料分析師,收到雙軸的圖形需求時,可以提醒使用者在使用上須小心,並可以了解使用者使用的目的,並討論是否以其他替代圖形來表達。
以R繪製客製化雙軸圖形
在上例中,左邊Y軸為Volume,範圍為0~43,000,右邊Y軸為Value,範圍為0~420,000,000,使用的資料集如下,由於兩軸的尺度不同,以ggplot2套件繪製客製化的雙軸圖形時,可以指定兩個軸的範圍,詳細說明及R程式碼如下。

sample data-volume and value.csv
以ggplot2圖形的邏輯來說,會以左邊軸的尺度為主,再將右邊Y軸的尺度疊加上去,因此繪製右邊軸的圖形時要將尺度縮小或放大來符合左邊軸的尺度。以上例為例,繪製右邊軸的圖形和加上文字要將尺度縮小。
而標記右邊Y軸的標籤 (0~420,000,000)時,相對於左邊軸的範圍(0~43,000)是放大,而放大的倍數,下例使用Value的最大值除以Volume的最小值。
- Step 1: 載入套件及讀入資料
library(ggplot2)
dataset = read.csv( 'sample data-volume and value.csv' )
- Step 2: 指定右邊軸的尺度相對於左邊軸尺度放大或縮小的倍數
parameter = max(dataset$Value) / max(dataset$Volume)
- Step 3: 先畫左邊軸Volume的長條圖
p = ggplot( data = dataset2, aes( x = YearQtr, y = Volume ) ) +
geom_bar( stat="identity", fill = '#28a9ff', width = 0.7 ) +
geom_text( aes( label = Volume ),size = 4, position =
position_stack(vjust = 0.5) ) +
theme(axis.title.x=element_blank(), axis.text.x =
element_text(angle = 90)) +
ylab( "Volume") + theme_classic()
- Step 4: 畫右邊軸Value的線圖,將尺度縮小以符合左邊軸的尺度,Value除以 parameter
p = p + geom_line( mapping = aes(y = Value/parameter, x = YearQtr,
group = 1 ) , color = '#FD9A28', inherit.aes = FALSE,
linetype="solid", size= 1.5 )
- Step 5: 標記右邊軸Value對應的數值時,將尺度縮小以符合左邊軸的尺度,Value除以parameter
p = p + geom_text( mapping = aes( y = Value/parameter, x = YearQtr,
label = Value ), colour = 'black', vjust = 2 ,size= 4 )
- Step 6: 畫上右邊軸(Value)的標籤,相對於左邊軸的範圍(0~43,000)是放大,Value乘以parameter
p = p + scale_y_continuous( sec.axis = sec_axis( ~.*parameter,
name = "Vlaue" ) )
如此一來就完成了客製化的雙軸圖形,其中Step 2 中的parameter可以調整到指定的倍數來試試看畫圖的效果,範例中以Value的最大值除上Volume的最大值。

Dual Axis Chart for Volume and Value
References
Link
메타데이터
- post_id
- f807469d91da
- slug
- 雙軸圖形的優缺點-以r畫出客製化雙軸圖形-f807469d91da
- url
- https://medium.com/@peisyuanli/%E9%9B%99%E8%BB%B8%E5%9C%96%E5%BD%A2%E7%9A%84%E5%84%AA%E7%BC%BA%E9%BB%9E-%E4%BB%A5r%E7%95%AB%E5%87%BA%E5%AE%A2%E8%A3%BD%E5%8C%96%E9%9B%99%E8%BB%B8%E5%9C%96%E5%BD%A2-f807469d91da
- canonical_url
- https://medium.com/@peisyuanli/%E9%9B%99%E8%BB%B8%E5%9C%96%E5%BD%A2%E7%9A%84%E5%84%AA%E7%BC%BA%E9%BB%9E-%E4%BB%A5r%E7%95%AB%E5%87%BA%E5%AE%A2%E8%A3%BD%E5%8C%96%E9%9B%99%E8%BB%B8%E5%9C%96%E5%BD%A2-f807469d91da
- author_url
- https://medium.com/@peisyuanli
- status
- ok
- fetched_at
- 2026-07-29 00:30:12