先畫再算:matplotlib 與 seaborn

先備知識 P5 — 選讀,不列入評分
Figure 與 Axes|Seaborn 圖族與層級|relplot/displot/catplot|分布與關係|迴歸與矩陣圖|選對圖再解讀
向下捲動開始互動↓
📌 本頁使用方式(先備 · 視覺化)

① 依序閱讀:每節先讀說明;遇到互動元件時,先預測結果,再操作驗證。 ② 對照程式範例:程式碼卡下方的「來源」標了課程練習筆記本(lab);需要實作時,再打開原始筆記本對照。 ③ 檢查理解:答錯時先看回饋,再回到相關說明;標為延伸的內容可留待第二輪。 ④ 最後翻關鍵詞彙卡自測術語,並用 重點速查與來源查閱。

教科書:An Introduction to Statistical Learning with Applications in Python(ISLP)。章節旁的來源標記可點到本頁書目。

CONTENTS · 內容目錄
PROLOGUE · 開場

摘要統計一樣,圖可以完全不一樣 課程 Lab Ch1 · lab 範例

統計課教你算平均、標準差、相關係數。這些數字很有用,但它們會漏掉形狀。 四組資料可以有幾乎一樣的平均、標準差、相關係數與迴歸線,畫出來卻完全不同。 Anscombe 在 1973 年提出的經典四重奏就展示了這種情況,下面可以逐筆驗算。

一句話 先畫圖,再算數字。圖告訴你「這份資料長什麼樣」,數字告訴你「有多強」——順序反過來很容易被騙。
圖表需要連網載入 Chart.js:Anscombe 四組資料的摘要統計幾乎相同,但散佈圖形狀完全不同。
›四組資料,摘要統計幾乎相同。先看數字,再按按鈕看形狀。
講義/課本重繪
按按鈕換一組
四組資料的平均、標準差、相關係數與迴歸線都幾乎一樣,但形狀完全不同。只看數字的話,你會以為它們是同一回事。
這一組的摘要統計
x 平均—
y 平均—
x/y 樣本標準差—
相關係數 r—
最小平方線—
這些點哪裡來的
逐筆採用 Anscombe's quartet 的經典 11 筆資料;頁面再由同一批點即時計算平均與相關係數,沒有另寫摘要數字。
如何對照繪圖程式與圖形 繪圖儲存格在 notebook 中保存圖形,所以下面的程式碼卡多半只有程式碼、沒有預期輸出。你可以用每節的互動元件觀察圖形如何改變。元件會在頁面中計算並畫出結果,圖下標有資料來源。
這一頁用的資料:tips
# 檢視資料基本資訊/摘要;載入範例資料集 tips = sns.load_dataset("tips") print(tips.shape) tips.head()
查看完整 Lab 輸出
預期輸出
(244, 7)
   total_bill   tip     sex smoker  day    time  size
0       16.99  1.01  Female     No  Sun  Dinner     2
1       10.34  1.66    Male     No  Sun  Dinner     3
2       21.01  3.50    Male     No  Sun  Dinner     3
3       23.68  3.31    Male     No  Sun  Dinner     2
4       24.59  3.61  Female     No  Sun  Dinner     4

244 筆餐廳帳單。total_bill 與 tip 是數值,day、sex、smoker 是類別——這兩種型別要配不同的圖。

來源:Ch01-lab-zh.ipynb
PART 00 · 自我檢測

兩份資料的相關係數都是 0.82。可以推論什麼?

(A) 兩份資料的散佈圖會很像
(B) 只知道兩者的線性關係強度接近,形狀可能完全不同
(C) 兩份資料的迴歸線斜率一樣
PART 01 · 圖形層級與 Seaborn 分類

Figure、Axes 與 Seaborn 的圖形分類 講義 01課程 Lab Ch2 · lab 範例seaborn 文件 · 圖形分類

使用 matplotlib 時,先分清設定屬於哪一層: Figure 是整張畫布(大小、存檔、標題), Axes 是裡面的一個座標系(畫點、設軸範圍、加圖例)。 一張 Figure 可以有很多個 Axes。

