在資料分析與視覺化中,我們經常需要在散點圖上疊加迴歸線,並直接顯示其統計資訊,例如迴歸方程式和 R2 值。這不僅能讓圖表更具資訊量,也方便讀者快速理解變數間的關係。雖然 ggplot2
本身功能強大,但要自動在圖上顯示這些迴歸細節卻不是那麼直觀。
這時候,ggpmisc
套件就派上用場了!它為 ggplot2
擴展了許多實用的功能,其中最受歡迎的莫過於 stat_poly_eq()
函數,它能讓你輕鬆地將迴歸方程式、R2值、p 值等直接呈現在你的圖表上。
為什麼選擇 stat_poly_eq()
?
- 自動化: 不再需要手動計算和輸入迴歸方程式或統計值。
- 整合性: 作為
ggplot2
的圖層,完美融入你的視覺化流程。 - 專業呈現: 支援 LaTeX 語法解析,讓數學方程式和統計符號顯示得既美觀又專業。
- 客製化: 提供豐富的參數選項,讓你精確控制顯示的內容和位置。
stat_poly_eq()
的基本用法
要使用 stat_poly_eq()
,你需要確保已經安裝並載入了 ggplot2
和 ggpmisc
這兩個套件。
# 如果尚未安裝,請先執行以下兩行
install.packages("ggplot2")
install.packages("ggpmisc")
# 載入所需的套件
library(ggplot2)
library(ggpmisc)
# 使用 R 內建的 mtcars 資料集作為範例
# 我們將繪製車重 (wt) 與每加侖行駛里程 (mpg) 的關係
ggplot(mtcars, aes(x = wt, y = mpg)) +
geom_point() + # 繪製散點圖
geom_smooth(method = "lm", se = FALSE, color = "blue") + # 添加線性迴歸線 (不顯示信賴區間)
stat_poly_eq(
aes(label = paste(stat(eq.label), stat(rr.label), sep = "*\", \"*")), # 定義要顯示的標籤內容
parse = TRUE # 啟用數學表達式解析,讓方程式和符號正確顯示
) +
labs(
title = "車重對油耗的線性迴歸分析",
x = "車重 (千磅)",
y = "每加侖英里數 (MPG)"
) +
theme_classic() # 使用簡潔的主題

程式碼解析
ggplot(mtcars, aes(x = wt, y = mpg))
: 初始化ggplot
物件,設定資料集和 X、Y 軸的變數。geom_point()
: 添加散點圖層,顯示原始資料點。geom_smooth(method = "lm", se = FALSE, color = "blue")
: 添加平滑曲線圖層。method = "lm"
表示我們要擬合一個線性模型(Linear Model)。se = FALSE
則是不顯示迴歸線的信賴區間,color = "blue"
設定線條顏色。stat_poly_eq()
: 這是ggpmisc
的核心函數。aes(label = paste(stat(eq.label), stat(rr.label), sep = "*\", \"*"))
: 這個是魔法發生的地方!
stat()
是一個特殊的函數,用於從統計變數中獲取標籤。eq.label
代表迴歸方程式的標籤(例如:y=ax+by=ax+b)。rr.label
代表 R² 值的標籤。paste(..., sep = "*\", \"*")
是將多個標籤連接起來的函數。sep = "*\", \"*"
是一個小技巧,當parse = TRUE
時,它會被解析為一個逗號和一個空格,讓多個標籤之間有適當的分隔。parse = TRUE
: 非常重要! 這個參數告訴ggplot2
將label
內容解析為數學表達式。這樣R 平方值的上標、等式中的符號等才能正確顯示,而不是純文字
客製化你的統計標籤
stat_poly_eq()
提供了豐富的參數,讓你精確控制顯示的內容和格式:
1. 選擇顯示的統計資訊
你可以在 aes(label = ...)
中使用 stat()
函數搭配不同的統計變數:
stat(eq.label)
: 迴歸方程式。stat(rr.label)
: R2 值。stat(adj.rr.label)
: 調整後的 R2 值。stat(p.value.label)
: P 值。stat(n.label)
: 觀察值數量。stat(AIC.label)
,stat(BIC.label)
: 模型的 AIC 和 BIC 值。stat(F.value.label)
,stat(df.label)
: F 統計量和自由度。stat(s.label)
: 殘差標準誤。stat(cor.coef.label)
: 相關係數 (R)。
範例:同時顯示方程式、R² 和 P 值
ggplot(mtcars, aes(x = wt, y = mpg)) +
geom_point() +
geom_smooth(method = "lm", se = FALSE, color = "blue") +
stat_poly_eq(
aes(label = paste(stat(eq.label),
stat(rr.label),
stat(p.value.label),
sep = "*\", \"*")), # 用逗號分隔多個標籤
parse = TRUE
) +
labs(title = expression(paste("迴歸方程式 ", R^2 ," 和 p-value")) ) +
theme_classic()

