matplotlib 中文显示异常的修复方法

news/2025/11/12 9:47:08/文章来源:https://www.cnblogs.com/flyingsir/p/19212521

这个问题很常见

问题原因

1. 字体缓存污染

matplotlib 在第一次运行时创建字体缓存,如果之前有错误的字体配置或损坏的缓存,会导致后续所有绘图都使用错误的字体设置。

2. 缓存不更新

即使你后来添加了正确的中文字体,matplotlib 可能仍然使用旧的缓存文件,不会自动检测新字体。

3. 环境配置冲突

在 Jupyter/云平台环境中,多个用户或会话可能共享或冲突的缓存配置。

以后注意事项

1. 字体设置最佳实践

import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
import osdef safe_chinese_plot():"""安全的中文绘图函数"""# 方法1:先尝试系统字体plt.rcParams['font.sans-serif'] = ['WenQuanYi Micro Hei', 'DejaVu Sans', 'Arial']plt.rcParams['axes.unicode_minus'] = False# 如果系统字体不行,使用自定义字体font_path = './simsun.ttc'if os.path.exists(font_path):font_prop = fm.FontProperties(fname=font_path)# 使用 fontproperties 参数plt.title('标题', fontproperties=font_prop)plt.xlabel('X轴', fontproperties=font_prop)else:plt.title('标题')plt.xlabel('X轴')

2. 项目初始化脚本

# init_plot.py - 每个项目开始前运行
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
import osdef init_chinese_font():"""初始化中文字体设置"""# 清除可能的缓存问题cache_dir = os.path.join(os.path.expanduser('~'), '.cache', 'matplotlib')if os.path.exists(cache_dir):import shutilshutil.rmtree(cache_dir)print("已清除matplotlib缓存")# 重新加载字体管理器fm._load_fontmanager(try_read_cache=False)# 设置字体font_path = './simsun.ttc'if os.path.exists(font_path):# 添加自定义字体fe = fm.FontEntry(fname=font_path, name='MySimSun')fm.fontManager.ttflist.insert(0, fe)plt.rcParams['font.family'] = ['MySimSun', 'WenQuanYi Micro Hei']else:plt.rcParams['font.sans-serif'] = ['WenQuanYi Micro Hei', 'DejaVu Sans']plt.rcParams['axes.unicode_minus'] = Falseprint("中文字体初始化完成")# 在项目开始时调用
init_chinese_font()

3. 环境检查脚本

def check_font_environment():"""检查字体环境"""import matplotlib.font_manager as fmimport osprint("=== 字体环境检查 ===")# 检查缓存目录cache_dir = os.path.join(os.path.expanduser('~'), '.cache', 'matplotlib')print(f"缓存目录: {cache_dir}")print(f"缓存存在: {os.path.exists(cache_dir)}")# 检查可用中文字体chinese_fonts = []for font in fm.fontManager.ttflist:font_name = font.name.lower()if any(keyword in font_name for keyword in ['chinese', 'song', 'hei', 'kai', 'micro', 'wenquan']):chinese_fonts.append(font.name)print(f"可用中文字体: {list(set(chinese_fonts))}")# 检查自定义字体custom_font = './simsun.ttc'print(f"自定义字体存在: {os.path.exists(custom_font)}")return len(chinese_fonts) > 0# 在绘图前运行检查
if check_font_environment():print("字体环境正常")
else:print("警告: 字体环境可能有问题")

4. 可靠的绘图模板

import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
import osclass ChinesePlot:def __init__(self, font_path='./simsun.ttc'):self.font_path = font_pathself.font_prop = Noneif os.path.exists(font_path):self.font_prop = fm.FontProperties(fname=font_path)def safe_text(self, text, **kwargs):"""安全地添加中文文本"""if self.font_prop:kwargs['fontproperties'] = self.font_propreturn kwargsdef plot(self):"""示例绘图方法"""plt.figure(figsize=(10, 6))# 安全设置标题和标签plt.title('中文标题', **self.safe_text('中文标题', fontsize=16))plt.xlabel('X轴标签', **self.safe_text('X轴标签', fontsize=14))plt.ylabel('Y轴标签', **self.safe_text('Y轴标签', fontsize=14))plt.text(0.5, 0.5, '中文文本', **self.safe_text('中文文本', fontsize=12, ha='center'))plt.grid(True)plt.show()# 使用
plotter = ChinesePlot()
plotter.plot()

5. 常见预防措施

  1. 在Docker/云环境中:在容器启动时清除字体缓存
  2. 在CI/CD中:在流水线中添加字体缓存清理步骤
  3. 团队项目中:共享字体初始化脚本
  4. 版本控制:将字体文件和初始化脚本纳入版本管理

6. 快速修复命令

# 当遇到中文乱码时,快速执行这个单元格
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
import os
import shutil# 清除缓存
cache_dir = os.path.join(os.path.expanduser('~'), '.cache', 'matplotlib')
if os.path.exists(cache_dir):shutil.rmtree(cache_dir)# 重新加载
fm._load_fontmanager(try_read_cache=False)
plt.rcParams.update({'font.sans-serif': ['WenQuanYi Micro Hei']})
print("字体缓存已重置")

总结:matplotlib 字体缓存是个常见坑点,在云平台、容器等环境中尤其要注意。建议在每个项目开始前都运行字体初始化检查。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/963035.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

P2490 [SDOI2011] 黑白棋 笔记