›先分清楚哪一層是哪一層,之後查文件會快很多。
概念示意
點名字看它管什麼
按按鈕,對應的部分會亮起來,右邊會顯示「這一層負責什麼」與「動它的方法叫什麼」。
目前
物件Figure
負責什麼整張畫布
常用方法set_size_inches、savefig
seaborn 函式管理哪一層
Axes-level 函式畫在一個 Axes,可用 ax= 指定位置。Figure-level 函式建立並管理自己的圖,通常回傳 Grid 管理物件,Grid 負責管理 Figure。請查函式文件確認層級,名稱結尾無法判定。
subplots 一次給你兩個東西
fig, ax = subplots(figsize=(8, 8)) x = rng.standard_normal(100) y = rng.standard_normal(100) ax.plot(x, y);

這一格畫的是圖。(產生的是圖,沒有文字輸出可對照。)

來源:Ch02-statlearn-lab-zh.ipynb
散佈圖與軸標籤
fig, ax = subplots(figsize=(8, 8)) ax.scatter(x, y, marker='o')

這一格畫的是圖。(產生的是圖,沒有文字輸出可對照。)

來源:Ch02-statlearn-lab-zh.ipynb
›點任一格,看它的索引。
課程/lab 資料
axes 是一個二維陣列
subplots(nrows=2, ncols=3) 回傳的 axes 是一個 (2, 3) 的 NumPy 陣列。點格子看它的索引——就是 P3 講的二維索引。
目前選到
索引axes[0, 0]
在第幾列第幾欄第 0 列、第 0 欄
常見錯誤
nrows=1 時 axes 會退化成一維,axes[0, 1] 就會報錯。要一致就寫 subplots(1, 3, squeeze=False)。
延伸:完整子圖網格
2×3 的子圖網格
fig, axes = subplots(nrows=2, ncols=3, figsize=(15, 5)) axes[0,1].plot(x, y, 'o') axes[1,2].scatter(x, y, marker='+') fig

這一格畫的是圖。(產生的是圖,沒有文字輸出可對照。)

來源:Ch02-statlearn-lab-zh.ipynb
完整函式地圖與選項練習

Seaborn 函式地圖:先選問題,再選控制層級

導論講義把常用函式分成關係、分布、類別三個家族; 這是在分「你想看什麼」。每個家族又有不同控制層級:上層的 Figure-level 入口替你管理整張圖, 下層的 Axes-level 函式畫到一個座標系。家族與層級是兩個不同的面向。

關係(Relational)
看兩個變數如何一起變動
Figure-level:relplot

Axes-level

kind="scatter" 或 kind="line" 選擇畫法。

分布(Distributional)
看數值集中在哪裡、如何散開
Figure-level:displot

Axes-level

kind 可選 "hist"、"kde"、"ecdf"。 小刻度用 rug=True 加上,不是 kind="rug"。

類別(Categorical)
比較不同組別的觀測或摘要
Figure-level:catplot

Axes-level

例如 kind="box" 選箱形圖。 本頁另補 countplot:各組筆數,可用 kind="count";它未列在講義這張分類圖中。

以 relplot、displot、catplot 為例, kind 決定每個子圖的畫法,row/col 則依變數分面, 把各組排成不同列/欄。三者回傳 FacetGrid;沒指定分面時,也可以只畫一個子圖。 Figure-level 不等於「一定有多個子圖」。

下面是語法示意,沿用本頁開頭載入的 tips;先執行 imports 與資料載入。 第一種交給 Seaborn 依吸菸與否分面,第二種把圖放到自己指定的 ax;不另列實跑輸出。

# Figure-level:kind 選散佈圖,col 將各組分開 g = sns.relplot(data=tips, x="total_bill", y="tip", kind="scatter", col="smoker") # Axes-level:指定要畫到哪個座標系 fig, ax = plt.subplots() sns.scatterplot(data=tips, x="total_bill", y="tip", ax=ax)

講義還列了下面三類。它們分別提供多視角組圖、迴歸與殘差圖,以及矩陣圖;可依用途與控制層級查找。

用途Axes-levelFigure-level/回傳的管理物件
多個視角:同時看關係與各欄分布由管理物件安排多個座標系jointplot → JointGrid;pairplot → PairGrid
迴歸與殘差:看趨勢及偏離趨勢的情形regplot、residplotlmplot → FacetGrid
矩陣:用顏色看各格數值,需要時依分群排列heatmapclustermap → ClusterGrid

