ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

R语言绘图中文乱码终极解决方案:从原理到showtext实战

R语言绘图中文乱码终极解决方案:从原理到showtext实战 咱们做数据分析的十个里起码有八个被R语言画图中文字体折磨过。刚开始跑模型的时候出图带中文标题满屏的小方块、问号甚至直接变成乱码那种感觉就像刚学会开车就撞了护栏。这篇文章就把这个问题彻底聊透从为什么乱码、各个操作系统怎么处理、到用showtext和Cairo这类通用方案把能踩的坑全给你填平每一步都有可复现的代码确保你复制粘贴就能出图。这个问题说大不大说小不小。没解决的时候图表只能全部用英文碰到论文、报告、老板要的中文可视化直接抓瞎。尤其是做R语言数据分析案例、出学术图表、写数据报告的人绕不开中文标注。我在Windows、macOS、Linux三种环境下都遇到过也踩过不少坑今天把经验全整理出来。1. 问题现象与根因方块字是怎么来的1.1 典型乱码表现你看到的到底是哪种坏很多人一上来就喊“中文不显示”但实际呈现方式有四种原因和处理方法完全不同。我建议你先停下来确认自己属于哪一类。第一种是方块字学术界叫“豆腐块”图上所有中文位置都是一块一块的实心或空心小方框。这种情况最常见本质是图形设备找不到匹配的中文字体只能用缺省字体里的“未定义字形”占位。第二种是问号一串“????”或者“□□□□”通常出现在数据点标签或图例里往往和字体编码或者导入数据时locale设置有关。第三种是空白标题位置完全空着但坐标轴、图例英文都正常这多半是字体加载被静默忽略了或者字体文件本身损坏。第四种是错位乱码比如该显示“销售”的地方变成了乱码字符偶尔还伴随警告“font family not found in font table”。区分这几种情况很重要因为网上教程大部分是针对第一种方块字的。你要是把前三种错当成第一种去折腾半天时间就白白浪费了。1.2 根因分析R图形设备与字体匹配机制这个问题的根源一句话总结就是R的图形设备默认字体是拉丁字体不包含中文字形。具体拆开讲你的绘图流程其实包含三层R语言代码、图形设备Graphic Device、操作系统字体库。R代码告诉设备“我要在这幅图里画一个标题”设备负责把文字逐字渲染成像素或矢量路径。渲染的时候设备必须从操作系统字体库中挑一个“合适的”字体然后查这个字体的字形表把字符编码转成实际的图形轮廓。问题出在“合适的”这三个字上。R的默认字体族是sans宏观上对应的是Helvetica或者Arial这类字体。Helvetica和Arial根本没有中文字形遇到汉字就直接“查无此码”输出豆腐块。这就像你用英文键盘打拼音按下“z”出来的不是“中”字而是一个完全不相关的符号。为什么不自动切换到系统中文字体呢因为R不会智能分析文本内容再换字体它只会老老实实按照设置走。你设置sans它就认准了拉丁字体不会去中文字体里找字形。这个设计在英文世界没有任何问题但在中文环境里就变成灾难。1.3 三大操作系统设备差异对比不同系统的图形设备处理字体方式天差地别这也是同一个代码换个电脑结果不同的原因。Windows上R默认使用windows()设备它绑定的是GDIGraphics Device Interface字体系统。R会维护一个字体映射表默认sans映射到Arialserif映射到Times New Romanmono映射到Courier New。这不是R Studio决定的而是R for Windows在底层实现了这层映射。所以你在Windows上第一反应是加family SimSun之类的参数但直接写字符串往往无效因为R没有自动去系统字体库里注册宋体的字体族名称。macOS上R通常用quartz()设备底层是苹果的Core Text字体系统。这个系统本身对CJK中日韩统一表意文字支持很好但R发过去的指令还是默认sans映射到Helvetica同样没有中文字形。你可以在quartz设备里手动指定family PingFang SC但字体名的写法和大小写必须精准稍不匹配还是方块。Linux上R默认使用X11(type Xlib)或者cairo设备。很多没有图形界面的服务器环境还需要额外装X11和cairo相关库。Linux设备依赖fontconfig管理字体理论上对中文支持很灵活但前提是系统里装了中文字体比如Noto CJK、文泉驿。很多云服务器和Docker容器只装了最基本的字体打开项目才发现一个中文字体都没有出图自然就是方块。我遇到过最迷茫的情况是在Windows本地跑得好好的一键部署到Linux服务器上重新出图全变成方块。查了半天发现服务器os没装中文字体和R代码一毛钱关系都没有。操作系统默认图形设备底层字体系统中文字体支持情况Windowswindows()GDI有中文字体但R默认不主动使用macOSquartz()Core Text有中文字体名称匹配严格LinuxX11/cairofontconfig依赖系统安装很多服务器没有这里有一个测试方法值得每个R用户在换平台时都跑一遍。在控制台输入par(family sans)然后执行plot(1, main 中文测试)如果显示方块就说明当前设备没有正确接入中文字体需要往下看解决方案。2. 原生方案让R认识系统中的中文字体先讲不用额外装包的“原生版”解决方案。这个方法的核心思路是直接告诉R图形设备中文字体在系统里的字体族名称是什么然后手动注册到R的字体映射表里。2.1 Windows原生方案windowsFonts注册Windows上我们可以用windowsFonts()函数查看当前设备已知的字体映射表然后手动添加中文字体。# 查看当前Windows图形设备已知的字体 windowsFonts() # 自定义映射给中文字体起一个渲染别名 windowsFonts(SimHei windowsFont(SimHei)) windowsFonts(SimSun windowsFont(SimSun)) windowsFonts(YaHei windowsFont(Microsoft YaHei))这段代码的含义是调用底层API创建Windows字体对象然后把它绑定到自定义名字SimHei上。之后绘图时只要写family SimHeiR就会用它来渲染中文。windowsFont(SimHei)里的字符串必须和Windows系统字体目录中显示的字体名称完全一致注意大小写。你可以在R里用systemfonts::system_fonts()查看系统中所有可用字体的family字段这个包没有依赖问题建议每个人先装一个。# 需要先安装install.packages(systemfonts) library(systemfonts) system_fonts() | subset(grepl(SimHei|SimSun|YaHei|KaiTi|FangSong, family)) | select(family, path)如果你的Windows字体目录里没有SimHei说明系统没安装黑体。可以去控制面板-字体里查看或在C:\Windows\Fonts文件夹里搜索。很多精简版系统会去掉中文字体这一点在Win10 LTSC版上尤其常见。注册完成后基础绘图就能用了# 加载字体后绘图 plot(1:10, main 散点图中文标题, xlab 横轴标签, ylab 纵轴标签, family SimHei)这里有个关键细节windowsFonts()注册只在当前R会话中有效每次启动新会话都要重新注册。常用的做法是把它写进.Rprofile放在文档目录的R起始文件夹里这样打开R就自动加载。但注意如果换到别的机器这个文件需要同步更新。2.2 macOS原生方案quartz字体设置macOS上quartz设备对中文的支持其实比Windows好只是字体名称必须准确。常用中文字体名称PingFang SC、STHeiti华文黑体、STSong华文宋体、Hiragino Sans GB。在macOS下直接用系统字体名称即可# macOS下的quartz设备 plot(1:10, main 散点图中文标题, xlab 横轴标签, ylab 纵轴标签, family PingFang SC)如果想用短名字类似Windows的注册方式可以用quartzFonts()注册quartzFonts(heiti quartzFont(c(Heiti SC, Heiti SC, Heiti SC, Heiti SC))) # 之后可以 family heiti plot(1:10, main 中文标题, family heiti)quartzFont()函数需要传入4个字体族名称分别对应常规、粗体、斜体、粗斜体。中文字体一般没有独立的斜体变体所以四个参数写同一个字体名即可。但macOS也有自己的坑。如果你用par(family STHeiti)然后在RStudio中缩放预览发现某些字重看起来非常细这是quartz的字体平滑渲染在Retina屏上的表现不是出图问题。另外如果用了自定义字体需要确保字体文件已经安装到系统字体库中双击字体文件并选择“安装字体”。2.3 Linux原生方案安装中文字体并启用cairoLinux下的原生方案第一步往往不是调R而是装系统字字体。以Debian/Ubuntu为例# 安装中文字体包文泉驿 Noto CJK sudo apt update sudo apt install fonts-wqy-zenhei fonts-wqy-microhei fonts-noto-cjk装完之后用fc-list验证系统是否能识别这些字体# 查看系统已安装的所有中文字体 fc-list :langzh如果输出为空说明系统还是没装上中文字体需要检查包管理器日志。如果输出了字体文件路径和字体名比如/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc: Noto Sans CJK SC:styleRegular说明系统层面已经OK。接下来在R中推荐使用cairo_pdf()或者直接设置X11(type cairo)让R的图形输出使用cairo渲染它会自动读取fontconfig的中文字体配置。# Linux下使用cairo图形设备 cairo_pdf(output.pdf, width 8, height 6) plot(1:10, main 中文标题, family Noto Sans CJK SC) dev.off()注意cairo设备在R for Linux中是默认启用的但如果你用的是png()或pdf()这些老式设备可能不会走cairo路径中文照样变方块。建议直接使用ggsave()并通过device cairo_pdf或device ragg::agg_png指定设备。3. 通用键方案showtext与Cairo跨平台解决原生方案有个共同缺点每个平台都要单独配置换机器就重新折腾。如果你需要跨平台、跨设备、跨文件格式保持一致性showtext是当前最省心的答案。3.1 showtext原理把文字变成图形路径showtext的底层思路很聪明它不从操作系统实时查询字体而是在渲染时将每个字符转换为路径polyline/polygon然后以图形对象的形式画到画布上。这样文字本质上变成了矢量图形不再依赖设备去查字体。这样有什么好处最大的好处是“一次加载处处可用”。只要在代码里加载了中文字体文件路径不管当前设备是png、pdf、svg还是RStudio的Plots面板都能正确输出中文。因为你给的不是“字体名”让设备去搜而是直接把字形路径画上去了。使用方法非常简洁# 安装并加载showtext install.packages(showtext) library(showtext) library(sysfonts) # 提供font_add等工具 # 从系统字体文件添加中文字体 font_add(SimHei, regular C:/Windows/Fonts/simhei.ttf) # Windows路径示例 font_add(NotoSansCJK, regular /usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc) # Linux路径示例 # 启用showtext自动渲染 showtext_auto() # 之后正常绘图它会自动覆盖所有文本 plot(1:10, main 这是中文标题, xlab 横轴, ylab 纵轴) ggsave(plot.png, width 8, height 6, dpi 300) # 保存也会生效font_add()的第一个参数是你在R代码里使用的字体别名可以自己起名字第二个参数是字体文件的实际路径。这个设计非常灵活你可以把宋体文件复制到工程目录下然后用相对路径加载这样即使在别人的电脑上运行只要路径正确就能出图。如果你想启用系统已安装的字体名称还有一种更简洁的写法library(showtext) font_add(myfont, C:/Windows/Fonts/simsun.ttc) # 直接用文件路径 showtext_auto()需要注意showtext_auto()之后所有绘图设备的文本都会被接管包括RStudio内预览。如果之后想恢复默认行为执行showtext_auto(FALSE)即可。有时用par(family myfont)显式指定字体名能避免一些边缘情况下showtext误判字体。3.2 从字体文件直接加载无需系统安装这里还藏着一个小技巧showtext让你可以完全绕过系统字体库直接从任意字体文件加载。比如你下载了一个开源中文字体“思源宋体”Source Han Serif SC的.otf文件把它放在项目的fonts/目录下然后在代码里指定路径font_add(SourceHanSerif, regular fonts/SourceHanSerifSC-Regular.otf) showtext_auto()这种方式对团队协作特别友好。你把字体文件一起放进Git仓库每个同事clone代码后只要路径一致出图效果完全一致不受个人电脑字体影响。这在写R语言数据分析案例交付、期刊图表复现时非常有用。还要注意font_add()可以接受regular、bold、italic等多个参数分别对应不同字重。但中文字体一般只提供Regular和Bold斜体没有所以只写regular通常就够了。如果你在ggplot里用face bold但是只加载了regular会导致R找不到匹配字形输出结果不可预期甚至直接报错。稳妥做法是# 如果字体文件提供bold版本一起加载 font_add(myfont, regular fonts/FZHei-B01.ttf, bold fonts/FZHei-B01.ttf) # 如果没有bold版重复同样文件3.3 Cairo方案适用于不依赖showtext的场景Cairo是另一套底层方案它本身是跨平台的2D图形库R的Cairo包将R图形输出重定向到cairo渲染。Cairo在处理抗锯齿、透明度、矢量输出方面比基础pdf()好很多对中文字体的支持依赖系统fontconfig只要系统装了中文字体就自动支持。install.packages(Cairo) library(Cairo) # 用Cairo设备保存PNG文件 CairoPNG(output.png, width 800, height 600) plot(1:10, main 中文标题) dev.off() # 用Cairo设备保存PDF CairoPDF(output.pdf, width 8, height 6) plot(1:10, main 中文标题) dev.off()和showtext相比Cairo更适合“直接保存文件”而不是“RStudio内预览”场景。因为你调用了CairoPNG()之后所有输出都会写到文件里不会在Plots面板显示。如果你要频繁预览再调参数建议还是用showtext如果是一次性跑批处理生成100张图表Cairo的稳定性更让人放心。另外还有一个不能不提的ragg包。它是基于系统aggAnti-Grain Geometry库重新实现的图形设备渲染速度快对中文支持也很稳定。配合showtext使用效果很好install.packages(ragg) library(ragg) agg_png(output.png, width 8, height 6, units in, res 300) plot(1:10, main 中文标题) dev.off()ragg::agg_png()是我现在个人最常用的保存方案因为它在高清DPI输出下线条依然非常锐利不像png()那样模糊。3.4 各方案对比表一眼看懂为了让你快速决策我整理了一份对比表。写论文、报告、图形界面项目直接抄用合适的方案。方案跨平台字体来源RStudio预览PDF嵌入推荐指数windowsFonts仅Windows系统字体名支持不行3星quartzFonts仅macOS系统字体名支持不行3星extrafont跨平台导入系统字体支持支持4星showtext跨平台字体文件路径支持支持5星Cairo跨平台系统字体不支持支持4星ragg跨平台系统字体文件支持支持4.5星各家方案不是互斥的配合起来也有奇效。我最常用的组合是showtext负责文本渲染ragg负责保存高清文件配合ggsave()参数指定设备。4. 实战演示从乱码到完美出图的完整代码这一节全部是能直接运行的完整代码。我按照日常项目的几个场景来组织从基础绘图到ggplot2再到专门保存PDF的坑最后给一个数据分析报告的示例。4.1 场景一基础绘图plot函数中文字体先演示最基础的场景用plot函数画一张图标题、横轴、纵轴都包含中文。直接用showtext解决。# 完整可运行示例 library(showtext) font_add(SimSun, regular C:/Windows/Fonts/simsun.ttc) # 宋体 showtext_auto() plot(mtcars$wt, mtcars$mpg, main 汽车重量与油耗分析, xlab 重量1000磅, ylab 英里每加仑, pch 16, col steelblue)执行后标题、坐标轴中文应全部正常显示。如果运行到font_add时报错“cannot open file”说明字体文件路径不对。在Windows下一个通用路径检查法是file.exists(C:/Windows/Fonts/simsun.ttc)如果返回FALSE用list.files(C:/Windows/Fonts)看看到底有哪些字体文件找一个中文字体如msyh.ttc微软雅黑、simhei.ttf黑体来用。4.2 场景二ggplot2图形中的中文字体配置ggplot2的使用场景更复杂因为ggplot的主题系统自带字体设置不显式指定family就可能被默认主题覆盖。我在实际中经常看到showtext加了但图表中文还是乱码原因就是没在主题设置中指定family。推荐写法library(ggplot2) library(showtext) font_add(YaHei, regular C:/Windows/Fonts/msyh.ttc) showtext_auto() p - ggplot(mtcars, aes(x wt, y mpg, color factor(cyl))) geom_point(size 3) labs( title 汽车重量与油耗分析, subtitle 按气缸数分组, x 重量1000磅, y 英里每加仑, color 气缸数 ) theme_minimal(base_family YaHei) theme( plot.title element_text(size 16, face bold, hjust 0.5), legend.position bottom ) print(p)关键点在于theme_minimal(base_family YaHei)这行它把ggplot2整个主题的基础字体设置成showtext注册的“YaHei”这样所有默认文本都会用中文字体渲染不需要每一处都写element_text。一个附加技巧当你使用theme(axis.text.x element_text(angle 45, hjust 1))旋转横坐标标签时文字旋转角度会让某些字体渲染出现“发虚”的情况这是设备渲染问题不影响出图文件。如果是导出PNG用于投稿记得调高dpi参数推荐300以上。R本身不会自动增加清晰度需要你自己设置。4.3 场景三保存PNG、PDF、JPEG文件的中文要点保存文件重要的是不要用旧式png()和pdf()函数它们的默认字体渲染机制和RStudio的预览面板完全不同。比如pdf()函数默认用的是PDF设备内嵌的标准14种字体这些字体根本没有中文字形即使你在RStudio里预览时很正常写pdf(a.pdf)保存后中文就没了。正确写法如下library(showtext) font_add(YaHei, regular C:/Windows/Fonts/msyh.ttc) showtext_auto() # 保存PNG使用ragg设备清晰度更高 ggsave(plot.png, p, width 8, height 6, dpi 300, device ragg::agg_png) # 保存PDF使用cairo设备支持中文嵌入 ggsave(plot.pdf, p, width 8, height 6, device cairo_pdf) # 或者用base绘图中的Cairo设备 cairo_pdf(base_plot.pdf, width 8, height 6) plot(1:10, main 中文标题) dev.off()注意ggsave()里的device参数如果不写R会根据文件后缀自动选择设备.png可能用png().pdf用pdf()而这些旧设备对中文支持并不好。显式指定ragg::agg_png或cairo_pdf相当于你自己决定了渲染引擎避免了自动选择的坑。我遇到过最阴间的场景是在RStudio里预览图一切正常用ggsave(plot.pdf, p)保存后打开PDF正文文字正常但图里的中文全部丢失只剩英文字母。排了半天发现旧式pdf()设备只能嵌入标准Latin字体中文必须用cairo_pdf。那一次之后我所有的PDF出图都强制指定device cairo_pdf。4.4 场景四数据分析报告中的中文图表实战再扩展一个实际的数据分析场景比如做一个销售数据的周报可视化输出一页带公司名、标题、注释的图表。这种情况下除了标题图例、注释、水印都要中文。showtext同样能处理。library(showtext) library(dplyr) library(ggplot2) # 加载公司内部字体 font_add(CorporateFont, regular C:/Windows/Fonts/simhei.ttf) showtext_auto() # 模拟数据 set.seed(2024) df - data.frame( 月份 rep(1:12, 2), 产品 rep(c(A产品, B产品), each 12), 销售额 c(120 cumsum(rnorm(12, 5, 3)), 100 cumsum(rnorm(12, 8, 4))) ) # 绘图 p - ggplot(df, aes(x 月份, y 销售额, color 产品)) geom_line(linewidth 1.2) geom_point(size 2) labs( title 2024年度销售趋势分析, subtitle 数据来源内部业务系统, caption 注销售额单位为万元经脱敏处理, x 月份, y 销售额万元 ) scale_x_continuous(breaks 1:12) theme_minimal(base_family CorporateFont) theme(plot.caption element_text(hjust 0, face italic)) ggsave(sales_report.png, p, width 10, height 6, dpi 300, device ragg::agg_png)在这个例子中caption注释、中文产品和月份、图表标题全部都由showtext接管。scale_x_continuous(breaks 1:12)是为了防止横坐标日期过密算是题外话但也很实用。这个图形生成的PNG直接可以用在周报PPT里清晰度足够也不会出现中文字体缺失的情况。5. 经典报错与排查技巧实录写到这里再给你梳理一套可直接套用的排查流程和典型问题的解决思路。毕竟再好的方案到实际项目中总会冒出一些边缘情况。5.1 常见报错与解决方案速查表以下是我在维护R语言数据分析环境时从不同机器、不同项目里收集到的典型报错和处理方法。建议收藏。报错信息或现象可能原因解决方案Error in title(...) : font family not found字体名在系统字体库中不存在或未注册用systemfonts::system_fonts()查看实际字体名注册正确名称cannot open file C:/Windows/Fonts/simsun.ttc字体文件路径错误用list.files(C:/Windows/Fonts)确认文件存在图形正常但导出的PDF中文字体丢失使用了pdf()而非cairo_pdf()改为cairo_pdf()或用ggsave(..., device cairo_pdf)Linux服务器上中文变成豆腐块系统未安装中文字体安装fonts-noto-cjk或fonts-wqy-zenheishowtext设置后ggplot标题中文正常图例仍乱码ggplot主题中未设置base_family在theme_*()或theme()中设定base_family保存PNG时文字发虚清晰度不够res或dpi设置过低提高dpi300或改用ragg::agg_png中文汉字可以显示但标点符号变成半角或错位中文字体未包含全角标点更换完整的CJK字体如思源黑体、Noto Sans CJKshowtext_auto()执行后所有系统字体都不生效showtext接管了所有文本但字体路径失效检查font_add()路径必要时重启R会话后重新加载在R Markdown中渲染图表中文正常但html预览中乱码R Markdown输出格式不包含字体嵌入使用showtext并显示指定ggplot的family或者生成PNG后嵌入5.2 字体名称冲突如何定位系统真实字体名一个很大的坑是“字体名称和文件路径”概念混淆。R中的family参数指的是字体族名称不是文件名。比如Windows下字体文件叫simhei.ttf但字体族名称在系统里显示为“SimHei”或“黑体”不同软件写法不一致。为了准确查看系统中已经注册的字体的标准名称用systemfonts::system_fonts()最靠谱。它返回的是系统层面的字体族信息和R的windowsFonts映射无关。在控制台运行后你可以用正则过滤出中文字体library(systemfonts) fonts_info - system_fonts() # 筛选出可能的中文字体family 列包含中文字体名称 subset(fonts_info, grepl(SimSun|SimHei|Microsoft YaHei|PingFang|Noto Sans CJK|Noto Serif CJK|Source Han|WenQuanYi, family))在macOS上也可以用系统自带的“字体册”应用查看字体名称但要小心中英文名称差异。比如中文名叫“黑体-简”字体族名可能是“Heiti SC”两者需要区分。用systemfonts()可以避免这种混乱。5.3 疑难杂症服务器中文字体缺失、PDF嵌入、ggsave不生效在实际工作中有三个比较疑难的问题我单独拿出来讲第一个是服务器中文字体渲染。你在一台没装中文字体的Linux服务器上跑项目showtext同样可以解决。你不需要让服务器系统“认识”中文字体只需要用一个相对路径把字体文件加载进R# 在项目根目录下创建fonts/目录放入msyh.ttc font_add(YaHei, regular fonts/msyh.ttc) showtext_auto()这个方法的好处是不需要root权限不需要改系统配置只要R能读取字体文件就行。配合Git管理每个服务器拉取代码后字体文件同步拉取出图效果稳定。第二个是PDF中文字体嵌入。如果你用cairo_pdf()保存输出PDF会嵌入子集中文字体。这时用Adobe Acrobat打开查看文字可以用查找工具搜到中文内容这是做论文、做报告交付时的重要检查。检测PDF是否嵌入了字体的方法是用pdfinfo工具系统安装poppler-utils或者直接看最终文件大小。如果字体未嵌入文件大小会非常小几KB而且打开后中文字体显示可能异常。第三个是ggsave()与showtext的协同问题。ggsave()在保存时会重置当前图形设备但showtext的接管状态不会因此丢失前提是你在ggsave()之前已经调用了showtext_auto()。如果你发现ggsave()保存的图片中文正常但RStudio预览面板中文乱码反过来也是这个原因showtext_auto()没有生效。我的个人建议是把showtext_auto()调用放到脚本顶部所有绘图代码之前。确保你在执行source()整个脚本时不需要依赖交互操作生效。5.4 我的字体选择与推荐配置最后分享一下我自己的配置偏好。经过多次尝试我现在基本固定使用中文字体首选思源黑体Source Han Sans SC或Noto Sans CJK SC开源免费字形完整包含全角标点而且没有版权隐患。如果有内部报告需求微软雅黑和苹方也可以。英文字体和中文混排时推荐Helvetica或Arial要保证中英文风格一致。很多人忽略了中英文混排时字体的搭配结果中文是黑体英文是Times视觉上非常割裂。字体加载一律使用showtextfont_add()明确路径保存PNG用ragg保存PDF用cairo_pdf绘图主题里统一用base_family设置。项目里一个典型的字体配置模板我放在这里你可以直接复用# config_fonts.R library(showtext) library(sysfonts) # 设置字体路径根据平台切换 if (.Platform$OS.type windows) { font_add(main_font, C:/Windows/Fonts/msyh.ttc) } else if (Sys.info()[sysname] Darwin) { font_add(main_font, /System/Library/Fonts/PingFang.ttc) } else { font_add(main_font, fonts/NotoSansCJK-Regular.ttc) } showtext_auto()这样一套无论在哪台机器上跑代码都能出一样的中文图表。我在实际使用中最深的体会是R画图中文乱码这个问题看起来是“缺一个字体”的小事但它牵涉到图形设备、字体系统、渲染引擎三个层面的协同。很多人花几个小时乱试一堆代码不如花十分钟理解字体渲染流程来得快。也希望这份完整的实操总结能让你少踩几个我当年踩过的坑。
返回列表