前置知识:K-Nim 游戏。 由于白棋和黑棋交错放并且只能向中间走,相邻的两个白黑棋中间的格子数即可看作一堆石子。 问题转换为:有 \(N=n-k\) 个完全相同的物品,\(M=\frac k 2\) 个不同的盒子,把若干个物品放进盒子…

深入解析:OpenAI推出即时支付功能,ChatGPT将整合电商能力|技术解析与行业影响

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025年卧式数控车床优质厂家推荐排行榜单

2025年卧式数控车床优质厂家推荐排行榜单前言随着制造业的快速发展,卧式数控车床作为精密加工的核心设备,其性能和质量直接影响着生产效率和产品质量。为帮助广大用户选择合适的设备供应商,我们特别整理了2025年度卧…

【machine learning】COVID-19 daily cases prediction - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

【开题答辩全过程】以 北京房屋租赁数据分析与可视化为例,包含答辩的问题和答案 - 教程

【开题答辩全过程】以 北京房屋租赁数据分析与可视化为例,包含答辩的问题和答案 - 教程2025-11-12 09:32 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important;…

phpMyAdmin Docker 容器化部署指南

phpMyAdmin是一款用PHP编写的免费开源工具,旨在通过Web界面管理MySQL和MariaDB数据库。它支持数据库管理、表操作、用户权限配置等多种功能,同时提供SQL语句直接执行能力,是Web开发者和数据库管理员的常用工具。概述…

2025年11月5日一星期

1..NET Framework 项目和.net core项目区分:.net frame是windows单独,.net core是跨平台2.查看服务器磁盘空间df -h,这里h指自动换算单位 [root@MiWiFi-RA70-srv backup]# df -h文件系统 大小 已…

高精度乘法模板(p1303)

P1303 A*B Problem 题目背景 高精度乘法模板题。 题目描述 给出两个非负整数,求它们的乘积。 输入格式 输入共两行,每行一个非负整数。 输出格式 输出一个非负整数表示乘积。 输入输出样例 #1 输入 #1 1 2输出 #1 2…

2025年云桌面软件排名

2025年云桌面软件排名:拓实科技领跑企业数字化转型随着企业数字化转型的深入推进,云桌面软件已成为现代企业IT基础设施的重要组成部分。作为深耕企业信息化建设23年的专业服务商,拓实科技凭借其卓越的技术实力和丰富…

2025年11月EGUOO京东自营:800万瓶纳豆激酶销量见证用户信赖

开场白 “我想给家里长辈买关节片,又怕海淘等太久,有没有正品保障还能次日达的选择?”这是京东健康频道后台出现频率极高的提问。消费者的核心痛点集中在“是否正品、是否快速、是否适合父母长期吃”三件事上。EGUO…

2025年高速高压旋转接头权威推荐榜单:导热油旋转接头/液压多通路旋转接头/高速旋转接头源头厂家精选

在工业流体传输领域,一台性能卓越的高速高压旋转接头是确保设备连续稳定运行的关键部件。 根据行业数据显示,2024年全球旋转接头市场规模已达数十亿元,预计到2028年将继续保持稳定增长态势。其中高速高压旋转接头在…

传统油烟机智能化升级之雷达手势感应唤醒控制方案

传统的油烟机需要通过按键触摸开机或者语音控制开机,按键控制在炒菜的时候不是很方便,而语音控制在高档位噪音大时容易受到油烟机的噪音影响,现在新的控制方式在市场上悄然出现,那就是通过雷达模块做到感应唤醒和手…

sqlserver 允许字母、数字、汉字 额外允许字符

现在这个函数可以准确判断字符串是否只包含:字母(A-Z, a-z)数字(0-9)汉字(包括基本汉字和扩展区)斜杠字符(/) CREATE FUNCTION dbo.CheckValidCharactersEx( @inputString NVARCHAR(MAX), @extraChars…

博弈论 笔记

挖坑待补。 \(\mathbf{N}\) 态:当前手胜利的局面。 \(\mathbf{P}\) 态:当前手失败的局面。 K-Nim 游戏 描述 有 \(n\) 堆石子,先手和后手轮流取,每次选择 \(1\sim k\) 堆,每堆取走至少一个,不能操作者败。 解法设…

2025年免清洗锡膏定制厂家口碑排行榜单

2025年免清洗锡膏定制厂家口碑排行榜单随着电子制造业的快速发展,免清洗锡膏作为环保高效的焊接材料,在电子封装领域的需求持续增长。以下是2025年免清洗锡膏定制厂家的口碑排行榜单,供您参考选择。口碑排行榜单1. …

《C++ Stack 与 Queue 完全使用指南:基础操作 + 经典场景 + 实战习题》 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025年无骨架类变压器工厂口碑推荐榜

2025年无骨架类变压器工厂口碑推荐榜推荐首选:【博多电子】作为磁性器件领域的领军企业,【博多电子】在无骨架类变压器制造方面展现出卓越实力,是2025年业内首选的优质供应商。核心优势技术实力雄厚 国家级高新技术…

2025年数字展厅设计软件口碑推荐榜单

2025年数字展厅设计软件口碑推荐榜单随着数字技术的快速发展,数字展厅设计软件已成为企业展示、文化传播的重要工具。在众多软件中,[方和]数字科技凭借其卓越的技术实力和丰富的项目经验,在行业内树立了良好口碑。以…

完整教程:【Kafka】架构原理、消息丢失、重复消费、顺序消费、事务消息

完整教程:【Kafka】架构原理、消息丢失、重复消费、顺序消费、事务消息pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: …