JOVANA
Explore Library Glossary Getting Started Three Levels Fields How it works Mission
Join the mission
All guides

選對圖表

長條、折線、散布、直方、盒鬚——每一種回答不同的問題。一張從「我想表達什麼?」對應到正確圖像的簡單地圖。

先問問題,別急著挑圖表

很多人一打開試算表,就直接抓一個看起來很厲害的圖——花花綠綠的圓餅圖、立體長條塔。這其實是本末倒置。圖表不是裝飾品,它是對某個問題的回答。如果你不知道問題是什麼,任何圖都不會對。所以資料視覺化的第一項技能根本不是畫圖,而是先問:「我究竟想讓這張圖呈現什麼?」

幾乎每一個日常的資料問題,都屬於五種類型之一。只要你能說出自己問的是哪一種,正確的圖表幾乎就自己跳出來了。以下用白話列出這五種,以及每一種所回答的問題。

  1. 比較(comparison)—「這個數字在不同類別之間有什麼差異?」(各地區的銷售、各政黨的得票)。
  2. 分布(distribution)—「某一個數字是怎麼散開的?」(使用者的年齡、請求花多久時間)。
  3. 關係(relationship)—「兩個數字會一起變動嗎?」(讀書時數對考試分數)。
  4. 時間趨勢(trend)—「這個數字隨時間怎麼變化?」(今年每天的註冊數)。
  5. 組成(composition)—「一個整體由哪些部分組成,各佔多大?」(各產品佔營收的比例)。

這篇會走過前四種——比較、分布、關係、趨勢——因為它們涵蓋了實務上絕大多數的工作;接著再介紹讓任何一種圖都更清楚的「編碼」與「版面」觀念。(組成,也就是「佔整體多少」的問題,最常被畫壞;我們會在下一篇談誠實處理它的方法。)把這一切都當成探索性資料分析的一部分:你通常會先試幾種,才找到那個真正把故事說清楚的圖。

比較:把長條圖畫對

比較是最常見的問題:同一個數字,在好幾個類別上各量一次,你想看出誰大誰小。最自然的工具就是長條圖。每個類別配一根長條,長條的長度代表那個數字。具體例子:某連鎖咖啡店上週在臺北賣了 1,200 杯、臺中 800 杯、高雄 600 杯、臺南 300 杯。畫四根長條,由高到低排好,半秒內排名就一目了然。

好的長條圖和會誤導人的長條圖,差在兩個習慣。第一,依數值排序,不要照筆畫或字母——這張圖的重點就是順序,所以要讓順序看得見。第二,這點沒有商量餘地:數值軸一定要從零開始。我們是用長度來判斷一根長條的,所以如果軸不是從 0、而是從 500 開始,那麼 600 的長條看起來可能比 550 的長條高一倍,儘管真正的差距很小。像這樣截斷座標軸,就是經典的截斷座標軸把戲,而在長條圖上,這根本就是錯的。

再補幾個實用提醒。如果類別名稱很長(產品名、國名),就用橫向長條,標籤才好讀。如果你要比較同一批類別在兩種情境下的表現——今年對去年——可以把長條並排(分組)或疊起來(堆疊),但系列數絕不要超過寥寥幾個,否則整張圖會糊成一團。還有,要忍住別用圓餅圖:圓餅要你的眼睛去比角度和扇形面積,而人類判斷這些遠不如判斷長條的長度準。拿不定主意時,長條圖幾乎每次都贏過圓餅圖。

import pandas as pd
# one bar per city, sorted, drawn horizontally for readable labels
sales.groupby("city")["cups"].sum().sort_values().plot.barh()
用一行 pandas 就能畫出整張比較圖:依城市分組、加總杯數、排序,再畫成橫向長條。
整篇指南的全景圖:每一種問題類型都指向它對應的圖。下面我們會逐一拆解每個分支。

一張決策地圖。從起始問題出發,分支通往各種圖表:比較 → 長條圖;分布 → 直方圖或盒鬚圖;關係 → 散布圖;時間趨勢 → 折線圖;組成 → 各部分的長條圖(只有二到三塊時才考慮圓餅圖)。

分布:直方圖與盒鬚圖

比較圖是每個類別一個數字。但很多時候,你手上的是同一個數字的許多個值——一萬名顧客的年齡、一台伺服器量了一百萬次的回應時間——你想看的是這些值是怎麼散開的。這種散開的情況就叫做分布,而看分布的主力工具就是直方圖