jointplot 以一對變數為主,加上兩側的分布;pairplot 組合多對變數, 兩者各自管理多個 Axes。clustermap 則連同分群樹與熱圖一起管理。 若你已建立自己的 subplots,應選可接收 ax= 的 Axes-level 函式。

分類依據:導論講義與 Seaborn 官方函式總覽。 函式名稱都可點回官方 API 文件。

PART 01 · 函式家族自測

你想比較吸菸與不吸菸兩組的帳單金額分布,各組分開成一張直方圖。哪個寫法符合這個目標?

(A) sns.relplot(data=tips, x='total_bill', col='smoker', kind='hist')
(B) sns.displot(data=tips, x='total_bill', col='smoker', kind='hist')
(C) sns.histplot(data=tips, x='total_bill', col='smoker')
PART 01 · 分布家族自測

你已用 displot 畫好直方圖,想再以小刻度標出各筆觀測的位置。應如何指定?

(A) 保留 kind='hist',再加 rug=True
(B) 把 kind 改成 'rug'
(C) 加上 col=True
延伸:多種檔案格式、dpi 與修改後另存

把目前這張 Figure 保存下來

完成軸標籤與版面後,對 Figure 呼叫 savefig。 副檔名指定 PNG、PDF 或 JPEG;dpi 對點陣圖決定每英吋像素數。PDF 中的向量圖元仍可縮放,dpi 主要影響其中點陣化的內容。

同一張圖保存兩種格式
fig.savefig("Figure.png", dpi=400) fig.savefig("Figure.pdf", dpi=200);

沿用前面的 fig。命令將在目前工作目錄寫入檔案;同名檔案會被覆寫。

來源:Ch02-statlearn-lab-zh.ipynb
改軸範圍後再存一份
axes[0,1].set_xlim([-1,1]) fig.savefig("Figure_updated.jpg") fig

此格沿用 Ch02 建立的二維 axes 陣列;修改第二張子圖後另存,前一份檔案不會自動更新。

來源:Ch02-statlearn-lab-zh.ipynb
PART 01 · 自我檢測

你用 sns.relplot(...) 畫完圖,接著寫 ax.set_xlim([0, 10]),卻沒有任何效果。最可能的原因是?

(A) set_xlim 要寫在畫圖之前
(B) seaborn 不支援設定軸範圍
(C) relplot 自己開了一張新的 Figure,你的 ax 指的是別張圖
PART 02 · 看一個變數的分布

直方圖的 bins 與密度圖的頻寬會改變你的結論 課程 Lab Ch1 · lab 範例

看一個變數的分布有兩種標準做法:直方圖與密度圖。兩者都有一個你必須自己決定的參數—— 直方圖是 bins(切幾格),密度圖是頻寬(平滑多少)。調整這個參數, 同一份資料可能看起來有兩個峰或只有一個。

依分析問題調整圖形 調參數之前先想好你要回答什麼問題。想看「有沒有兩群」就把 bins 調細一點;想看「大致集中在哪」就調粗一點。也要比較其他設定下的結果,確認看到的形狀是否穩定。
›先猜這份資料有幾個峰,再把 bins 從 4 拉到 40。
模擬示意
拖 bins,看結論怎麼變
同一份資料(固定種子產生,實際上是兩個峰)。bins 太少會把兩個峰糊成一個,太多會讓雜訊看起來像結構。
目前
模式直方圖
bins / 頻寬10
你會看到幾個峰—
密度圖也一樣
切到「密度圖」模式,改的是頻寬。頻寬大=平滑=可能糊掉真的結構;頻寬小=每個點都戳出一根。兩者是同一個取捨換了個名字。
最基本的直方圖
# 載入範例資料集 sns.displot(x="total_bill", data = tips); #check parameter bins and binwidth

lab 的註解就提醒了 bins 這個參數。(產生的是圖,沒有文字輸出可對照。)

來源:Ch01-lab-zh.ipynb
更多畫法:分色與堆疊
依類別分色與堆疊
# 載入範例資料集;Seaborn 視覺化:直方圖 sns.histplot(data=tips, x="day", hue="sex"); # By default, the different histograms are “layered” on top of each other and, in some cases, they may be difficult to distinguish. # 載入範例資料集;Seaborn 視覺化:直方圖 sns.histplot(data=tips, x="day", hue="sex", multiple="dodge", shrink=.8);