2.控制數字的小數位數
你可以使用 rr.digits
、p.value.digits
、coef.digits
等參數來設定顯示的小數位數。
ggplot(mtcars, aes(x = wt, y = mpg)) +
geom_point() +
geom_smooth(method = "lm", se = FALSE, color = "darkgreen") +
stat_poly_eq(
aes(label = paste(stat(eq.label), stat(rr.label), sep = "*\", \"*")),
rr.digits = 4, # R^2 顯示 4 位小數
coef.digits = 3, # 係數顯示 3 位小數
parse = TRUE
) +
labs(title = "調整小數位數") +
theme_classic()

3. 調整標籤的位置
標籤的預設位置通常在圖表的左上角。可以使用 label.x
和 label.y
。
label.x
: 接受"left"
,"right"
或 數值(1,-1)label.y
: 接受"top"
,"bottom"
, 或 數值(1,-1)
ggplot(mtcars, aes(x = wt, y = mpg)) +
geom_point() +
geom_smooth(method = "lm", se = FALSE, color = "purple") +
stat_poly_eq(
aes(label = paste(stat(eq.label), stat(rr.label), sep = "*\", \"*")),
label.x = "right",
label.y = "top",
parse = TRUE
) +
labs(title = "手動調整標籤位置") +
theme_classic()

4. 改變標籤的外觀
你可以像其他 geom_text
或 geom_label
一樣,設定標籤的顏色、大小、字體等。你也可以將 geom
參數從預設的 "text"
改為 "label"
,讓標籤帶有背景框。
ggplot(mtcars, aes(x = wt, y = mpg)) +
geom_point() +
geom_smooth(method = "lm", se = FALSE, color = "orange") +
stat_poly_eq(
aes(label = paste(stat(eq.label), stat(rr.label), sep = "*\", \"*")),
label.x = "right",
label.y = "top",
geom = "label_npc", # 標籤帶有背景框
color = "darkblue", # 標籤文字顏色
size = 4, # 標籤文字大小
fill = "lightyellow", # 標籤背景顏色
parse = TRUE
) +
labs(title = "客製化標籤外觀") +
theme_classic()

ggpmisc
套件的 stat_poly_eq()
函數是 ggplot2
用戶的必備工具。它大大簡化了在圖表上直接顯示線性迴歸模型統計資訊的過程,讓你的資料視覺化作品既專業又具資訊量。透過靈活運用其參數,可以輕鬆打造出符合各種需求的迴歸分析圖表。
5.與分面 (Faceting) 結合使用
stat_poly_eq()
的一個強大之處在於,當你使用 facet_wrap()
或 facet_grid()
對圖表進行分面時,它會為每個子圖獨立計算並顯示迴歸統計資訊,這對於比較不同組別的關係非常方便。
# 範例:按汽缸數 (cyl) 分組,繪製不同車型汽缸數的迴歸分析
ggplot(mtcars, aes(x = wt, y = mpg)) +
geom_point() +
geom_smooth(method = "lm", se = FALSE, color = "brown") +
stat_poly_eq(
aes(label = paste(stat(eq.label), stat(rr.label), sep = "*\", \"*")),
parse = TRUE
) +
facet_wrap(~ cyl, scales = "free_y") + # 按 cyl 分組,允許 Y 軸自由縮放
labs(title = "不同汽缸數的迴歸分析",
x = "車重 (千磅)",
y = "每加侖英里數 (MPG)") +
theme_classic()

總結
ggpmisc
套件的 stat_poly_eq()
函數是 ggplot2
用戶的必備工具。它大大簡化了在圖表上直接顯示線性迴歸模型統計資訊的過程,讓你的資料視覺化作品既專業又具資訊量。透過靈活運用其參數,可以輕鬆打造出符合各種需求的迴歸分析圖表。