直方圖把數值的範圍切成一格格等寬的桶子,叫做「組距」(bin),每一格畫一根長條,高度就是落進那一格的值有幾個。例如:拿顧客年齡,分成 0–9、10–19、20–29……等組,數一數每一格有多少人,你馬上就看到形狀——也許在三十幾歲有一個隆起,再拖著一條由年長顧客構成的長尾。這個形狀能回答單一平均數永遠回答不了的問題:它對稱嗎?是不是偏態的(有一條長尾拖向某一側)?會不會是雙峰的(兩個隆起,常常代表把兩群不同的人混在了一起)?

同樣是資料,直方圖能揭露的三種形狀:對稱的鐘形、右偏的長尾,以及雙峰。光看一個平均數,是分辨不出這三者的。

三張並排的小直方圖:一張對稱的鐘形曲線;一張右偏曲線,質量大多在左側、向右拖著長尾;以及一張有兩個分開隆起的雙峰曲線。

真正重要的旋鈕只有一個:組數。組數太少,會把真實結構糊成一塊大磚頭;組數太多,隨機雜訊看起來就像一排尖刺。一個粗略的起點是用觀測值個數的平方根當組數,再用肉眼微調,直到形狀看起來誠實為止。

\text{number of bins } k \approx \sqrt{n}, \qquad \text{bin width} = \frac{x_{\max}-x_{\min}}{k}

直方圖組數的起步經驗法則:大約 √n 個組,每組蓋住範圍的等寬一段。永遠要微調,直到圖既不笨重一塊、也不參差尖銳。

ages.plot.hist(bins=30)  # then change 30 up or down until the shape is honest
畫直方圖只要一行;功夫在於選組距。多試幾個 bins 值,留下那個能呈現真實形狀的。

當你想一次比較好幾組的分布時,一堆直方圖就會擠成一團。這時就輪到盒鬚圖(box-and-whisker plot)發光了。它把一個分布壓縮成五個數字:中位數(正中間的值)、第一與第三四分位數 Q1 與 Q3(第 25 與第 75 百分位,構成那個「盒子」),以及向資料其餘部分伸出的「鬚」。盒子的寬度就是四分位距(IQR),也就是中間一半的散布範圍;超出鬚之外的點,會被標記為可能的離群值

\text{IQR}=Q_3-Q_1, \qquad \text{whiskers reach to } [\,Q_1-1.5\,\text{IQR},\ \ Q_3+1.5\,\text{IQR}\,]

盒鬚圖如何決定鬚的長度、又如何挑出要標成離群值的點——常見的 1.5 × IQR 慣例。

關係:散布圖

下一個問題把兩個數字連起來:它們會一起變動嗎?多讀一個小時,是不是就配上更高的考試分數?多花廣告費,是不是就配上更多銷售?回答這個問題的圖是散布圖:每個觀測值一個點,依它的 (x, y) 位置擺放。每位學生變成一個點,落在(讀書時數,分數)的位置;一萬名學生就構成一團點雲,而這團雲的形狀就是答案。

看散布圖時,注意四件事:方向(x 變大時,y 是上升還是下降?)、強度(雲是緊貼著某條趨勢,還是一團模糊的斑塊?)、形態(直線、曲線,還是先升後平的高原?),以及任何怪異之處(遠離人群的離群點,或暗示兩群人被混在一起的分開叢集)。

有一個單一數字——相關係數 r——可以把一段「直線關係」的強度與方向總結起來。它的範圍從 −1 到 +1:接近 +1 時,點緊貼一條上升的線;接近 −1 時貼著下降的線;接近 0 時,則完全沒有直線趨勢。

-1 \le r \le +1

相關係數 r 落在 −1 到 +1 之間:−1 是完美的下降直線,0 是沒有線性趨勢,+1 是完美的上升直線。

一張散布圖,配上一條穿過它的配適線。點顯示原始的關係,線只是一個摘要。先讀點——線可能藏起雲真正的樣子。

一張散布圖,點由左下往右上呈上升趨勢,雲的中間畫著一條直的最佳配適線,顯示出正向關係。

時間趨勢:折線圖

當 x 軸是時間時,你遇到的是一個特殊又非常常見的情況:趨勢。一整年每天的活躍使用者、一座城市每月的雨量、一檔股票每分鐘的價格。對的圖是折線圖:把每個時間點畫出來,再依時間順序把點連起來。這條連起來的線就是重點所在——它讓上升、下降、季節性的波動,以及突然的跳動,一下子就跳進眼裡。

折線圖傳遞一個強烈而無聲的訊息:點與點之間的連結是真實而連續的。正因如此,你只能在 x 軸有序且連續時使用它,例如日期或溫度。絕不要拿線去連無序的類別——用線把「蘋果 → 香蕉 → 櫻桃」連起來,會暗示水果之間有一條平滑的趨勢,而那根本不存在。面對分開的類別,請回到長條圖。

