在使用 matplotlib
绘制图表时,如果标题、标签或文本中包含中文字符,可能会遇到以下错误或警告:
UserWarning: Glyph XXXX missing from current font.
Font 'default' does not have a glyph for XXXX, substituting with a dummy symbol.
这些问题的根本原因是 matplotlib
默认使用的字体不支持中文字符。本文将详细介绍如何解决这一问题,并提供完整的代码示例。
问题描述
当我们尝试在 matplotlib
中使用中文字符时,可能会出现以下情况:
-
图表中的中文字符显示为方框或乱码。
-
控制台输出大量警告信息,提示字体缺失。
例如,以下代码尝试绘制一个正态分布图,并在标题和标签中使用中文:
from scipy import stats
from matplotlib import pyplot as plt
import numpy as np
# 定义随机变量
mea = 0 # 平均值
stand = 1 # 标准差
X = np.arange(-10, 10, 0.1)
# 概率密度函数(PDF)
y = stats.norm.pdf(X, mea, stand)
# 绘图
plt.plot(X, y)
# 设置 x 轴显示区域和间隔
plt.xticks(np.arange(-10, 10, 1))
# x 轴标题
plt.xlabel('随机变量:x')
# y 轴标题
plt.ylabel('概率')
# 图标题
plt.title('正态分布:μ=%.1f,σ²=%.1f' % (mea, stand))
# 显示图形
plt.show()
运行上述代码时,可能会看到以下错误或警告:
UserWarning: Glyph 38543 (\N{CJK UNIFIED IDEOGRAPH-968F}) missing from current font.
Font 'default' does not have a glyph for XXXX, substituting with a dummy symbol.
解决方案
要解决 matplotlib
中文字符显示问题,可以通过以下方法设置支持中文的字体。
方法 1:设置支持中文的字体
matplotlib
支持自定义字体。我们可以通过设置 rcParams
来指定支持中文的字体(如 SimHei
或 Microsoft YaHei
)。
修改代码
在代码开头添加以下内容:
from matplotlib import pyplot as plt
import matplotlib.font_manager as fm
# 设置支持中文的字体
plt.rcParams['font.sans-serif'] = ['SimHei'] # 设置字体为 SimHei
plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题
完整代码示例
from scipy import stats
from matplotlib import pyplot as plt
import numpy as np
import matplotlib.font_manager as fm
# 设置支持中文的字体
plt.rcParams['font.sans-serif'] = ['SimHei'] # 设置字体为 SimHei
plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题
# 定义随机变量
mea = 0 # 平均值
stand = 1 # 标准差
X = np.arange(-10, 10, 0.1)
# 概率密度函数(PDF)
y = stats.norm.pdf(X, mea, stand)
# 绘图
plt.plot(X, y)
# 设置 x 轴显示区域和间隔
plt.xticks(np.arange(-10, 10, 1))
# x 轴标题
plt.xlabel('随机变量:x')
# y 轴标题
plt.ylabel('概率')
# 图标题
plt.title('正态分布:μ=%.1f,σ²=%.1f' % (mea, stand))
# 显示图形
plt.show()
运行上述代码后,图表中的中文字符将正常显示。
方法 2:安装支持中文的字体
如果系统中没有 SimHei
或其他支持中文的字体,可以手动安装字体文件。
步骤
-
下载字体文件:从网上下载支持中文的字体文件(如
SimHei.ttf
或Microsoft YaHei.ttf
)。 -
将字体文件放入
找到matplotlib
字体目录:matplotlib
的字体目录。可以通过以下代码查看:
import matplotlib as mpl
print(mpl.get_cachedir())
将下载的字体文件放入 matplotlib
的字体目录中。
3.清除字体缓存:
删除 matplotlib
的字体缓存文件(通常位于 ~/.matplotlib
目录下),然后重新运行代码。
方法 3:使用系统自带的中文字体
如果你使用的是 Windows 系统,可以直接使用系统自带的中文字体(如 Microsoft YaHei
)。修改代码如下:
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei'] # 设置字体为 Microsoft YaHei
plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题
总结:
通过设置 matplotlib 使用支持中文的字体,可以轻松解决中文字符显示问题。推荐使用 SimHei 或 Microsoft YaHei 字体。如果问题仍未解决,请检查字体文件是否正确安装,并确保清除字体缓存。
希望本文能帮助你顺利解决 matplotlib 中文字符显示问题!如果有其他问题,欢迎在评论区留言讨论。