我的知识记录

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 写成局部变量,要全局配置,否则画子图时某些子图又会乱码。

Python matplotlib设置中文不乱码:字体配置全方案

标签:

更新时间:2026-09-14 20:32:15

上一篇:Python matplotlib画双Y轴图:柱状图折线图同轴对比

下一篇:Python matplotlib画柱状图:分组对比柱状图实例