再補兩點。和長條圖不同,折線圖用的是「位置」而非長度,所以它可以讓 y 軸從零以上開始,以放大那些雖小卻有意義的擺動——只要把軸標清楚就好。另外,當一個量是以百分比成長時——使用者數每年翻倍——在 y 軸用對數刻度,就能把指數成長拉成一條直線,讓成長率變得好讀,也能跨時期比較。(座標軸與刻度的誠實用法,我們會在下一篇處理。)

視覺編碼:位置、長度、顏色

每一張圖底下都藏著同一個觀念:視覺編碼——把一個數字變成你看得見的東西,例如位置、長度、角度、面積或顏色。散布圖和長條圖之所以這麼好用,圓餅圖之所以這麼難用,原因就在於:人眼對這些「通道」的解讀能力,並不一樣好。

數十年的知覺研究,給了我們一個粗略排名:人類讀取每種通道的準確度。用這個排名來決定,你最重要的那個數字該配哪一種通道。

  1. 沿著共同刻度的位置——最準確。這就是散布圖與點圖。
  2. 長度——次佳。這就是長條圖。
  3. 角度與斜率——比較不可靠。圓餅的扇形與折線的斜率屬於這一層。
  4. 面積——更差。泡泡大小要眼睛去比面積,而眼睛做得很糟。
  5. 色相與深淺——用來表達「數量」時最不準。我們分得出深淺,卻分不出「深了 37%」。

實用守則就直接跟著出來了:用問題所允許的最準確通道——位置或長度——來編碼你最重要的數字,把顏色留給標示與強調,而不是用來表達主要的數量。這一條守則,一筆就解釋了本篇大半的建議。

顏色仍然值得單獨小心,因為它要做三種不同的工作,每一種都需要不同的色彩刻度:用一組各自分明的色相來「命名」群組(紅=北部、藍=南部);用一條由淺到深的「順序」刻度來表達有序的量(低到高);以及用一條兩端各一色、在中性中點交會的「發散」刻度,來表達有意義中心的資料(虧損一色、獲利另一色,圍繞著零)。而且不論你選哪一種,都要記得:大約每十二位男性就有一位有某種色盲——絕不要只靠紅對綠來區分;加上標籤、形狀或直接的文字當後援。

面對眾多組別:小倍數圖

遲早你會需要為許多組別畫同一種圖:不是一個地區、而是全部十二個地區的銷售趨勢;或八項產品各自的年齡分布。最誘人的做法,是把每一條線都疊到同一張圖上。三條線還好;十二條就會纏成一團、被戲稱為義大利麵圖,沒有一條線跟得下去。

乾淨的解法是小倍數圖:一格網格、許多張小圖,每組一張,全都用同樣的方式畫,而且——這是關鍵——共用同樣的座標軸與同樣的刻度。十二張小折線圖,x 範圍與 y 範圍都相同,排成 3 × 4 的網格。因為每一格除了資料以外都一模一樣,你的眼睛掃過整片網格,就能立刻看出哪個地區在攀升、哪個持平、哪個有奇怪的尖峰。你用「全部塞進一張圖」的假承諾,換來「快速而公平的比較」這項真本事。

選圖速查表

把一切兜起來,整個決定就收斂成一個動作:先說出問題,再把對應的圖讀出來。以下就是那張地圖,五行說完。

  1. 在不同類別間比較一個數字?→ 長條圖(排序、軸從零開始;標籤長就用橫向)。
  2. 呈現一個數字怎麼散開?→ 單一組用直方圖;要比較多組就用盒鬚圖。
  3. 問兩個數字是否一起變動?→ 散布圖(瞄一眼 r,但相信那團雲)。
  4. 追蹤一個數字隨時間變化?→ 折線圖(時間放 x 軸,依序連點)。
  5. 呈現整體的各部分?→ 通常「各部分的長條圖」比圓餅圖清楚;只有兩三塊時才考慮圓餅圖。

出門前帶走兩個告誡。第一,最花俏的圖鮮少是最好的;一根樸素、標示清楚的長條或折線,每次都贏過華麗旋轉的立體甜甜圈,因為任務是「理解」,不是「裝飾」。第二,選對圖型只是誠實的一半——同樣一張散布圖或折線圖,仍可能靠截斷的座標軸、偷偷摸摸的雙軸,或糟糕的配色來誤導人。挑對圖像是本篇的事;讓那張圖像保持真實,是下一篇的事。

最後,當許多這樣的圖被聚在一起、供觀眾長期觀看時,它們就升格成一張儀表板。儀表板不是新的圖種——它是一群圖的集合——所以每一塊磚都仍要遵守同樣的規則:每張圖一個清楚的問題、用問題允許的最準確編碼、座標軸要說真話。把單一張圖練到精通,儀表板自然水到渠成。