hue 分色、multiple='stack' 疊起來。分色看得出各組的形狀,堆疊看得出總量——兩種問題。(產生的是圖,沒有文字輸出可對照。)

來源:Ch01-lab-zh.ipynb
密度圖
# 載入範例資料集;Seaborn 視覺化:KDE 密度圖 sns.kdeplot(data=tips, x="total_bill"); # 載入範例資料集;Seaborn 視覺化:KDE 密度圖 sns.kdeplot(data=tips, x="total_bill", hue="time", multiple="stack");

kdeplot 把每個點換成一個小鐘形再加起來,所以它一定是平滑的。平滑程度來自繪圖設定,讀圖時也要留意這項選擇。(產生的是圖,沒有文字輸出可對照。)

來源:Ch01-lab-zh.ipynb
PART 02 · 自我檢測

同一份資料,bins=5 看起來是一個峰,bins=30 看起來是兩個峰。你該怎麼辦?

(A) 選看起來比較漂亮的那一張放進報告
(B) 兩張都看,再回頭問「有沒有理由相信這兩群真的存在」
(C) 用預設的 bins,seaborn 的預設一定是對的
PART 03 · 看兩個變數的關係

散佈圖、折線圖、joint 與 pair 課程 Lab Ch1 · lab 範例

兩個變數的關係圖幾乎都是散佈圖的變形。seaborn 幫你做的事是 用顏色、大小、分面在同一張圖中呈現第三、第四個變數—— hue、size、col 這三個參數值得記起來。

›選 x 與 y 的型別。
課程/lab 資料
先問變數型別
選 x 與 y 各是什麼型別,右邊會給建議的圖與對應的 seaborn 函式。這張決策樹涵蓋 lab 裡出現過的每一種圖。
建議
圖型—
函式—
它在回答什麼—
第三個變數怎麼辦
hue= 用顏色、size= 用點的大小、col= 拆成好幾張小圖。超過兩個額外變數時,可分成好幾張圖,方便比較。
散佈圖,以及呈現第三個變數
# Scatterplot sns.relplot(x="total_bill", y="tip", data=tips); # Semicolon is intended to suppress text representation # 載入範例資料集 sns.relplot(x="total_bill", y="tip", hue="smoker", style="smoker", data=tips); # you can use a different marker style for each class

hue 與 style 同時用同一個變數,是為了在黑白列印時也分得出來。這個習慣值得學。(產生的是圖,沒有文字輸出可對照。)

來源:Ch01-lab-zh.ipynb
更多畫法:大小編碼、joint 與 pair
用點的大小表示第三個變數
# 載入範例資料集 sns.relplot(x="total_bill", y="tip", size="size", sizes=(15, 200), data=tips); #size rather than colors

sizes=(15, 200) 明確指定最小與最大的點徑。不指定的話預設範圍很窄,看不出差別。(產生的是圖,沒有文字輸出可對照。)

來源:Ch01-lab-zh.ipynb
joint 與 pair
# 載入範例資料集;Seaborn 視覺化:Joint 分布圖 sns.jointplot(x="total_bill", y="tip", data=tips); # 載入範例資料集;Seaborn 視覺化:變數成對關係圖 sns.pairplot(tips);

pairplot 適合一次查看多個變數的關係:所有數值欄兩兩配對,一眼看完。欄多的時候會很慢,先挑幾欄再畫。(產生的是圖,沒有文字輸出可對照。)

來源:Ch01-lab-zh.ipynb
折線圖與信賴區間
# 載入範例資料集;Seaborn 視覺化:折線圖 fmri = sns.load_dataset("fmri") sns.lineplot(x="timepoint", y="signal", hue="event", style="event", markers=True, dashes=False, data=fmri);

lineplot 對同一個 x 有多筆資料時,會自動畫平均與 95% 信賴區間。這個區間是 bootstrap 算出來的,第 5 章會講它怎麼來的。(產生的是圖,沒有文字輸出可對照。)

來源:Ch01-lab-zh.ipynb
PART 03 · 自我檢測

你想看「小費金額與帳單金額的關係,並區分吸菸與否」。最直接的寫法是?

