使用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% 的问题。如果不行,再试试打印一下系统可用字体看看情况!

相关推荐
南京云森杉木桩3 分钟前
水利木桩源头直供,质量可靠价格更优
大数据·python
Aaron - Wistron12 分钟前
Python基础教程2/4(复合数据结构)
python
小柯南敲键盘15 分钟前
跨境电商图片翻译与视频字幕翻译工具推荐
python·音视频
ZC跨境爬虫38 分钟前
LeetCode 13. 罗马数字转整数(多解法详解 + Java Python 实现)
java·python·leetcode
machnerrn1 小时前
智慧交通系列(一)-十字路口车辆闯红灯检测告警抓拍系统(附含数据+源码+模型)
人工智能·python·深度学习
现代野蛮人1 小时前
【深度学习实验】—— 利用 RNN 模型进行心脏病预测
pytorch·python·tensorflow·ml
2601_956319881 小时前
2026年用示例、拆解和练习提升量化理解效率
人工智能·python
王志来137944730082 小时前
从分散到集成:工控服务器机箱采购如何实现“一站式”破局
运维·服务器·人工智能·python
三十岁老牛再出发2 小时前
08.18每日总结
c++·python·numpy·pandas
️学习的小王2 小时前
Anaconda国内镜像配置与conda常用命令
ide·经验分享·python·conda