引言
在数据可视化过程中,Python 的 Matplotlib 是广泛使用的绘图库。然而,在图表标题、坐标轴标签或图例中使用中文时,字符会显示为方块。这直接影响数据图表的可读性,尤其在学术论文、技术报告或博客中,这种可读性问题尤为突出。
问题剖析
我们使用以下代码查看 Matplotlib 所使用的全局默认 sans-serif 字体列表:
from matplotlib import rcParams, font_manager
print(rcParams['font.sans-serif'])
print(font_manager.FontProperties()) # 当前实际渲染所使用的字体
在 Windows 平台,Python 3.14,Matplotlib 3.10.7 运行结果如下:
['DejaVu Sans', 'Bitstream Vera Sans', 'Computer Modern Sans Serif', 'Lucida Grande', 'Verdana', 'Geneva', 'Lucid', 'Arial', 'Helvetica', 'Avant Garde', 'sans-serif']
DejaVu Sans
可以看到,Matplotlib 默认采用 DejaVu Sans 字体进行渲染,这是一个以拉丁字母(英文及西文字母)为主的西文字体,并不包含 CJK (中文、日文、韩文) 字符。这就导致了中文字符会显示为乱码或方块。
解决方案
我们可以手动替换 sans-serif 字体列表为 CJK 字体。一般地,我们使用无衬线字体黑体即可。在 Windows 平台上可使用微软雅黑(SimHei),在 Linux 平台上可使用文泉驿正黑(WenQuanYi Zen Hei)。同时强制使用 ASCII 负号显示负号,以避免字体自身对负号的渲染问题。
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei','WenQuanYi Zen Hei']
plt.rcParams['axes.unicode_minus'] = False