在ggplot中使用FontAwesome免费字体时Unicode显示异常的排查
FontAwesome图标在ggplot中部分无法渲染的问题
我在Windows 10系统下尝试用extrafont包结合ggplot2绘制FontAwesome图标:
library(extrafont) library(ggplot2) loadfonts() # 查看系统中的FontAwesome字体 ft <- fonttable() ft[grepl("Awesome", ft$FontName), c("FullName", "FamilyName", "FontName")] # FullName FamilyName FontName # 367 Font Awesome 5 Brands Regular Font Awesome 5 Brands Regular FontAwesome5Brands-Regular # 368 Font Awesome 5 Free Solid Font Awesome 5 Free Solid FontAwesome5Free-Solid # 绘制铃铛图标(\uf0f3),显示正常 ggplot() + geom_label(aes(x = 1, y = 1, label = "\uf0f3"), family = "Font Awesome 5 Free Solid", size = 16) + theme_minimal()
这段代码能正常显示FontAwesome铃铛图标:
但使用Unicode值\uf1fd时,仅显示空框:
ggplot() + geom_label(aes(x = 1, y = 1, label = "\uf1fd"), family = "Font Awesome 5 Free Solid", size = 16) + theme_minimal()

我是从FontAwesome v5免费实心图标 cheat sheet获取的Unicode十六进制值。
更新
经提示尝试使用v4的Unicode值,运行以下代码:
library(rvest) library(stringr) library(purrr) library(tibble) library(dplyr) library(ggplot2) library(extrafont) # 爬取v4 cheat sheet的Unicode值 doc <- "https://fontawesome.com/v4/cheatsheet/" %>% read_html() unicodes <- doc %>% html_elements(".row .fa+span") %>% html_text2() fa <- unicodes %>% str_subset(fixed("(alias)"), TRUE) %>% str_extract("[0-9a-f]+") %>% paste0("0x", .) %>% map_chr(intToUtf8) %>% tibble(label = .) %>% mutate(x = (seq_along(label) - 1) %/% ceiling(sqrt(length(label)))) %>% group_by(x) %>% mutate(y = seq_along(label) - 1) # 批量绘制图标 ggplot(fa) + geom_text(aes(x, y, label = label), family = "Font Awesome 5 Free Solid", size = 3) + geom_text(aes(x, y, label = label), family = "Font Awesome 5 Brands Regular", size = 3, color = "red") + theme_void()
结果仍有部分图标无法渲染:
会话信息
R version 4.2.2 (2022-10-31 ucrt) Platform: x86_64-w64-mingw32/x64 (64-bit) Running under: Windows 10 x64 (build 18363) Matrix products: default locale: [1] LC_COLLATE=German_Germany.utf8 LC_CTYPE=German_Germany.utf8 [3] LC_MONETARY=German_Germany.utf8 LC_NUMERIC=C [5] LC_TIME=German_Germany.utf8 attached base packages: [1] stats graphics grDevices utils datasets methods base other attached packages: [1] ggplot2_3.4.0 extrafont_0.18 loaded via a namespace (and not attached): [1] Rcpp_1.0.9 bslib_0.4.2 compiler_4.2.2 pillar_1.8.1 [5] later_1.3.0 jquerylib_0.1.4 tools_4.2.2 digest_0.6.31 [9] jsonlite_1.8.4 lifecycle_1.0.3 tibble_3.1.8 gtable_0.3.1 [13] pkgconfig_2.0.3 rlang_1.0.6 DBI_1.1.3 shiny_1.7.3 [17] cli_3.5.0 fastmap_1.1.0 Rttf2pt1_1.3.8 withr_2.5.0 [21] dplyr_1.0.10 generics_0.1.3 sass_0.4.4 vctrs_0.5.1 [25] tidyselect_1.2.0 grid_4.2.2 glue_1.6.2 R6_2.5.1 [29] fansi_1.0.3 extrafontdb_1.0 magrittr_2.0.3 scales_1.2.1 [33] promises_1.2.0.1 ellipsis_0.3.2 htmltools_0.5.4 assertthat_0.2.1 [37] mime_0.12 xtable_1.8-4 colorspace_2.0-3 httpuv_1.6.6 [41] utf8_1.2.2 munsell_0.5.0 cachem_1.0.6
问题原因及解决建议
核心原因
FontAwesome版本与Unicode的兼容性问题
- FontAwesome v4和v5的Unicode映射完全不兼容,同一图标在两个版本中的Unicode值不同;且v5的免费版和Pro版有字形差异,你使用的
\uf1fd可能属于Pro版专属图标,免费实心版中没有该字形,自然显示空框。 - 即便是v4的Unicode值,部分图标可能在v5免费版中已被移除或替换,导致无法渲染。
- FontAwesome v4和v5的Unicode映射完全不兼容,同一图标在两个版本中的Unicode值不同;且v5的免费版和Pro版有字形差异,你使用的
Windows下extrafont的字体加载缺陷
extrafont依赖Rttf2pt1转换字体,Windows环境下该工具可能无法完整识别FontAwesome字体中的所有字形,导致部分图标无法被导入到R的字体数据库中。- 字体名称匹配问题:你使用的
FamilyName("Font Awesome 5 Free Solid")不如FontName("FontAwesome5Free-Solid")精准,可能导致R无法正确调用对应字体的字形。
geom_label的渲染逻辑影响
geom_label自带背景框,其渲染机制可能干扰字形的正常绘制,换成geom_text有时能解决问题。
解决办法
- 确认图标归属:先去FontAwesome官方文档核实目标图标是否属于你安装的v5免费实心版,避免使用Pro版专属图标。
- 重新导入字体:执行
extrafont::font_import()重新导入系统字体(过程较长),之后用loadfonts(device="win")指定Windows设备加载字体。 - 使用准确的字体名称:把代码中的
family参数换成fonttable中显示的FontName,比如"FontAwesome5Free-Solid"而非"Font Awesome 5 Free Solid"。 - 替换为geom_text:将
geom_label改成geom_text,避免背景框的渲染干扰。 - 换用showtext包:
showtext对Windows字体的支持更友好,无需依赖Rttf2pt1,可以尝试用它替代extrafont加载字体。
内容的提问来源于stack exchange,提问作者thothal
相关产品推荐
相关产品推荐

