尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

解决Matplotlib中文显示问题的5种方法

解决Matplotlib中文显示问题的5种方法 1. 问题现象与背景分析第一次用matplotlib画图时发现所有中文都变成了方框或者乱码这应该是每个Python数据可视化开发者都会遇到的经典问题。我在2016年第一次接触matplotlib时就踩过这个坑当时花了两天才找到解决方案。这个问题的根源在于matplotlib默认使用的字体DejaVu Sans不支持中文显示。当系统检测到需要渲染中文字符时如果字体库中没有对应的字形就会用方框替代。这就像你给一个只会英语的人看中文报纸他只能看到一堆□□□。注意这个问题不仅出现在图表标题和标签上在使用plt.text()或ax.annotate()添加注释文本时同样会遇到中文显示异常。2. 解决方案全景图经过多年实践我总结出5种可靠的解决方案按推荐程度排序指定系统已有中文字体最推荐使用SimHei等Windows通用字体下载第三方中文字体修改matplotlib配置文件临时设置字体适合快速测试下面我会详细介绍每种方法的操作步骤和适用场景。2.1 方法一指定系统已有中文字体最佳实践这是我最推荐的方式既不需要安装新字体也不会影响其他程序的显示效果。核心思路是告诉matplotlib使用系统中已经安装的中文字体。import matplotlib.pyplot as plt import matplotlib as mpl # 设置字体为系统已有的中文字体以微软雅黑为例 plt.rcParams[font.sans-serif] [Microsoft YaHei] # 指定默认字体 plt.rcParams[axes.unicode_minus] False # 解决负号显示问题 # 测试绘图 plt.plot([1, 2, 3], [4, 5, 6]) plt.title(中文标题测试) plt.xlabel(X轴标签) plt.ylabel(Y轴标签) plt.show()关键点解析Microsoft YaHei是Windows系统自带的优质中文字体axes.unicode_minus解决负号显示为方框的问题这种方法不会修改系统配置只影响当前Python环境如何查找系统可用字体from matplotlib.font_manager import fontManager print([f.name for f in fontManager.ttflist if Hei in f.name or Song in f.name])2.2 方法二使用SimHei等通用字体如果不知道系统有哪些中文字体可以使用跨平台的SimHei字体plt.rcParams[font.sans-serif] [SimHei] plt.rcParams[axes.unicode_minus] False优缺点分析优点简单直接不需要知道具体字体名称缺点SimHei显示效果较粗糙不适合高质量出版2.3 方法三下载安装第三方字体对于需要特定字体风格的场景如学术出版可以下载专业字体下载思源黑体开源免费https://github.com/adobe-fonts/source-han-sans将.ttf文件放入matplotlib字体目录import matplotlib print(matplotlib.matplotlib_fname()) # 显示配置文件路径 print(matplotlib.get_cachedir()) # 显示缓存目录删除缓存文件rm -rf ~/.cache/matplotlib/*在代码中指定新字体plt.rcParams[font.sans-serif] [Source Han Sans CN]2.4 方法四修改配置文件长期解决方案找到matplotlib配置文件import matplotlib print(matplotlib.matplotlib_fname())打开该文件修改以下配置font.family: sans-serif font.sans-serif: Microsoft YaHei, SimHei, Source Han Sans CN, DejaVu Sans axes.unicode_minus: False2.5 方法五临时字体设置快速测试如果只是临时测试可以使用字体属性直接设置plt.title(中文标题, fontpropertiesMicrosoft YaHei)3. 进阶技巧与疑难解答3.1 同时显示中文和特殊符号当图表需要混合显示中文和数学符号时推荐以下配置plt.rcParams[font.sans-serif] [Microsoft YaHei] plt.rcParams[mathtext.fontset] stix # 数学字体设置3.2 Jupyter Notebook中的特殊处理在Notebook中可能需要额外设置%matplotlib inline plt.rcParams[figure.dpi] 150 # 提高显示分辨率3.3 常见错误排查问题1设置了字体但依然显示方框检查字体名称是否拼写正确尝试重启Python内核删除matplotlib缓存文件问题2出现警告findfont: Font family [xxx] not found使用fc-list :langzh命令(Linux)检查字体是否安装确保字体名称与系统记录一致问题3保存的PDF中中文消失确保使用支持嵌入字体的后端plt.savefig(output.pdf, bbox_inchestight, dpi300, backendpgf)4. 字体选择建议根据使用场景推荐不同字体场景推荐字体特点日常分析微软雅黑清晰易读学术出版思源宋体正式规范网页展示苹方/PingFang现代简洁代码注释等宽中文字体对齐整齐5. 其他相关技巧5.1 在annotate中使用中文ax.annotate(中文注释, xy(2, 5), xytext(3, 6), arrowpropsdict(facecolorblack), fontpropertiesMicrosoft YaHei)5.2 双Y轴图表的中文设置使用twinx()时需要分别设置两个轴的标签字体fig, ax1 plt.subplots() ax2 ax1.twinx() ax1.set_ylabel(左侧Y轴, fontpropertiesMicrosoft YaHei) ax2.set_ylabel(右侧Y轴, fontpropertiesMicrosoft YaHei)5.3 多子图的中文标题fig, axes plt.subplots(2, 2) for ax in axes.flat: ax.set_title(子图标题, fontpropertiesMicrosoft YaHei)我在实际项目中发现中文显示问题最容易出现在团队协作时因为不同开发环境的字体配置可能不同。建议在项目README中明确注明使用的中文字体或者将字体文件随项目一起分发。一个实用的技巧是创建字体设置工具函数def set_chinese_font(fontMicrosoft YaHei): plt.rcParams[font.sans-serif] [font] plt.rcParams[axes.unicode_minus] False这样在任何脚本开头调用一次即可确保中文正常显示同时也方便统一修改字体风格。
返回列表