使用seaborn进行图形绘制并保存的过程中,遇到保存后的图像“tittle“无法显示中文的情况

🧐问题发现

在下述代码中,最后保存的图表,其"tittle"的中文无法正常显示

python 复制代码
# 1. 导入模块
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

# 2. 设置图表显示风格
sns.set_style('whitegrid')

# 3. 读取数据
train_df = pd.read_csv('../../datasets/train.tsv', sep='\t')
dev_df = pd.read_csv('../../datasets/dev.tsv', sep='\t')

# 4. 绘制标签数量柱状图
sns.countplot(x='label', data=train_df)
plt.title('训练集标签数量柱状图')
plt.savefig('../../NLP_images/text_preprocessing_images/ch03_A_1.png')
plt.clf()  # 清空当前图表

保存图表的效果如下:

😫尝试解决

我尝试使用添加下述代码解决上述问题:

python 复制代码
# 1. 导入模块
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

# 显示中文字体和负号
plt.rcParams['font.sans-serif'] = ['SimHei']  # 设置中文字体为黑体
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题

# 2. 设置图表显示风格
sns.set_style('whitegrid')

# 3. 读取数据
train_df = pd.read_csv('../../datasets/train.tsv', sep='\t')
dev_df = pd.read_csv('../../datasets/dev.tsv', sep='\t')

# 4. 绘制标签数量柱状图
sns.countplot(x='label', data=train_df)
plt.title('训练集标签数量柱状图')
plt.savefig('../../NLP_images/text_preprocessing_images/ch03_A_1.png')
plt.clf()  # 清空当前图表

但是无法解决上述问题。

【为什么呢?】

🙄问题根源

其核心原因:seaborn的图表显示风格设置覆盖了plt.rcParam的字体配置。

通过上述代码,可以发现我的 plt.rcParam 设置在 sns.set_style('whitegrid') 之前。在部分版本中,set_style('whitegrid') 或 set_theme 会重置Matplotlib 全局参数,刚好把我先前的 plt.rcParam 配置覆盖掉。

🤓解决方法

1. 调整代码的顺序

将 plt.rcParam的配置放到 sns.set_style() 之后,防止被覆盖!

python 复制代码
# 1. 导入模块
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

# 2. 设置图表显示风格
sns.set_style('whitegrid')

# 显示中文字体和负号
plt.rcParams['font.sans-serif'] = ['SimHei']  # 设置中文字体为黑体
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题

# 3. 读取数据
train_df = pd.read_csv('../../datasets/train.tsv', sep='\t')
dev_df = pd.read_csv('../../datasets/dev.tsv', sep='\t')

# 4. 绘制标签数量柱状图
sns.countplot(x='label', data=train_df)
plt.title('训练集标签数量柱状图')
plt.savefig('../../NLP_images/text_preprocessing_images/ch03_A_1.png')
plt.clf()  # 清空当前图表

2. 进阶排查(如果上述内容不生效)

可能是系统中没有 SimHei 该字体,可以使用下述代码查看系统中存在的可用字体:

python 复制代码
from matplotlib import font_manager
# 打印出所有包含 'SimHei', 'Hei', 'YaHei', 'Song' 等关键字的字体名
zh_fonts = [f.name for f in font_manager.fontManager.ttflist if 'SimHei' in f.name or 'Hei' in f.name or 'YaHei' in f.name or 'Song' in f.name]
print("系统可用的中文字体有:", zh_fonts)

可以将终端打印的结果中的任意一种字体(如:'Microsoft YaHei')替换 plt.rcParam 中的 'SimHei' 。

3. 终极绝招:直接指定字体文件的绝对路径

如果上述两种方法都不奏效,可以去网上下载一个 'SimHei.ttf' 文件,并将它放到项目的统计目录下,通过绝对路径指定字体文件。

python 复制代码
import seaborn as sns
import matplotlib.pyplot as plt
from matplotlib import font_manager

# 1. 将本地字体文件注册到 Matplotlib 的全局字体库中
font_path = 'SimHei.ttf'  # 你的字体文件路径
font_manager.fontManager.addfont(font_path)
# 提取出注册后的字体名称(通常是 'SimHei')
font_name = font_manager.FontProperties(fname=font_path).get_name()

# 2. 全局设置字体和负号(只需设置这一次,后续所有图表都会自动生效)
plt.rcParams['font.sans-serif'] = [font_name]
plt.rcParams['axes.unicode_minus'] = False

# 3. 设置 Seaborn 风格(注意:一定要在设置完 plt.rcParams 之后调用,或者在 set_theme 中再次指定字体)
sns.set_theme(style="whitegrid", font=font_name)

# --- 接下来正常绘图,完全不需要再单独指定 fontproperties ---
sns.countplot(x='label', data=train_df)
plt.title('训练集标签数量柱状图')  # 自动使用中文字体
plt.xlabel('标签')                # 自动使用中文字体
plt.ylabel('数量')                # 自动使用中文字体
plt.savefig('test.png')

😅小提醒

有时候 Matplotlib 会缓存字体列表 。如果你新安装了字体但依然不显示,可以尝试删除 Matplotlib 的缓存文件夹(通常在 C:\Users\你的用户名\.matplotlib 或 ~/.matplotlib 下),删除后重新运行代码,它会自动重建缓存。

建议你先尝试方法1(调整代码顺序),这通常能解决 80% 的问题。如果不行,再试试打印一下系统可用字体看看情况!

相关推荐
“AI国潮设计-小江”3 小时前
【AIGC实战】Python+SDXL批量生成“潮汕英歌舞不倒翁”IP | 角色一致性与多场景融合方案,附完整代码
开发语言·人工智能·python·prompt·aigc
Linux_cy3 小时前
服务器管理工具哪个好用?我用了七八个
运维·服务器·javascript·python·ssh·面板·gmssh
MoRanzhi12033 小时前
第6篇(下)· 使用 PyQt5 实现 2048 高性能计算版:统一运行控制与跨模式安全交接
python·pyqt·进程管理·状态机·软件架构·并发控制·数据一致性
code tsunami4 小时前
【无标题】
开发语言·python
CodeGL4 小时前
10、Python基础之进程和线程
开发语言·python
TechWayfarer5 小时前
PHP漏洞被利用,怎么揪出攻击IP?
开发语言·python·tcp/ip·网络安全·php
2601_967980116 小时前
Python列表操作方法详解
python·数据类型·修改·列表操作·功能汇总
Patrick在香港6 小时前
台风在变少,来香港的没有
python·数据分析·香港·开放数据·热带气旋
qq_406981036 小时前
大白话rust系列09 函数调用两次有什么错?
开发语言·python·rust
benchmark_cc7 小时前
QuantDash 安装成功后,如何验证 Python 环境可以正常导入 SDK?
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash