Learning Objectives
- 說出截斷的 y 軸、雙軸、面積與立體效果、不等距的軸各自怎麼誤導讀者,並修正它們
- 算出圖上看起來的倍數與實際倍數,用謊言因子判斷一張圖忠不忠實
- 用說出結論的標題、註記、資料來源說明,讓讀者一眼看懂重點
- 用小倍數(small multiples)比較好幾組資料,並用顏色只強調重要的部分
畫得出來的圖,不一定是誠實的圖
上一課學會了怎麼畫圖、怎麼選圖。這一課看另一面:資料完全正確,圖還是可能讓人得到錯的印象。 大多數誤導的圖不是故意造假,而是用了軟體的預設值、想讓差異「明顯一點」,或者想把兩件事放在同一張圖裡。
讀者看圖時,用的是長度、面積、斜率、位置這些視覺線索。只要這些線索和數字不成比例,圖就會說出資料沒有說的事。
這一課的資料是 dorm_power.csv(五棟宿舍每天的用電)與 weather.csv,都是程式產生的模擬資料,不是任何學校的真實資料。
逐步看:同一份資料,y 軸從 500 與從 0 開始
左右兩張圖的資料完全相同,只差 y 軸從哪裡開始。看完圖再比較第 7 行印出的實際倍數。
謊言因子:圖上的差距 ÷ 資料的差距
Edward Tufte 在《The Visual Display of Quantitative Information》(1983)提出謊言因子(lie factor):
謊言因子 = 圖上顯示的變化幅度 ÷ 資料實際的變化幅度
變化幅度用「增加了幾成」計算。上面的例子:
| D 棟 | C 棟 | 變化幅度 | |
|---|---|---|---|
| 資料 | 517.2 | 1323.1 | 1323.1 ÷ 517.2 − 1 ≈ 1.56(多 156%) |
| 左圖的長條高度(扣掉 500) | 17.2 | 823.1 | 823.1 ÷ 17.2 − 1 ≈ 46.9(多 4690%) |
謊言因子約 46.9 ÷ 1.56 ≈ 30:圖上的差距被放大了大約 30 倍。接近 1 才是忠實的圖。
什麼時候 y 軸可以不從 0 開始? 長條圖用「長度」表示數量,一定要從 0 開始。折線圖看的是變化(例如體溫從 36.5 升到 38.5), 從 0 開始反而把重要的變化壓成一條平線,這時可以不從 0 開始,但軸的刻度要清楚標出來。
另外三種常見的誤導
| 陷阱 | 發生什麼事 | 修正 |
|---|---|---|
| 雙軸 | 兩個不同單位的變數各用一個 y 軸。兩個軸的範圍都由作者決定,所以線的斜率、高低、交叉點都可以隨意調整 | 分成上下兩張圖;或把兩者都換成「相對於起點的百分比」放在同一個軸 |
| 面積與立體 | 用圖示表示數量時,若邊長和數值成正比,面積就變成數值的平方;立體效果再加上體積與透視,更難讀 | 用長條圖;一定要用圖示時,讓面積和數值成正比;不用 3D 效果 |
| 不等距的軸 | 時間點的間隔不一樣(例如前幾筆每週一次、最後一筆隔三個月),卻畫得一樣寬,變化看起來突然變快或變慢 | x 軸依實際時間排列,或在圖上標明間隔不同 |
下面的小工具讓你親手調整這些設定,看「圖的印象」和「實際數字」怎麼分開。
讓圖說清楚:標題、註記、顏色、小倍數
不誤導只是基本,好的圖還要讓讀者一眼看到重點:
- 標題說出結論:「各棟每日用電」只說了畫什麼;「C 棟每日用電最多,約是 D 棟的 2.6 倍」直接告訴讀者要看什麼。結論要有資料支持,不要寫資料沒有證明的因果。
- 註記:用
ax.annotate加箭頭與文字、用ax.axvspan標出一段期間(例如考試週),讀者不必自己找。 - 註明資料來源與限制:例如「資料:程式產生的模擬資料」,用
fig.text寫在角落。 - 顏色只用來強調:大部分用灰色,要讀者注意的那一條用品牌色,不要每條線都用不同的鮮豔顏色。
- 小倍數(small multiples):要比較好幾組時,不要把五條線疊成一團,改成每組一張小圖、共用同一個 y 軸(
sharey=True),並排放在一起。
逐步看:五棟宿舍的小倍數圖
每一棟一張小圖,藍線是這一棟,灰線是其他四棟當背景。注意 sharey=True:五張圖的 y 軸相同,高低才能直接比。
逐步看:說出結論的標題與註記
這張圖用標題說出重點,用色塊和箭頭標出期中考週,並在角落註明資料來源。
實作:算出截斷軸的謊言因子
讀入 dorm_power.csv,依棟別(building)算出每日平均用電(kwh),四捨五入到小數 1 位。
假設長條圖的 y 軸從 500 開始,計算 C 棟與 D 棟的:
- 實際倍數:C ÷ D
- 看起來的倍數:(C − 500) ÷ (D − 500)
- 謊言因子:(看起來的倍數 − 1) ÷ (實際倍數 − 1)
三個數都四捨五入到小數 1 位,依下面的格式印出:
實際倍數: 2.6
看起來的倍數: …
謊言因子: …
小測驗:誤導的圖
下面程式會印出什麼?(A、B 兩組的數值,畫成 y 軸從 45 開始的長條圖)
a, b, base = 50, 60, 45
print(round((b - base) / (a - base), 1), round(b / a, 1))
一張資訊圖用正方形圖示表示人數,B 校人數是 A 校的 2 倍,設計者把 B 的正方形邊長畫成 A 的 2 倍。讀者看到的面積是幾倍?
雙軸圖上,左軸的氣溫線和右軸的用電線在 11 月交叉。這個交叉點代表什麼?
小測驗:把圖說清楚
下列哪一種情況,y 軸可以不從 0 開始?
用小倍數比較五棟宿舍的用電時,為什麼通常要設定 sharey=True?
下列哪一個標題最能幫讀者看到重點,又沒有超出資料能支持的範圍?
重點整理
- 截斷的 y 軸會誇大差異;長條圖的 y 軸一定從 0 開始。折線圖看變化時可以不從 0 開始,但刻度要清楚。
- 謊言因子=圖上顯示的變化幅度 ÷ 資料實際的變化幅度,接近 1 才忠實。
- 雙軸的線形、高低和交叉點都由作者選的範圍決定;改成上下兩張圖,或換成同一個尺度。
- 面積與立體:邊長和數值成正比時面積會變成平方;用長條圖,不用 3D 效果。
- 不等距的軸:時間間隔不同時,x 軸要依實際時間。
- 讓圖說清楚:標題說出有資料支持的結論、用
annotate/axvspan註記、寫上資料來源、顏色只用來強調、多組比較用共用 y 軸的小倍數。 - 下一課開始統計:用平均數、中位數、標準差、四分位數描述一組資料,並看極端值怎麼影響它們。