← Back to list

雙軸圖形的優缺點,以R畫出客製化雙軸圖形

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

Pei-Syuan Li · 2020-08-13 14:13 · 11 claps · 6.1 min read
#r #business-intelligence #data-science #ggplot2 #dual-axis-chart
Open on Medium ↗
Wiki topics: ML · Machine Learning 🔬 · Science · General

Photo by Luke Chesser on Unsplash

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

Pareto Chart

雙軸圖形的優缺點

優點

  1. 呈現兩個維度的資訊
  2. 一次呈現兩個軸的趨勢,方便比較

缺點

  1. 由於兩個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

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

Dual Axis Chart for Volume and Value

References

[embed]Dual Y axis in R This post explains how to build a line chart with dual Y axis with R. It show the evolution of 2 series, each line…www.r-graph-gallery.com

Link

[embed]Pei-Syuan Li 以下請見我的簡介,謝謝! Senior Data Analytics Engineer; Never stop learning! About Me 技能 文章 專案 志工經驗 學習課程 連結…www.notion.so


메타데이터
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