一、搞懂为什么绘图会出现中文乱码

很多刚上手Julia绘图的开发者,第一次画带中文的图时,大概率会遇到标题、标签全是方块或者乱码的情况。其实这不是Julia的问题,也不是绘图工具的bug,本质是系统找不到匹配的中文字体文件,或者绘图后端没有指定用正确的字体来渲染中文。

1.1 乱码的具体流程

Julia绘图常用的两个工具链是Plots和Makie,它们的乱码原理略有不同。Plots本质是个包装器,底层可以切换GR、PyPlot等后端,后端自己负责字体加载;而Makie是原生Julia的绘图库,有自己独立的字体管理系统。不管是哪个,只要后端加载的字体里没有对应的中文字符,就会显示成乱码或者方块。

二、Plots后端的字体配置全流程

Plots的优势是简单,一行代码切换后端,新手很容易上手,但字体配置需要注意环境差异(Windows、Mac、Linux各不一样)。

2.1 先搞定系统里的中文字体

不管用哪个绘图库,系统必须装对应字体,不然再怎么配置也没用。比如:

  • Windows系统:自带微软雅黑(Microsoft YaHei,字体文件名msyh.ttc)
  • Mac系统:自带苹方(PingFang SC,文件名PingFang.ttc)
  • Linux系统:大部分默认没有中文字体,需要装开源字体,比如文泉驿微米黑(WenQuanYi Micro Hei,包名fonts-wqy-microhei)

2.2 Plots全局字体配置示例

Plots的全局配置用default()函数,指定fontfamily参数,代码里要注意不同系统的适配,新手先写死常用的:

using Plots
# 切换到GR后端(如果是Linux,后端默认也是GR,可能会慢一点)
gr()
# 配置全局字体:Windows用微软雅黑,Mac用苹方,先写死Windows的例子
# 字体名称可以在系统字体文件夹里查,Windows在C:\Windows\Fonts,Mac在/Library/Fonts
default(
    fontfamily="Microsoft YaHei", # 全局默认字体
    titlefontsize=14, # 标题大小
    tickfontsize=10, # 坐标轴刻度大小
    guidefontsize=12 # 坐标轴标签大小
)
# 画一个带中文的示例图,测试效果
x = 1:10
y = rand(10)
plot(x, y, 
    title="这是测试用的中文标题", 
    xlabel="横轴:时间(天)", 
    ylabel="纵轴:数值", 
    label="随机曲线",
    linewidth=2
)

如果执行后还是乱码,那大概率是字体名称写错了,比如把“微软雅黑”写成了“微软雅黑 Regular”,或者系统里的字体路径不对,也可以直接用字体文件的绝对路径指定,比如把fontfamily改成"C:/Windows/Fonts/msyh.ttc"(Windows)或者"/Library/Fonts/PingFang.ttc"(Mac),这样更精准。

2.3 Plots导出图片也乱码的解决

有时候代码里配置了字体,但导出的png图片还是乱码,这是因为后端没有把字体嵌入到图片里。Plots的savefig()函数加个embedfonts=true参数就行,比如:

# 导出嵌入字体的图片,解决导出后乱码问题
savefig("test_chinese.png", embedfonts=true)

三、Makie后端的字体配置详解

Makie是现在Julia里性能最好的绘图库,支持交互和大数据量绘图,但它的字体管理和Plots不一样,需要单独配置。

3.1 Makie的字体管理逻辑

Makie有自己的字体数据库,会自动扫描系统里的字体,也允许手动添加。如果默认字体里没有中文字体,就会 fallback 到无衬线字体,导致中文显示异常。

3.2 Makie的字体配置示例(CairoMakie,适合导出图片)

CairoMakie是Makie的非交互后端,专门用来导出高清图片,配置示例:

using CairoMakie
# 创建画布,指定全局字体为微软雅黑
fig = Figure(font="Microsoft YaHei")
# 创建坐标轴,设置标题和标签的字体大小
ax = Axis(fig[1,1], 
    title="Makie中文测试标题", 
    xlabel="横轴:测试次数", 
    ylabel="纵轴:测试数值",
    titlesize=16,
    xlabelsize=12,
    ylabelsize=12
)
# 画一条线,添加图例
lines!(ax, 1:5, [1.2, 2.5, 3.1, 4.8, 5.2], label="测试曲线", linewidth=3)
axislegend(ax)
# 导出图片,字体已经嵌入
save("makie_chinese_test.png", fig)

如果用GLMakie(交互后端,用来弹出窗口看动图),配置方式类似,只是不用savefig,直接渲染就行。如果还是乱码,可以手动指定字体文件的绝对路径,比如把Figure的font参数改成"C:/Windows/Fonts/msyh.ttc",这样肯定能找到字体。

四、常见避坑指南

4.1 乱码解决的优先级

遇到中文乱码,先按这个顺序排查:

  1. 确认系统里装了对应中文字体(比如Linux没装文泉驿字体就先装)
  2. 检查字体名称是否正确(不要写错别字,比如“苹方”写成“苹果体”)
  3. 后端是否指定了正确的字体(比如Plots的default里的fontfamily,Makie的Figure里的font)
  4. 导出图片时是否加了embedfonts参数

4.2 Linux环境的特殊配置

Linux用户经常遇到的问题是没有中文字体,第一步先装字体,Ubuntu/Debian系的命令是:

sudo apt update
sudo apt install fonts-wqy-microhei fonts-wqy-zenhei

装完之后,在Julia里把字体名称改成"WenQuanYi Micro Hei"就可以了。

4.3 不要混用后端配置

Plots和Makie的字体配置是分开的,比如你在Plots里配置了微软雅黑,对Makie没用,要分别设置。

五、应用场景与技术对比

5.1 不同场景选哪个后端

  • 快速原型/小数据绘图:选Plots,配置简单,切换后端方便(比如需要PyPlot的交互,或者GR的快)
  • 大数据量/高性能绘图/交互图:选Makie,性能是Plots的好几倍,还支持3D绘图、动画
  • 服务器环境(无图形界面):两个都可以,Plots的GR后端要设置ENV["GKSwstype"]="nul",避免弹出窗口报错;Makie的话用CairoMakie,不用GLMakie的窗口

5.2 字体选择的建议

学术绘图(比如论文里的图)选宋体或者Times New Roman;日常绘图或者展示用微软雅黑(Windows)、苹方(Mac),视觉上更舒服。

六、技术优缺点总结

6.1 Plots的优缺点

优点:上手快,语法简洁,多后端支持,生态成熟,适合快速做图;缺点:大数据量绘图慢,复杂配置不如Makie灵活。

6.2 Makie的优缺点

优点:性能极高,支持交互、3D、动画,原生Julia,不用依赖Python;缺点:新用户需要适应,字体配置比Plots稍麻烦。

七、文章总结

总的来说,Julia绘图的中文乱码问题本质是字体匹配和加载的问题,不管是Plots还是Makie,只要先搞定系统字体,再指定对应字体的名称或者路径,就能解决大部分乱码。不同场景选不同后端,Plots适合快速做图,Makie适合高性能交互需求,Linux用户记得先装开源中文字体,导出图片时记得嵌入字体,这样所有环境下打开图片都不会乱码。