R语言ggplot2中是否支持为不同语言分别设置对应显示字体
实现混合字体渲染的两种可行方案
你可以通过以下两种常用方案实现同一张图表中英文、数字用Roboto,中文字符用Long Cang的需求:
方案1:基于showtext字体回退机制(零手动标注,全局自动适配)
showtext依赖的sysfonts包从0.8版本开始支持字体回退配置,你可以自定义一个混合字体家族,系统会自动识别字符类型匹配对应字体:
library(showtext) library(ggplot2) # 开启自动渲染 showtext_auto() # 加载所需Google字体 font_add_google('Roboto') font_add_google('Long Cang') # 定义混合字体:拉丁字符默认用Roboto,未匹配到的字符(中文)回退到Long Cang font_add( family = "mixed_font", regular = "Roboto", fallback = "Long Cang" ) # 绘图时直接指定base_family为自定义的混合字体即可 ggplot(mtcars, aes(mpg, wt)) + geom_point() + labs( title = 'This is the main title 中文标题', x = "英里/加仑 MPG", y = "重量 吨" ) + theme_classic(base_family = 'mixed_font')
该方案无需手动修改每个文本内容,所有图表文本(标题、坐标轴、图例、注释等)都会自动适配字体:数字、英文字符使用Roboto,中文字符使用Long Cang。
方案2:基于ggtext的Markdown渲染(灵活控制局部样式)
如果需要更精细的字体控制(比如不同位置的中英文搭配不同字号、颜色),可以使用ggtext包手动标注不同文本的样式:
library(showtext) library(ggplot2) library(ggtext) showtext_auto() font_add_google('Roboto') font_add_google('Long Cang') ggplot(mtcars, aes(mpg, wt)) + geom_point() + labs( title = '<span style="font-family: Roboto;">This is the main title</span> <span style="font-family: Long Cang;">中文标题</span>', x = '<span style="font-family: Roboto;">mpg</span> <span style="font-family: Long Cang;">(英里每加仑)</span>' ) + theme_classic() + theme( # 开启对应元素的markdown解析 plot.title = element_markdown(), axis.title.x = element_markdown() )
注意事项
- 首次运行代码需要保持网络连通,才能成功下载Google字体到本地缓存,后续运行无需重复下载
- 导出图片时建议使用ragg设备,添加参数
device = ragg::agg_png()即可保证字体渲染正确 - RStudio用户可在「全局选项-常规-图形」中将后端设备改为AGG,避免预览时字体显示异常
你之前测试的两种全局字体效果对比如下:
内容的提问来源于stack exchange,提问作者Miao Cai
相关产品推荐
相关产品推荐

