macOS系统下ggplot字体无法识别、出现异常间距问题求助
macOS ggplot字体不识别与排版异常问题解决方案
问题核心原因
你遇到的字体不识别、排版异常间距问题,本质是混用了sysfonts、extrafont、showtext三套完全独立的R字体管理体系,不同体系的字体数据库互不通用,导致图形设备无法找到对应字体,自动 fallback 到默认sans字体后,因字体参数不匹配出现间距错乱。
针对你提出的4个问题的解答
1. 指定字体的操作步骤是否正确?
不正确,核心错误点如下:
- 混用不同字体体系的操作:
sysfonts::font_add_google()添加的字体仅能被sysfonts/showtext体系识别,你未启用showtext时,原生图形设备和extrafont完全读取不到这部分字体 - 未完成extrafont的字体导入:你注释了
extrafont::font_import(),导致extrafont的本地数据库没有你系统中安装的字体信息,哪怕系统里装了对应字体也会报错找不到 - 未适配hrbrthemes的字重逻辑:
theme_ft_rc()默认会调用light字重,会自动在你传入的base_family后拼接Light后缀查询,这就是你没找到显式引用Roboto Condensed Light的代码但依然报错的原因
2. Mac输出PNG等非PDF/Windows格式时extrafont::loadfonts()的作用是什么?
extrafont::loadfonts()的作用是将extrafont本地数据库中的字体信息注册到当前使用的图形设备的字体映射表中,让R的图形输出层可以把你代码里写的字体名和系统中实际的字体文件对应上。如果没有提前运行extrafont::font_import()扫描系统字体到extrafont数据库,loadfonts()无法注册任何新增字体。
3. 报错找不到字体时查询的是哪个字体数据库?
你未启用showtext时,报错来自R原生图形设备,此时查询的是extrafont维护的本地字体映射数据库,存放在你R包安装路径下的extrafontdb目录中。如果启用了showtext,报错则来自showtext体系,查询的是sysfonts维护的独立数据库。
4. showtext是否使用独立的字体数据库?
是的,showtext完全依赖sysfonts维护的独立字体库,和extrafont、R原生图形设备的字体映射完全不互通。你通过sysfonts::font_add()、sysfonts::font_add_google()添加的字体只有启用showtext时才会生效,启用showtext后所有extrafont的字体注册都会失效。
修复方案
你可以选择以下任意一套方案,不要混用不同体系的操作:
方案一:仅使用extrafont体系(适配hrbrthemes原生逻辑)
# 首次运行需要扫描系统字体,耗时较长,仅需运行一次,可指定pattern只扫描需要的字体加快速度 extrafont::font_import(pattern = "Roboto|Times|Open Sans") extrafont::loadfonts(device = "png") # 注册字体到png设备 # 主题调用时显式指定字重避免自动拼接Light后缀 theme_ft_rc(base_family = "Roboto Condensed", base_size = 12, base_weight = "normal")
方案二:仅使用showtext体系(适合所有字体包括Google字体)
# 仅用sysfonts添加字体,不需要操作extrafont sysfonts::font_add_google("Roboto Condensed") sysfonts::font_add_google("Open Sans") # 本地字体用font_add指定路径即可:sysfonts::font_add("Times", regular = "/Library/Fonts/Times New Roman.ttf") # 启用showtext showtext::showtext_opts(dpi = 300) showtext::showtext_auto(enable = TRUE) # 后续绘图代码无需修改,直接运行即可正常识别字体
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

