
用 matplotlib 画图最让人血压飙升的瞬间莫过于——图是画出来了线啊点啊都对可所有中文标签全变成一个个方框或者干脆消失。更气人的是在 PyCharm 里跑没问题换个 VSCode 终端就乱码自己电脑好好的一拿到服务器就废。我前前后后踩过不下二十次这种坑今天把根治方案、排查思路和避坑经验一次说透。无论是刚接触数据可视化的新手还是被中文折磨已久的写论文人、做报表的职场人这篇文章都能帮你彻底告别 matplotlib 中文乱码。1. 中文乱码的本质不是 matplotlib 的问题而是字体与编码的错配1.1 乱码到底是怎么发生的很多人一遇到乱码就想去重装 matplotlib其实这跟 matplotlib 本身没什么关系。Matplotlib 默认使用的字体是 DejaVu Sans这是一套西文字体里面压根就没有中文字形。当绘图文本里出现“销售数据”“柱状图”这类汉字时matplotlib 在字体库中找不到对应的字形于是只能用一个空心方框来代替。Windows 下还会出现一种情况就是字符被错误解析成乱码符号比如一堆“□□□□”或者“锟斤拷”后者其实是编码转换错误导致的经典乱码。明白了这个原理解决路径就清晰了让 matplotlib 使用一款支持中文的字体。常见的可选方案有三种一是全局修改 rcParams 字体配置二是安装额外的中文字体到系统三是动态指定字体文件路径。大部分人推荐第一种确实也是最稳定的一种。但具体怎么配置、配完为什么还不生效这里面的门道很多我下面会逐一拆解。1.2 字体查找机制matplotlib 怎么决定用哪个字体在进入实操前有必要先了解一下 matplotlib 的字体查找流程不然遇到findfont: Font family SimHei not found这种报错时还是会一脸懵。当调用plt.xlabel(年份)时matplotlib 会进入字体管理器它先读取当前 rcParams 中font.family和font.sans-serif的配置然后在系统字体缓存里匹配对应的 TTF/TTC 文件。如果找不到就会把警告打到终端并回退到默认字体。注意这里的“找到”指的是字体文件能被 matplotlib 的字体管理器正常加载而不是只要系统里装了微软雅黑就万事大吉。某些第三方发行版比如通过 conda 安装的 matplotlib可能没有继承系统字体路径导致明明装了中文字体却仍然乱码。1.3 对比表格常见中文字体的适配性为了让你一目了然地选择我整理了一个常用中文字体在 matplotlib 中的适配情况表环境是 Windows 10 Python 3.10 matplotlib 3.7。字体名称系统自带情况matplotlib 中常见写法小字号清晰度是否容易缺字SimHei黑体Windows 自带SimHei较好偶尔SimSun宋体Windows 自带SimSun好少见Microsoft YaHei微软雅黑Windows 自带Microsoft YaHei非常好极少数生僻字KaiTi楷体Windows 自带KaiTi好少见Noto Sans CJK SC需下载Noto Sans CJK SC非常好无WenQuanYi Zen HeiLinux 常见WenQuanYi Zen Hei好无Source Han Sans CN思源黑体需下载Source Han Sans CN非常好无从经验来看日常出图优先SimHei或Microsoft YaHei如果要提交期刊或打印推荐思源黑体因为它的字形更规范和统一。这里要特别提醒字体名称必须严格按照 matplotlib 识别的名字来写不是你在 Word 里看到的名字。比如系统里安装的是“方正小标宋简体”matplotlib 可能识别不了这种带修饰词的名字这时就需要用font_manager.fontManager.ttflist查看实际名字。2. 三种常用解决方案从永久生效到临时指定2.1 方案一全局修改 rcParams最常用、最实用这是最正宗的写法只要在绘图脚本的最前面加上几行代码所有文本都会使用中文字体。我一般是这样写的import matplotlib.pyplot as plt plt.rcParams[font.sans-serif] [SimHei] # 指定默认无衬线字体为黑体 plt.rcParams[axes.unicode_minus] False # 解决负号‘-’显示为方块的问题第一行很好理解就是告诉 matplotlib 用黑体渲染文字。第二行axes.unicode_minus设置成False是为了让坐标轴的负号使用 ASCII 短横线而不是 Unicode 的减号。为什么必须设置因为在某些中文字体下Unicode 减号字形是缺失的会显示成小方块。这个问题很容易被忽略导致坐标轴出现“-0.5 变成 □0.5”的怪现象。完整的使用示例import matplotlib.pyplot as plt plt.rcParams[font.sans-serif] [SimHei] plt.rcParams[axes.unicode_minus] False days [周一, 周二, 周三, 周四, 周五] temps [23, 25, 27, 26, 24] plt.plot(days, temps, markero) plt.title(一周温度变化) plt.xlabel(星期) plt.ylabel(温度(℃)) plt.show()这段代码直接跑起来标题、坐标轴标签就正常了。有一点要注意font.sans-serif这个键对应的值是一个列表你可以同时列出多个备选字体比如[Microsoft YaHei, SimHei, Arial]matplotlib 会从左到右依次尝试直到找到可用的为止。这样即使某个字体在某些系统上不存在也会自动降级。2.2 方案二使用字体管理器动态注册字体适合无中文环境当你把脚本扔到服务器上跑而服务器是纯 CentOS 系统往往没有安装任何中文字体此时方案一就会失效。我们可以在脚本中动态下载并注册一个字体文件无需系统级安装。第一步准备一个 TTF 文件比如从我常用的路径拷贝import matplotlib import matplotlib.font_manager as fm # 字体文件路径TTF或OTF均可 font_path /path/to/your/NotoSansCJKsc-Regular.otf prop fm.FontProperties(fnamefont_path)然后在使用时把FontProperties对象传给每个需要中文的绘图接口import matplotlib.pyplot as plt # 使用上面的 prop plt.plot([中文, 数据], [1, 2]) plt.title(自定义字体, fontpropertiesprop) plt.xlabel(类别, fontpropertiesprop) plt.ylabel(数值, fontpropertiesprop)这种方式的优势是即使电脑上没有任何系统中文只要脚本里带一个字体文件就能在任何机器上稳定复现。缺点是每次设置文本都要加fontproperties参数代码冗余。如果你想全局生效可以这样注册import matplotlib.font_manager as fm import matplotlib.pyplot as plt fm.fontManager.addfont(/path/to/your/NotoSansCJKsc-Regular.otf) plt.rcParams[font.family] Noto Sans CJK SCaddfont方法在 matplotlib 3.2 之后存在低于这个版本的也可以手动构建FontProperties再添加到fontManager.ttflist不过更建议升级到新版。2.3 方案三临时修改字体设置单图快速调试有时候只是临时画个示意图不愿意动全局配置可以在单个 Figure 对象上临时设置import matplotlib.pyplot as plt from matplotlib.font_manager import FontProperties # 读取系统字体 font_path C:/Windows/Fonts/msyh.ttc # Windows 微软雅黑 my_font FontProperties(fnamefont_path, size12) fig, ax plt.subplots() ax.set_title(临时图, fontpropertiesmy_font) ax.set_xlabel(X 轴, fontpropertiesmy_font)这一种最灵活但如果你要写一个有几十个图标的论文每一个轴都要去指定一遍绝对会怀疑人生。所以我个人的经验是写脚本时用方案一的全局配置打底遇到特殊字体需求再叠加方案二的动态注册。方案三只在快速试错时用。2.4 三种方案的适用场景对比方案优点缺点适用环境全局 rcParams简洁、一行搞定依赖系统已安装字体个人电脑、本地脚本动态注册 TTF跨平台、可移植需要携带字体文件服务器、云端、共享脚本单图 FontProperties精准控制代码冗长易遗漏快速调试、单个特殊图3. 实操全流程从检测到修复一步不落3.1 先检查当前环境到底缺什么不要一乱码就照着网上的代码粘贴第一步应该是定位。打开 Python 终端执行以下代码查看系统字体列表from matplotlib import font_manager fonts [f.name for f in font_manager.fontManager.ttflist] print(sorted(set(fonts)))如果输出结果里没有SimHei、Microsoft YaHei这类中文字体说明当前 Python 环境根本没有扫描到中文那就需要检查系统是否安装中文字体或者使用动态注册。如果列表里有中文字体但还是乱码那问题多半出在代码没有正确指定比如plt.rcParams[font.sans-serif] SimHei这种错误赋值——注意这里应该是一个列表字符串后面没有加方括号matplotlib 也会报错。另外还要查一下 matplotlib 版本老版本2.x 及以前对字体支持不同建议升级到最新版pip install -U matplotlib升级之后再次运行检测脚本往往一些莫名其妙的问题就消失了。3.2 完整修复示例一个带中文的散点图假设我们要绘制一个“各季度销售额散点图”直接上完整代码这是能直接复现的import matplotlib.pyplot as plt # 1. 全局字体设置 plt.rcParams[font.sans-serif] [Microsoft YaHei, SimHei, Arial] plt.rcParams[axes.unicode_minus] False # 2. 数据 quarters [Q1(一季度), Q2(二季度), Q3(三季度), Q4(四季度)] sales [125, 180, 210, 165] # 3. 绘图 plt.figure(figsize(8, 5)) plt.scatter(quarters, sales, s80, c[#1f77b4, #ff7f0e, #2ca02c, #d62728]) plt.title(各季度销售额散点图) plt.xlabel(季度) plt.ylabel(销售额万元) plt.grid(True, linestyle--, alpha0.5) plt.show()假如这里运行出来仍然有小方块大概率是你的Microsoft YaHei字体文件名是msyh.ttcmatplotlib 对 TTC 格式的兼容性略差。解决办法是换用SimHei或者下载单独的 TTF 格式字体。Windows 自带的黑体是simhei.ttf一般都能被正常识别。3.3 字体文件放在哪更合适如果你走的是动态注册路线字体文件的存放位置也有讲究。不要随便丢在临时目录否则脚本换台机器就跑不动。建议在项目里建一个fonts/目录把字体文件统一放在里面然后通过绝对路径引用。如果你的脚本要给别人用还可以用os.path.join拼接路径增强可移植性import os import matplotlib.font_manager as fm base_dir os.path.dirname(os.path.abspath(__file__)) font_path os.path.join(base_dir, fonts, SimHei.ttf) fm.fontManager.addfont(font_path)这样做的好处是整个项目目录拷贝到任何机器上都能运行。我习惯在团队里统一维护一个fonts文件夹里面放思源黑体的几个字重文件这样大家画出来的图风格一致。3.4 确认修复成功如何快速判断修复后不要只看图是否正常还要注意看终端有没有警告。如果字体匹配失败matplotlib 会打印类似findfont: Font family SimHei not found的警告。输出图形正常但终端有警告说明这次虽然显示了但下一次可能又找不到。可以写一个自定义字体管理器方法import warnings import matplotlib.pyplot as plt with warnings.catch_warnings(): warnings.simplefilter(error) plt.rcParams[font.sans-serif] [SimHei]这样可以将警告升级为异常方便在 CI 中检测问题。4. 中文乱码延伸出来的两个高频场景负号与子图图例4.1 负号显示成方框的解决技巧这个我在前面提了一嘴但值得单独说。很多人设置完中文字体后正数正常一遇到负数坐标就显示为方框。原因是轴的刻度默认使用 Unicode 字符 U2212 作为负号而这个字符在许多中文字体中不存在。解决办法就是全局设置plt.rcParams[axes.unicode_minus] False设置为 False 之后matplotlib 会改用 ASCII 连字符-这样就不会受中文字体限制。如果你不想改全局也可以在坐标格式器上设置import matplotlib.ticker as ticker ax.yaxis.set_major_formatter(ticker.FormatStrFormatter(%g))这会把负号也转成普通 ASCII 字符道理相同。不过我始终推荐改 rcParams简单且不易遗漏。4.2 图例和子图中的中文怎么处理图例乱码和标题乱码原理完全一致但处理时有一个小坑如果你使用了label参数并且全局字体设置生效图例就会正常但如果你手动创建了单独的图例对象可能还要重新指定字体plt.legend(prop{family: SimHei})对于子图很多人会在plt.subplots()后忘记设置字体导致每个子图的标题和刻度乱码。最保险的做法是使用plt.rcParams全局设置后子图不需要额外操作。但要注意如果你在一个脚本中混用了不同字体子图之间可能会互相干扰最好用一个命名规范。比如fig, axes plt.subplots(2, 2, figsize(10, 8)) axes[0, 0].plot(...) axes[0, 1].plot(...)这里只要开头设置了 font.sans-serif所有子图的标题、坐标轴都会正常不需要每个轴都设置。4.3 跨平台脚本的字体兼容方案如果你要在 Windows、macOS、Linux 三端运行同一套绘图脚本直接写死SimHei在 macOS 上就会失效。这就需要做平台判断import platform import matplotlib.pyplot as plt system platform.system() if system Windows: font_list [Microsoft YaHei, SimHei] elif system Darwin: font_list [PingFang SC, Heiti SC, Songti SC] else: font_list [Noto Sans CJK SC, WenQuanYi Zen Hei] plt.rcParams[font.sans-serif] font_list plt.rcParams[axes.unicode_minus] False这是一个万金油配置虽然不能保证每个系统都完美但至少不会出大毛病。在 macOS 上PingFang SC是系统默认中文字体matplotlib 一般能识别。Linux 上如果没有Noto Sans CJK SC需要安装fonts-noto-cjk包或者用方案二动态加载字体文件。5. 常见问题与排查技巧实录5.1 速查表乱码场景与解决路径现象原因解决方案中文显示为空心方框默认字体不含中文字形设置font.sans-serif为中文字体负号显示为方框Unicode 减号缺失设axes.unicode_minusFalse终端有 findfont 警告指定字体不存在检查字体名称或动态 addfont在 PyCharm 正常终端乱码环境变量不同或字体缓存未刷新重启 kernel清空 matplotlib 缓存~/.matplotlib设置后仍然乱码配置文件 rcParams 被后置代码覆盖搜索代码中是否还有plt.rcParams赋值Font family not found报错字体名拼写错误用fontManager.ttflist核对准确名称复制到服务器上乱了服务器系统无中文字体动态加载 TTF 或安装字体5.2 细节坑配置被覆盖和缓存遗忘比较隐蔽的一个情况是你在 A 文件开头设置了plt.rcParams[font.sans-serif][SimHei]但后来在 B 文件或同一个脚本后面又调用了plt.style.use(seaborn)之类的样式这个样式会重置 rcParams导致中文字体设置失效。解决方法是把字体设置放在plt.style.use之后或者使用plt.rcParams.update({font.sans-serif: [SimHei]})强制更新。还有缓存问题matplotlib 首次运行时会扫描系统中所有字体生成一个缓存文件在用户目录的.matplotlib文件夹下。当新装了中文字体后matplotlib 仍然使用旧缓存导致识别不到。解决方法rm -rf ~/.matplotlib或者直接用 Python 删import matplotlib import shutil cache_dir matplotlib.get_cachedir() shutil.rmtree(cache_dir)清掉之后下次运行会自动重建缓存新字体就被识别了。这个操作非常简单但能解决一大批“明明安装了字体却不生效”的案例。5.3 进阶将中文字体嵌入 PDF/SVG 文件如果你不是只在屏幕上看看而是要把图片保存后发给别人还要注意保存图片时是否嵌入了字体。SVG 格式默认会把字体路径记录下来别人打开时如果系统没有对应字体可能在他们的电脑上显示乱码。解决办法是在保存时指定字体嵌入方式plt.savefig(output.svg, formatsvg, bbox_inchestight)对于 SVGmatplotlib 生成的路径会通过字体对象来引用文本通常编辑器能自动处理。更稳妥的是输出高分辨率的 PNG并使用dpi参数plt.savefig(output.png, dpi300, bbox_inchestight)300 DPI 足够印刷而且渲染时就固定了字形不会受到查看端字体影响。这是我的惯用做法出论文图基本不会出错。5.4 谈起乱码时的额外提醒CSV 数据源中文乱码有时候图中的中文标签本身是从文件读入的比如读取csv文件的中文列名如果 pandas 读进来就已经是乱码那 matplotlib 表现出的乱码其实是数据源头的问题。排查时要先打印输出字符串看看是否正确。常见的文件编码问题要用对参数import pandas as pd df pd.read_csv(data.csv, encodingutf-8)如果文件是 GBK 编码df pd.read_csv(data.csv, encodingGBK)这一层不解决就算 matplotlib 字体设得再好图上也只会显示你读进来的乱码字符。所以遇到中文乱码先分清是“字体导致的方框”还是“数据源导致的乱码”两者的处理路径完全不同。6. 工具选型推荐中文字体选择与编辑器配置6.1 系统字体怎么看、怎么选Windows 下打开C:\Windows\Fonts能看到simhei.ttf、msyh.ttc、simsun.ttc等文件。建议在项目字体文件夹中保留SimHei.ttf和msyh.ttc的副本但要注意微软雅黑的 TTC 文件在部分 matplotlib 版本中可能加载失败如果遇到问题就换用黑体。Linux 下可用fc-list :langzh查看已安装中文字体fc-list :langzh如果输出为空先安装sudo apt install fonts-noto-cjkmacOS 可以在“字体册”里查看一般系统自带PingFang.ttc但 matplotlib 可能只识别为PingFang SC需要单独测试。我的测试结论是 Matplotlib 3.6 之后对 macOS 的 PingFang 支持已经比较友好但仍有偶发警告。6.2 推荐使用的开源免费字体如果你的需求是公开出版或者商业用途务必谨慎。微软雅黑等字体有商业授权限制更适合用开源字体。我最常用的开源字体有两个思源黑体Source Han Sans SC和文泉驿正黑WenQuanYi Zen Hei。思源黑体的字形现代、清晰度高包含简体/繁体/日文/韩文等多字重最推荐。从 GitHub 下载后解压把 TTF 或 OTF 文件放在fonts/目录再用fm.fontManager.addfont()注册即可。字体下载后要检查大小正规思源黑体单个 OTF 文件大约 15 MB 左右如果某个网站给你的文件只有几百 KB那多半是裁剪版或者非官方版本加载可能出问题。建议直接从官方 GitHub 仓库 release 页面下载。6.3 IDE 与终端的中文输出配合虽然本文主题是 matplotlib但很多人在 IDE 的终端里输出中文也是乱码这会影响调试。如果是在 Windows 的 VSCode 终端中运行 Python 脚本输出中文全是乱码可能不是 matplotlib 的问题而是 Python 控制台编码问题。推荐在脚本开头加import sys import io sys.stdout io.TextIOWrapper(sys.stdout.buffer, encodingutf-8)或者更稳妥地将项目文件统一保存为 UTF-8 编码并在系统区域设置中勾选“Beta: 使用 Unicode UTF-8 提供全球语言支持”。不过后者会影响整个系统谨慎开启。对于仅调试建议用环境变量set PYTHONIOENCODINGutf-8这样设置后控制台输出的中文也能正常显示。注意这类设置优先级高于脚本内的sys.stdout重写更适合临时解决问题的场景。7. 规避乱码的架构思维把字体配置做成公共模块7.1 写一个mpl_config.py公共配置模块经验丰富之后你不会在每个脚本里重复写字体配置而是会把它抽成一个公共模块。比如项目中新建mpl_config.py# mpl_config.py import platform import matplotlib.pyplot as plt def setup_chinese_font(): system platform.system() font_candidates { Windows: [Microsoft YaHei, SimHei], Darwin: [PingFang SC, Heiti SC], Linux: [Noto Sans CJK SC, WenQuanYi Zen Hei, SimHei] } plt.rcParams[font.sans-serif] font_candidates.get(system, [SimHei]) plt.rcParams[axes.unicode_minus] False然后在绘图脚本中调用from mpl_config import setup_chinese_font setup_chinese_font()这样新同事接手项目时不需要去看冗长的配置代码只需要调用一个函数就能保证所有图表不出现中文乱码。在团队协作中这种方式能极大减少“在哪儿配置字体”的沟通成本。7.2 在绘图函数中使用字体参数复用如果你的项目中有大量相似图表可以统一使用自定义绘图函数把字体配置封装进去def create_figure(title, x, y, xlabel, ylabel): setup_chinese_font() fig, ax plt.subplots() ax.plot(x, y) ax.set_title(title) ax.set_xlabel(xlabel) ax.set_ylabel(ylabel) return fig, ax这样既保证了字体风格统一也便于后续统一调整样式。真正把“解决乱码”这一步从每次画图前的重复劳动变成了一次性的系统工程。8. 结合热搜词补充雷达图、散点图与图例中的中文细节8.1 雷达图中的中文标签处理雷达图常用于展示多维数据比如团队能力评估、产品维度分析。我在画雷达图时就遇到过中文标签重叠和乱码叠加的问题。乱码部分还是老办法全局设置字体即可。但要注意雷达图的刻度标签和角度标签都很多建议把字体调小一点plt.rcParams.update({ font.size: 10, font.sans-serif: [SimHei] })同时用polarTrue创建极坐标子图时需要自己设置角度标签ax.set_xticks(np.linspace(0, 2*np.pi, len(labels), endpointFalse)) ax.set_xticklabels(labels)这里labels就是中文列表只要字体设对渲染完全正常。8.2 散点图透明度与网格中的中文散点图的中文乱码主要体现在图例或数据标签上。比如标注特定点可以用annotateplt.annotate(异常点, xy(x, y), fontpropertiesprop)或者用ax.text。如果还想显示上标下标比如“温度(℃)”里面的 ℃就需要确保字体包含该符号。微软雅黑和思源黑体都支持。网格线的中文则很少涉及但在图例中会有一个坑直接设置label中文标签后如果还乱码可以单独重设图例字体leg ax.legend() for text in leg.get_texts(): text.set_fontname(SimHei)这种方法适合特殊情况下图例文字和全局字体不相同时候强制覆盖。9. 踩坑实录与个人心得9.1 那次我在服务器上折腾了两小时有一次我把本地跑得好好的数据脚本迁移到一台干净的 CentOS 服务器画图时全是方框。当时第一反应是安装中文字体于是登录 root 执行yum install -y fontconfig然后手动下载simhei.ttf放到/usr/share/fonts/fc-cache -fv刷新后fc-list已经能看到 SimHei 了但用 Python 运行时仍然报findfont: Font family SimHei not found。最后才发现CentOS 上的 matplotlib 是通过pip安装在虚拟环境里的它没有读取系统的字体目录而是依赖自己的字体缓存路径。我执行了rm -rf /root/.cache/matplotlib后重新运行它重新扫描到了系统字体问题才真正解决。所以清缓存这个操作比装字体还重要。9.2 不要盲目复制网上的代码先跑通最小案例网上 90% 的教程会给你这段代码plt.rcParams[font.sans-serif] [SimHei]但是在 Mac 上SimHei 根本不存在所以复制过来照样乱码。我的建议是任何新环境先执行一个最小复现脚本import matplotlib.pyplot as plt plt.rcParams[font.sans-serif] [SimHei, Microsoft YaHei, PingFang SC] plt.rcParams[axes.unicode_minus] False plt.title(中文测试) plt.show()如果显示正常再往大项目里移植如果不正常根据警告信息查问题这样定位效率极高。盲目改代码只会让自己越改越乱。9.3 利用font_manager自定义回退顺序优化体验我还会直接创建一个回退字典把不同字体的优先级拆分plt.rcParams[font.sans-serif] [ PingFang SC, Microsoft YaHei, SimHei, Noto Sans CJK SC, WenQuanYi Zen Hei ]这样在 Mac 上用苹方Windows 上用微软雅黑Linux 上用 Noto在不同系统上都有不错的显示效果。设置完成后再调用一次检测函数from matplotlib import font_manager available {f.name for f in font_manager.fontManager.ttflist} print([f for f in plt.rcParams[font.sans-serif] if f in available])如果打印出来一个或几个可用字体说明回退机制能正常工作。这一招很实用尤其适合你写了平台自动切换逻辑的时候。9.4 最后分享一个小技巧如果图形上有需要手动标注的中文文本可以用ax.annotate时单独指定fontproperties但更省事的是在rcParams中设置默认字号和字体然后依赖默认值。我在团队里常常把字体配置和绘图风格一起封装例如import matplotlib.pyplot as plt plt.rcParams.update({ font.family: sans-serif, font.sans-serif: [Noto Sans CJK SC, Microsoft YaHei], axes.unicode_minus: False, figure.dpi: 120, savefig.dpi: 300, })这样一来所有图形默认就是高清、中文正常、负号正常。关键是把这些配置写在一个独立的配置文件里其他脚本直接import而不是复制粘贴。10. 扩展从乱码到图表美观还有这些细节值得做中文不再乱码只是第一步接下来很多刚入门的朋友会遇到字体大小、标签重叠、图例遮挡等问题这些虽然不是“乱码”但和字体设置息息相关。既然你已经把rcParams握在手里不如顺手把图表美观性一起提升。调整全局字号plt.rcParams.update({ font.size: 12, axes.titlesize: 16, axes.labelsize: 13, xtick.labelsize: 11, ytick.labelsize: 11, legend.fontsize: 10, })这个配置比每次单独设置fontsize高效得多。再配合tight_layout()或bbox_inchestight中文标签基本不会因为边界裁剪而消失。另外很多人会遇到保存的 PDF 中文字符变窄的问题这是因为 PDF 引擎只嵌入字体子集但 matplotlib 通常能正常嵌入。如果担心可以选择保存为ps或直接通过矢量图工具二次转换。我的实践是向期刊投稿时使用 600 DPI 的 TIFF或者 EPS但 EPS 对中文字体兼容性略差所以还是以 PDF 优先。从日常使用场景来说如果你是学生交作业、工程师做调试其实只要学会全局rcParams设置就足够应付 95% 的场景。剩下 5% 的奇葩环境多看终端警告多清缓存多动态加载 TTF也基本能解决。我先讲到这里后面如果你们在实际操作中遇到更奇怪的乱码情况欢迎按本文的排查思路一步步走一遍大概率都能自己解决。