(A) sns.catplot(x='smoker', y='tip', data=tips)
(B) sns.relplot(x='total_bill', y='tip', hue='smoker', data=tips)
(C) 畫兩張散佈圖,一張吸菸一張不吸菸
PART 04 · 類別變數的圖

盒鬚圖、長條圖、計數圖:各自在講什麼 課程 Lab Ch1 · lab 範例

類別變數的圖最容易被誤讀,因為它們看起來都像長條,但講的事情差很多: countplot 講「有幾筆」、barplot 講「平均是多少」、boxplot 講「分布長怎樣」。 選圖前先確認你要比較筆數、平均還是分布。

›先看左邊,再按「截斷 y 軸」。
概念示意
同一份資料,兩種畫法
左邊的 y 軸從 0 開始,右邊則截斷 y 軸。按按鈕切換;右側倍率會由同一批資料與目前的軸起點即時計算。
兩組的真實數字
A 組平均2.98
B 組平均3.26
看起來差幾倍—
什麼時候可以截斷
當零沒有意義時(例如體溫、年份)截斷是合理的,但要明確標出來。長條圖用長度編碼數量,截斷等於把長度的意義弄壞,所以特別不該截。
盒鬚圖:看分布
# 載入範例資料集 sns.catplot(x="day", y="total_bill", kind="box", data=tips); # 載入範例資料集 sns.catplot(x="day", y="total_bill", hue="smoker", kind="box", data=tips); # When adding a hue semantic, the box for each level of the semantic variable is moved along the categorical axis so they don’t overlap:b

盒子是四分位距、線是中位數、鬚是 1.5 倍 IQR 內的極值,外面的點是離群值。在本節比較的基本類別圖中,只有盒鬚圖直接標出這些候選離群值。(產生的是圖,沒有文字輸出可對照。)

來源:Ch01-lab-zh.ipynb
長條圖:看平均與不確定性
# 載入範例資料集;Seaborn 視覺化:長條圖 ax = sns.barplot(x="day", y="tip", data=tips); # 載入範例資料集 sns.catplot(x="day", y="total_bill", hue="sex", kind="bar", data=tips);

barplot 的長條高度是平均,上面那條細線是 bootstrap 信賴區間,不是標準差。(產生的是圖,沒有文字輸出可對照。)

來源:Ch01-lab-zh.ipynb
計數圖:看筆數
# 載入範例資料集;Seaborn 視覺化:計數長條圖 sns.countplot(x="smoker", data=tips); #simply count the number

countplot 只數筆數,跟 value_counts() 是同一件事的圖版。(產生的是圖,沒有文字輸出可對照。)

來源:Ch01-lab-zh.ipynb
另一種畫法:點估計與誤差線
點估計圖:專門用來比較
# 載入範例資料集;Seaborn 視覺化:點估計圖 sns.pointplot(x="day", y="tip", data=tips, errorbar=('ci', 68));

把長條換成一個點加誤差線。要比較好幾組的平均時,點比長條清楚——長條的面積會搶掉注意力。(產生的是圖,沒有文字輸出可對照。)

來源:Ch01-lab-zh.ipynb
圖高度/位置代表什麼適合回答
countplot筆數哪一類最多?有沒有哪一類樣本太少?
barplot平均(+信賴區間)各組的平均差多少?差得有多確定?
boxplot中位數與四分位距分布形狀?有沒有離群值?
pointplot平均(+誤差線)多組平均之間的比較與趨勢

比較兩組平均時,要看兩組差值的不確定性。各組自己的信賴區間即使重疊, 差值的區間仍可能不含 0;是否能下結論還取決於樣本數、抽樣方式與模型條件。 可回S4 的信賴區間確認區間在估哪一個量。

PART 04 · 自我檢測

一張 barplot 顯示週四的小費比週五高。你還需要知道什麼才能下結論?

(A) 不用,長條比較高就是比較高
(B) 只要看兩組的標準差
(C) 兩組樣本數、誤差線的定義,以及兩組平均差的區間
🔗 這在本站哪一章會用到 第 12 章的主成分分析要看雙標圖(biplot)、分群要看樹狀圖,都是這一節的延伸;第 3 章的殘差圖更是整章的診斷主力。→ 非監督式學習 · 雙標圖 → 非監督式學習 · 樹狀圖
PART 05 · 把模型畫進圖裡

regplot 與相關係數熱圖 課程 Lab Ch1 · lab 範例

