Python matplotlib设置中文不乱码:字体配置全方案
Python matplotlib画图中文变方块?这篇给出Windows/Mac/Linux三种系统的中文字体配置方案,含SimHei、Microsoft YaHei、Noto Sans CJK的设置代码。
场景痛点
刚用matplotlib画图的人几乎都踩过同一个坑:标题、标签写的中文,跑出来图里全是方框乱码。Excel里好好的中文,到了Python就变豆腐块。根因是matplotlib默认字体不支持中文,需要手动指定一个系统里已安装的中文字体。这篇把三种系统的配置方法一次讲清。
用到的库
pip install matplotlib
完整代码
# 导入matplotlib并配置中文字体
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
# ===== 核心三行配置 =====
# 1. 指定中文字体,按系统任选一个存在的
matplotlib.rcParams["font.sans-serif"] = [
"Microsoft YaHei", # Windows 推荐
"SimHei", # Windows 备选
"PingFang SC", # Mac 推荐
"Arial Unicode MS", # Mac 备选
"Noto Sans CJK SC", # Linux 推荐
]
# 2. 解决负号显示为方块的问题
matplotlib.rcParams["axes.unicode_minus"] = False
def check_available_fonts():
# 打印系统中所有可用字体,确认中文字体是否安装
from matplotlib.font_manager import fontManager
cn_keywords = ["hei", "song", "kai", "ming", "cjk", "yahei", "noto"]
print("系统中可能可用的中文字体:")
for f in fontManager.ttflist:
name = f.name.lower()
if any(k in name for k in cn_keywords):
print(" -", f.name)
def draw_demo():
plt.figure(figsize=(8, 5))
categories = ["一月", "二月", "三月", "四月"]
values = [200, 350, 280, 420]
plt.bar(categories, values, color="#4C72B0")
plt.title("中文显示测试:月度数据对比", fontsize=16)
plt.xlabel("月份", fontsize=12)
plt.ylabel("数值", fontsize=12)
plt.tight_layout()
plt.savefig("font_demo.png", dpi=150)
plt.close()
print("测试图已保存为 font_demo.png")
if __name__ == "__main__":
check_available_fonts()
draw_demo()
代码讲解
rcParams["font.sans-serif"]是一个字体列表,matplotlib会按顺序找第一个能用的字体,所以把Windows、Mac、Linux常见中文字体都列上,跨平台跑都不会乱码。rcParams["axes.unicode_minus"] = False这行经常被忽略:不设这个,中文虽然能显示了,但坐标轴上的负号-又会变成方块。check_available_fonts()函数帮你扫描系统里实际装了哪些字体,如果打印出来一个都没有,说明系统没装中文字体,得先装。- 配置要在
plt绘图之前执行,放在import之后、任何plt.figure()之前。
运行结果
运行后终端打印系统中可用的中文字体名称列表,同时生成 font_demo.png。打开图片,如果标题和坐标轴上的中文正常显示、负号正常,说明配置成功;如果还是方框,按终端打印的字体名替换 font.sans-serif 列表里的内容。
注意事项
- Windows:自带微软雅黑和黑体,直接用
"Microsoft YaHei"或"SimHei"。 - Mac:自带
"PingFang SC"或"Arial Unicode MS"。 - Linux:默认不带中文字体,需要先
sudo apt install fonts-noto-cjk(Ubuntu),然后用"Noto Sans CJK SC"。 - 如果换了字体列表还是乱码,删掉 matplotlib 字体缓存目录
~/.cache/matplotlib再重新运行。 - 不建议用
plt.rcParams写成局部变量,要全局配置,否则画子图时某些子图又会乱码。

更新时间:2026-09-14 20:32:15
上一篇:Python matplotlib画双Y轴图:柱状图折线图同轴对比