当前位置: 首页 > news >正文

Python matplotlib 画图中文显示方框怎么修复?

Python matplotlib 画图中文显示方框怎么修复?


问题分析


在 Python 里用 matplotlib 画图时,中文标题或坐标轴标签显示成方框(□□□),通常是因为默认字体(如 DejaVu Sans)不包含中文字形。课程作业、实验报告、数据可视化项目里都很常见。


本质就一件事:让 matplotlib 使用你系统里已有的中文字体,并顺手处理负号显示。


建议优先试方法一(改两行rcParams即可);只有系统里确实没有中文字体时,再用方法二下载开源字体。


排查步骤


1.确认系统是否有中文字体

- Windows:看C:/Windows/Fonts/是否有simhei.ttf(黑体)或msyh.ttc(微软雅黑)

- macOS:看/System/Library/Fonts//Library/Fonts/

- Linux:运行fc-list :lang=zh查看已安装的中文字体


2.确认 matplotlib 能否识别该字体



import matplotlib.font_manager as fm fonts = [f.name for f in fm.fontManager.ttflist if 'SimHei' in f.name or 'Microsoft YaHei' in f.name] print(fonts)


若输出为空,说明当前环境字体列表里没有这些字体,需要安装字体或走方法二。


3.检查代码是否同时设置了字体和负号

只写font.sans-serif而不写axes.unicode_minus = False,中文可能正常但负号仍显示异常。


示例代码


方法一:使用系统自带字体(Windows / macOS 优先试这个)


import matplotlib.pyplot as plt # Windows 常用 SimHei 或 Microsoft YaHei plt.rcParams['font.sans-serif'] = ['SimHei'] # 或 ['Microsoft YaHei'] plt.rcParams['axes.unicode_minus'] = False # 负号正常显示 x = [1, 2, 3, 4] y = [10, 20, 15, 25] plt.plot(x, y, marker='o') plt.title('中文标题测试') plt.xlabel('横轴(单位)') plt.ylabel('纵轴(数值)') plt.show()


方法二:安装开源中文字体(Linux 或系统无中文字体时)


思源黑体免费开源。下载后注册到 matplotlib:


import matplotlib.pyplot as plt import matplotlib.font_manager as fm import urllib.request import os font_url = ( 'https://github.com/adobe-fonts/source-han-sans/raw/release/OTF/' 'SimplifiedChinese/SourceHanSansSC-Regular.otf' ) font_path = 'SourceHanSansSC-Regular.otf' if not os.path.exists(font_path): urllib.request.urlretrieve(font_url, font_path) fm.fontManager.addfont(font_path) font_prop = fm.FontProperties(fname=font_path) plt.rcParams['font.family'] = font_prop.get_name() plt.rcParams['axes.unicode_minus'] = False plt.plot([1, 2, 3], [4, 5, 6]) plt.title('中文标题', fontproperties=font_prop) plt.xlabel('横轴', fontproperties=font_prop) plt.ylabel('纵轴', fontproperties=font_prop) plt.show()


若 GitHub 下载慢,可手动下载字体文件放到脚本同目录,再运行上面代码。


运行说明


1.环境:Python 3.6+,pip install matplotlib

2.改完字体仍显示方框:清除 matplotlib 字体缓存后重启 Python:



import matplotlib print(matplotlib.get_cachedir()) # 删除该目录下 fontlist-*.json,再重新运行绘图代码


3.验证:图表标题、坐标轴中文应正常显示,不再是方框。


常见坑


1.字体名写错

- 正确:'SimHei''Microsoft YaHei'

- 错误:'simhei'(大小写敏感)、直接写'宋体'(应使用字体注册名)


2.未清缓存

修改rcParams后仍用旧缓存。删~/.matplotlib/fontlist-*.json并重启解释器。


3.Linux 缺字体



sudo apt-get install fonts-wqy-zenhei




plt.rcParams['font.sans-serif'] = ['WenQuanYi Zen Hei'] plt.rcParams['axes.unicode_minus'] = False


4.Jupyter Notebook 不生效

先执行:



%matplotlib inline import matplotlib.pyplot as plt plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False


5.负号变方块

补上plt.rcParams['axes.unicode_minus'] = False




按上面步骤仍显示方框,可以把操作系统、matplotlib 版本、完整报错或截图发评论区,我帮你看。

http://www.jsqmd.com/news/1178954/

相关文章:

  • 沙坪坝区奢侈品包包回收防坑指南:磁器口、陈家桥、大学城商圈实测参考 - 诚鑫名品
  • Java单元测试实战:JUnit 5核心用法与Mockito集成指南
  • MA12070音频放大器与TM4C129X微控制器的高保真音频系统设计
  • C++实现PDF文件结构解析:从二进制格式到文本提取的底层实践
  • [c++]变量声明与定义的规则详解
  • C++ Lambda 底层实现对比:无捕获 vs 捕获场景下的 2 种编译器生成策略
  • 浪琴中国官方售后服务中心|地址与官方电话权威信息公示(2026年7月更新) - 浪琴服务中心
  • 沃锐智能:常州市评价优选缠绕包装机直销方案解析,有实力的缠绕包装机厂家 - 品牌推荐师
  • Unity Shader兼容性实战:解决Mochies-Unity-Shaders常见问题与优化
  • 工业负载控制方案:智能高边开关与ARM MCU应用
  • Android Native层Hook实战:Frida逆向分析sig3签名算法
  • 哈夫曼编码C++实现:从原理到文件压缩实战
  • Unity宏定义实战指南:跨平台开发与调试的核心利器
  • TLA2518与PIC18F24K50构建高精度数据采集系统
  • LTC1864与PIC18F86J50构建高精度ADC系统设计
  • RISC-V MCU 调试实战:3种主流IDE(MRS、VS Code、Nuclei Studio)配置与效率对比
  • ZLToolKit CMD模块实战:3步实现类Linux命令行工具,支持10+选项解析
  • BQ25887与STM32F437ZG锂电池主动均衡方案详解
  • C++内存管理与并发编程深度优化:从RAII到无锁数据结构实战
  • C++ Qt设计模式实战:提升桌面应用架构与代码质量
  • Unity DOTS中Entity Command Buffer的5大核心陷阱与最佳实践
  • 欧米茄官方售后服务中心电话与详细地址实地考察报告+多信源验证(2026年7月更新) - 欧米茄服务中心
  • 蓝牙5.4音频模块开发实战:低功耗LC3编码与射频设计
  • 快消供应链企业专用静态官网模板,含首页/服务/案例/关于我们/系统能力五页
  • AI音乐生成实战:从零掌握SeedMusic精准指令与创作流程
  • 微信投票如何发起(群/小程序/公众号全流程):2026西瓜评选实测 - 投票小程序
  • 高压安全隔离系统设计与ISOM8710+PIC18LF27J53应用
  • L9958与PIC24FV16KA302电机控制方案详解
  • AI Agent安全攻防实战:从工具调用到RCE漏洞的深度解析
  • TMC7300驱动与MK24FN256VDC12在直流电机控制中的应用