使用matplotlib绘图时中文显示为方框的解决方案

  大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的知识进行总结与归纳,不仅形成深入且独到的理解,而且能够帮助新手快速入门。

  本文主要介绍了使用matplotlib绘图时中文显示为方框的解决方案,希望能对使用matplotlib的同学们有所帮助。

1. 问题描述

  今天在Linux服务器上运行matplotlib相关代码时,却出现了中文显示为方框的情况,具体信息如下图所示:

在这里插入图片描述

  在经过了亲身的实践后,终于找到了解决问题的方案,最终将逐步的操作过程总结如下。希望能对遇到同样bug的同学们有所帮助。

在这里插入图片描述
在这里插入图片描述
  在开始正文之前,我想对关注本专栏的朋友们说几句。技术写作是一场孤独的修行,但读者的反馈是我持续输出的最大动力。本专栏的文章,都是我基于实际项目经验,剥离了繁杂的业务逻辑,提炼出的核心技术内容。我希望通过文字的复现,不仅带大家跑通代码,更重要的是养成一种“从问题出发,寻找最优解”的工程思维。

2.

使用 `matplotlib` 绘图时,如果图表中的中文显示为**方框、问号或乱码**,这是因为 `matplotlib` 默认使用的字体不支持中文。 --- ### ✅ 问题原因 `matplotlib` 内置的默认字体(如 `DejaVu Sans`)**不包含中文字形**,因此无法渲染中文字符。 --- ### ✅ 解决方案:设置支持中文的字体 我们可以通过修改 `matplotlib` 的 `rcParams` 来指定一个支持中文的字体,例如: - **Windows**: `SimHei`(黑体) - **macOS**: `PingFang SC`、`Heiti SC` - **Linux**: `WenQuanYi Micro Hei`(文泉驿微米黑) 下面提供几种通用且有效的解决方法。 --- ### ✅ 方法 1:全局设置中文字体(推荐) ```python import matplotlib.pyplot as plt # 设置中文字体和解决负号显示问题 plt.rcParams['font.sans-serif'] = ['SimHei', 'Arial Unicode MS', 'WenQuanYi Micro Hei'] # 尝试多种中文字体 plt.rcParams['axes.unicode_minus'] = False # 解决负号 '-' 显示为方块的问题 # 示例绘图 plt.plot([1, 2, 3], [4, 5, 6]) plt.title("中文标题测试") plt.xlabel("X轴标签") plt.ylabel("Y轴标签") plt.show() ``` > ✅ `plt.rcParams['axes.unicode_minus'] = False` 非常重要!否则负号会变成方框。 --- ### ✅ 方法 2:手动指定具体字体路径(精确控制) 如果你知道系统中某个中文字体文件的位置(如 `.ttf` 文件),可以手动加载: ```python import matplotlib.pyplot as plt import matplotlib.font_manager as fm # 指定字体文件路径(以 Windows 为例) font_path = "C:/Windows/Fonts/simhei.ttf" # 黑体 zh_font = fm.FontProperties(fname=font_path) # 绘图使用该字体 plt.plot([1, 2, 3], [4, 5, 6]) plt.title("中文标题", fontproperties=zh_font) plt.xlabel("X轴", fontproperties=zh_font) plt.ylabel("Y轴", fontproperties=zh_font) plt.show() ``` > 💡 可通过以下代码查看所有可用字体: > > ```python > import matplotlib.font_manager as fm > for f in fm.findSystemFonts(): > print(fm.FontProperties(fname=f).get_name()) > ``` --- ### ✅ 方法 3:添加自定义字体(高级用法) 你也可以将一个中文字体文件(如 `NotoSansCJK-Regular.ttc`)复制到项目目录,并注册: ```python import matplotlib.font_manager as fm import matplotlib.pyplot as plt # 注册字体 font_path = "./NotoSansCJK-Regular.ttc" # 下载后放入当前目录 fm.fontManager.addfont(font_path) prop = fm.FontProperties(fname=font_path) # 设置为默认字体 plt.rcParams['font.family'] = prop.get_name() plt.rcParams['axes.unicode_minus'] = False # 测试 plt.plot([1,2,3], [1,4,9]) plt.title("这是Noto字体渲染的中文") plt.show() ``` > ⬇️ 下载推荐字体: > - [Google Noto CJK](https://www.google.com/get/noto/)(免费可商用) > - 或从系统导出 `simhei.ttf` --- ### ✅ 各平台常用中文字体对照表 | 平台 | 中文字体名(英文) | 对应中文风格 | |--------|--------------------------|-------------| | Windows | `SimHei` | 黑体 | | | `Microsoft YaHei` | 微软雅黑 | | | `KaiTi` | 楷体 | | macOS | `PingFang SC` | 苹方 | | | `Heiti SC` | 黑体-简 | | Linux | `WenQuanYi Micro Hei` | 文泉驿微米黑 | 你可以写一个跨平台兼容的配置: ```python import platform import matplotlib.pyplot as plt system = platform.system() if system == "Windows": plt.rcParams['font.sans-serif'] = ['SimHei'] elif system == "Darwin": # macOS plt.rcParams['font.sans-serif'] = ['PingFang SC', 'Heiti SC'] else: # Linux plt.rcParams['font.sans-serif'] = ['WenQuanYi Micro Hei'] plt.rcParams['axes.unicode_minus'] = False ``` --- ### ✅ 验证是否成功 运行以下代码测试中文是否正常显示: ```python import matplotlib.pyplot as plt plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False plt.figure(figsize=(6, 3)) plt.text(0.5, 0.5, '中文显示正常!✅', fontsize=20, ha='center', va='center') plt.axis('off') plt.show() ``` 如果看到“中文显示正常!✅”,说明已解决。 ---
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱编程的喵喵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值