介紹如何在 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 圖示字型檔,可從其 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 字型,可以使用 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)