最後一種圖:把擬合好的模型畫在資料上面。 把模型與觀測放在一起,可以檢查模型如何描述資料,以及哪些地方有差距。

›點格子看那一對變數的相關係數。
課程/lab 資料
熱圖在講什麼
點任一格,右邊顯示那一對變數的相關係數與它的意思。對角線一定是 1(自己跟自己)。
目前選到
變數對—
相關係數—
怎麼讀—
熱圖的陷阱
顏色會讓「0.3 與 0.5」看起來差很多、「0.85 與 0.9」看起來差不多,端看色階怎麼設。要下結論就回去看數字,熱圖是用來快速找候選的。
散佈圖加迴歸線
# 載入範例資料集;Seaborn 視覺化:迴歸散佈圖 sns.regplot(x="total_bill", y="tip", data=tips);

regplot 直接擬合一條最小平方直線並畫出 95% 信賴區間。這個區間是對迴歸線的不確定性,不是預測區間——第 3 章會分清楚這兩者。(產生的是圖,沒有文字輸出可對照。)

來源:Ch01-lab-zh.ipynb
依類別分別擬合
# 載入範例資料集;Seaborn 視覺化:迴歸關係圖 tips["big_tip"] = (tips.tip / tips.total_bill) > .15 sns.lmplot(x="total_bill", y="big_tip", data=tips, logistic=True, y_jitter=.03); # 載入範例資料集;Seaborn 視覺化:迴歸關係圖 sns.lmplot(x="total_bill", y="tip", hue="smoker", col="time", data=tips);

lmplot 加 hue 會每一組各擬合一條線。兩條線的斜率若不同,提示可以加入交互作用再檢查;樣本變異也可能造成斜率差,仍需估計不確定性。(產生的是圖,沒有文字輸出可對照。)

來源:Ch01-lab-zh.ipynb
相關係數熱圖
# 相關係數/相關矩陣;載入範例資料集 corr = tips.corr(numeric_only=True) sns.heatmap(corr);

tips.corr(numeric_only=True) 先算矩陣,heatmap 只負責上色。共線性的初步檢查常從這裡開始。(產生的是圖,沒有文字輸出可對照。)

來源:Ch01-lab-zh.ipynb
觀念釐清
regplot 幫我擬合了線,是不是就等於做了迴歸分析?
還需要後續分析。這個函式給你一條線與一條帶子,沒有係數、沒有 p 值、沒有診斷。要那些東西得用 statsmodels(P6 會講)。regplot 的用途是「先看看有沒有線性關係」。
熱圖看到兩個變數相關 0.9,該怎麼辦?
先想它們是不是本來就在量同一件事(例如 weight 與 displacement)。真的要放進同一個迴歸模型的話,第 3 章的共線性與第 6 章的收縮方法就是在處理這件事。
PART 05 · 自我檢測

lmplot 加了 hue='smoker' 之後,兩組的迴歸線斜率明顯不同。這在暗示什麼?

(A) 帳單對小費的效果在兩組之間不同,可能有交互作用
(B) 吸菸者的小費比較高
(C) 資料裡有離群值
跨章應用:函數網格、contour 與 imshow

函數曲面:等高線與色塊

若每一組 (x,y) 座標都有一個函數值,資料可排成網格。 contour(x, y, f) 的 f 必須有 len(y) 列、len(x) 欄,每個元素對應一個座標配對。

建立二維函數網格並畫等高線
fig, ax = subplots(figsize=(8, 8)) x = np.linspace(-np.pi, np.pi, 50) y = x f = np.multiply.outer(np.cos(y), 1 / (1 + x**2)) ax.contour(x, y, f);

np.multiply.outer 對所有 y 與 x 配對計算乘積,因此 f 的列對應 y、欄對應 x。

來源:Ch02-statlearn-lab-zh.ipynb
改等高線層數,與 imshow 比較
fig, ax = subplots(figsize=(8, 8)) ax.contour(x, y, f, levels=45); fig, ax = subplots(figsize=(8, 8)) ax.imshow(f);

這些儲存格只保存圖形,不另造文字輸出。

來源:Ch02-statlearn-lab-zh.ipynb

