You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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铃铛图标:
ggplot显示FontAwesome铃铛图标

但使用Unicode值\uf1fd时,仅显示空框:

ggplot() +
 geom_label(aes(x = 1, y = 1,  label = "\uf1fd"), 
 family = "Font Awesome 5 Free Solid", size = 16) +
 theme_minimal()

ggplot显示空框而非目标FontAwesome图标

我是从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()

结果仍有部分图标无法渲染:
批量绘制的FontAwesome图标,部分显示空框

会话信息

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

问题原因及解决建议

核心原因

  1. FontAwesome版本与Unicode的兼容性问题

    • FontAwesome v4和v5的Unicode映射完全不兼容,同一图标在两个版本中的Unicode值不同;且v5的免费版和Pro版有字形差异,你使用的\uf1fd可能属于Pro版专属图标,免费实心版中没有该字形,自然显示空框。
    • 即便是v4的Unicode值,部分图标可能在v5免费版中已被移除或替换,导致无法渲染。
  2. Windows下extrafont的字体加载缺陷

    • extrafont依赖Rttf2pt1转换字体,Windows环境下该工具可能无法完整识别FontAwesome字体中的所有字形,导致部分图标无法被导入到R的字体数据库中。
    • 字体名称匹配问题:你使用的FamilyName("Font Awesome 5 Free Solid")不如FontName("FontAwesome5Free-Solid")精准,可能导致R无法正确调用对应字体的字形。
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 02:25:43