介紹如何在 R 中使用 showtext 套件載入並使用自訂的字型顯示文字或圖示。
在許多情況下,在 R 中使用非標準的字型進行繪圖並不容易,在作業系統上雖然安裝了許多字型,但是在 R 中並沒有辦法直接使用,例如在圖形中顯示中文字就是一個常見的問題。
R 的 showtext 是一個可以讓使用者在 R 中自由匯入並使用各種字型的套件,相較於既有的 extrafont 套件,showtext 支援更多種的字型檔案(包含 TrueType、OpenType、Type 1 與 web fonts 等)與 R 的圖形設備,並且不需要依賴外部的程式(例如 Ghostscript)。
安裝 showtext 套件
R 的 showtext 套件可以透過官方的 CRAN 套件庫來安裝:
# 安裝 showtext 套件
install.packages("showtext")
使用 showtext 套件
showtext 可以用來載入各種的字型,用於各種圖形設備上,以下是載入並使用字型檔案的範例。
先準備好自己的字型檔案,然後使用 font_add() 函數加入字型,再呼叫 showtext_auto() 函數讓 showtext 自動處理文字的顯示,隨後即可在各種繪圖環境中使用剛加入的字型了。
showtext 支援的檔案類型有 TrueType、OpenType、Type 1 與 web fonts 等,這裡我們使用 jf open 粉圓字型與台北黑體字型作為示範。
# 載入 showtext 套件
library(showtext)
# 加入 jf open 粉圓字型
font_add("openhuninn", "jf-openhuninn-1.1.ttf")
# 加入台北黑體字型(標準字體、粗體)
font_add("TaipeiSansTCBeta",
regular = "TaipeiSansTCBeta-Regular.ttf",
bold = "TaipeiSansTCBeta-Bold.ttf")
# 自動使用 showtext 顯示文字
showtext_auto()
# 測試文字用的繪圖
plot(1, type="n", xlim = c(0, 6), ylim = c(0, 2))
# 使用 jf open 粉圓字型
text(3, 0.5, "jf open 粉圓字型", family = "openhuninn",
col = "steelblue", cex = 3)
# 使用台北黑體字型(標準字體)
text(3, 1, "台北黑體字型(標準字體)", family = "TaipeiSansTCBeta",
col = "steelblue", cex = 3)
# 使用台北黑體字型(粗體)
text(3, 1.5, "台北黑體字型(粗體)", family = "TaipeiSansTCBeta",
font = 2, # 2 代表 bold 字體
col = "steelblue", cex = 3)
# 停止使用 showtext 顯示文字
showtext_auto(FALSE)

ggplot2 繪圖字型
在 ggplot 的圖形中也可以直接使用 showtext 來顯示文字。
library(showtext)
font_add("openhuninn", "jf-openhuninn-1.1.ttf")
font_add("TaipeiSansTCBeta",
regular = "TaipeiSansTCBeta-Regular.ttf",
bold = "TaipeiSansTCBeta-Bold.ttf")
showtext_auto()
# 使用 ggplot 繪圖
library(ggplot2)
ggplot(NULL, aes(x = 1, y = 1)) +
xlim(0, 4) + ylim(0, 2) +
theme(axis.title = element_blank(), axis.ticks = element_blank(),
axis.text = element_blank()) +
annotate("text", 2, 0.5, label = "jf open 粉圓字型",
family = "openhuninn", size = 24) +
annotate("text", 2, 1, label = '台北黑體字型(標準字體)',
family = "TaipeiSansTCBeta", size = 24) +
annotate("text", 2, 1.5, label = '台北黑體字型(粗體)',
family = "TaipeiSansTCBeta", fontface = "bold", size = 24)
showtext_auto(FALSE)

文泉驛字型
showtext 套件本身就有內建免費的文泉驛字型(wqy-microhei),如果只是單純想要顯示中文字,用這個字型就非常方便。
library(showtext)
# showtext 內建文泉驛字型(wqy-microhei)
showtext_auto()
library(ggplot2)
ggplot(NULL, aes(x = 1, y = 1)) +
xlim(0, 4) + ylim(0, 2) +
theme(axis.title = element_blank(), axis.ticks = element_blank(),
axis.text = element_blank()) +
annotate("text", 2, 1, label = "文泉驛字型",
family = "wqy-microhei", size = 24)
showtext_auto(FALSE)

當載入 showtext 套件並執行 showtext_auto() 之後,如果沒有特別指定字型,中文字會自動使用文泉驛字型來顯示,所以只要啟用了 showtext 自動處理字型之後,中文字都可以正常顯示。
思源黑體、思源宋體字型
showtext 套件提供了自動安裝思源黑體、思源宋體字型的函數,可以省去手動下載的動作()。
library(showtext)
# 安裝思源黑體字型
font_install(source_han_sans(lang = "TW"))
# 安裝思源宋體字型
font_install(source_han_serif(lang = "TW"))
安裝好之後,可以呼叫 font_families() 函數顯示目前可用的字型:
# 顯示目前可用的字型
font_families()
[1] "sans" "serif" "mono" [4] "wqy-microhei" "source-han-sans-tw" "source-han-serif-tw"
接著就可以使用思源黑體或思源宋體字型來顯示文字了。
showtext_auto()
# 使用 ggplot 繪圖
library(ggplot2)
ggplot(NULL, aes(x = 1, y = 1)) +
xlim(0, 4) + ylim(0, 2) +
theme(axis.title = element_blank(), axis.ticks = element_blank(),
axis.text = element_blank()) +
annotate("text", 2, 0.5, label = "思源黑體字型",
family = "source-han-sans-tw", size = 24) +
annotate("text", 2, 1.5, label = "思源宋體字型",
family = "source-han-serif-tw", size = 24)
showtext_auto(FALSE)

Font Awesome 5 字型
若需要使用 Font Awesome 5 圖示字型檔,可從其 GitHub 網站下載 fa-brands-400.ttf、fa-solid-900.ttf、fa-regular-400.ttf 三個 TTF 字型檔案,並以 showtext 載入使用。
library(showtext)
# 新增 Font Awesome 5 字型
font_add(family = "FontAwesome5Free-Solid", regular = "fa-solid-900.ttf")
font_add(family = "FontAwesome5Free-Regular", regular = "fa-regular-400.ttf")
font_add(family = "FontAwesome5Brands-Regular", regular = "fa-brands-400.ttf")
接下來就可以在一般的繪圖指令中使用 Font Awesome 5 字型了:
showtext_auto()
# 使用 ggplot 繪圖
library(ggplot2)
ggplot(mtcars, aes(mpg, wt, colour = factor(cyl))) +
geom_text(label = "\Uf1b9",
family = "FontAwesome5Free-Solid",
size = 5) +
scale_color_brewer(palette="Dark2")
showtext_auto(FALSE)

waffle 套件也可以靠 showtext 來加入 Font Awesome 5 圖示使用。
Google 字型
若需要使用 Google 字型,可以使用 font_add_google() 函數自動下載並載入 Google 字型:
library(showtext)
## 下載並加入 Google 字型
font_add_google("Gochi Hand", "gochi")
font_add_google("Schoolbell", "bell")
showtext_auto()
# 使用 Google 字型繪圖
set.seed(123)
hist(rnorm(1000), breaks = 30, col = "steelblue", border = "white",
main = "", xlab = "", ylab = "")
title("Histogram of Normal Random Numbers", family = "bell", cex.main = 2)
title(ylab = "Frequency", family = "gochi", cex.lab = 2)
text(2, 70, "N = 1000", family = "bell", cex = 2.5)