levels 控制等高線層級的選擇;更多線不會增加原始網格資料。 imshow(f) 用顏色畫出陣列元素,預設座標是欄/列索引,原點在上方;因此不能直接把其座標當成前面的 x、y。 若要對上物理座標,須交代 extent 與 origin 的設定。 統計學習章用同一函數說明「指定形狀」與「從資料估計」的差異。

EXERCISES · 練習

動手驗證:概念自測 先備 · 自我檢測

回顧本頁觀念與原 Lab 的程式,確認各個操作的意義與使用條件。

EXERCISE 1 · 選圖

你要呈現「三個地區(origin)的 mpg 分布,並讓讀者看得出有沒有離群值」。該畫什麼?

(A) barplot,三根長條比高低
(B) countplot
(C) boxplot(或加上 stripplot 疊點)
EXERCISE 2 · bins

把 bins 從 10 調到 60 之後,直方圖出現很多小峰。最合理的解讀是?

(A) 資料真的有很多群,應該用 60 這張
(B) 資料有問題,應該重新收集
(C) 多半是抽樣雜訊,除非那些峰對應到某個真實的分類
EXERCISE 3 · 圖表誠實度

一張長條圖把 y 軸截在兩組平均附近,讓小差異看起來大幅放大。這張圖錯在哪?

(A) 長條圖用長度表示數量,截斷 y 軸會破壞長度的意義
(B) 沒錯,只是放大了差異方便觀察
(C) 應該把 y 軸改成對數尺度
EXERCISE 4 · figure-level 與 axes-level

你想把四張 seaborn 圖排成 2×2 放進同一張 Figure。下列哪一個函式做不到?

(A) sns.relplot(..., ax=axes[1,0])
(B) sns.histplot(..., ax=axes[0,0])
(C) sns.boxplot(..., ax=axes[0,1])
重點速查與來源

視覺化速查表 先備 · 視覺化

來源:完整書目與章節定位

本頁書目與章節定位

  • 教科書:An Introduction to Statistical Learning with Applications in Python。James、Witten、Hastie、Tibshirani、Taylor,2023。原書與下載資訊

需要核對完整公式、比較表或實作時,再展開下方速查。

查閱完整速查與延伸提醒

選圖速查表。先問「x 與 y 各是什麼型別」,再問「我要回答什麼」。需要依家族與控制層級找函式,可回到 Seaborn 函式地圖。

x 的型別y 的型別圖seaborn
數值數值散佈圖scatterplot / relplot
數值數值(有序、每個 x 多筆)折線圖+信賴區間lineplot
數值數值(要看模型)散佈圖+迴歸線regplot / lmplot
數值—直方圖/密度圖histplot / kdeplot
類別數值盒鬚圖/長條圖/點估計圖catplot(kind=…)
類別—計數圖countplot
類別類別計數的交叉表+熱圖heatmap
多個數值欄—成對關係圖/相關熱圖pairplot / heatmap
figure-level(自己開 Figure)axes-level(可以傳 ax=)
relplotscatterplot、lineplot
catplotboxplot、barplot、countplot、pointplot
displothistplot、kdeplot、ecdfplot;刻度用 rugplot
lmplot(迴歸)regplot、residplot
clustermap(分群熱圖)heatmap
jointplot、pairplot(多軸組圖)組合多種單軸畫法;見上方函式地圖
參數做什麼什麼時候用
hue=用顏色分第三個變數組數 ≤ 5、要疊在同一張圖比較
style=用標記形狀分要黑白列印時搭配 hue 一起用
size=用點的大小分第三個變數是數值且範圍大
col= / row=拆成好幾張小圖組數多、疊起來會糊
三個閱讀重點 1. 先畫圖再算數字。摘要統計會漏掉形狀,相關係數一樣的兩份資料可以長得完全不同。
2. bins 與頻寬會影響圖形呈現的細緻程度。調參數之前先想好要回答什麼問題。
3. countplot 講筆數、barplot 講平均、boxplot 講分布。三種長條講三件事,不要混用。
CARDS · 關鍵詞彙卡

關鍵詞彙卡:點卡片翻面 課程詞彙

詞彙卡整理本頁引用的課程 lab中常用的統計或機器學習專有名詞,正面附英文名稱。 先看正面的術語,試著說出定義,再翻面核對。可以洗牌複習,也可以搭配本章例子練習解釋。

複習:展開關鍵詞彙卡