matplotlib中文显示问题:Glyph缺失的终极解决方案

张开发
2026/4/17 1:58:38 15 分钟阅读

分享文章

matplotlib中文显示问题:Glyph缺失的终极解决方案
1. 为什么你的matplotlib图表总是显示中文乱码每次用matplotlib画图时看到那些烦人的Glyph missing警告是不是特别崩溃我刚开始用matplotlib做数据可视化时也经常遇到这个问题。明明代码写得没问题图表也生成了但中文标题和标签要么显示为方框要么直接报错。这种情况在Windows、Mac和Linux系统上都会出现根本原因是matplotlib默认使用的字体库不包含中文字符。举个例子当你尝试运行下面这段代码时import matplotlib.pyplot as plt plt.title(这是一个中文标题) plt.xlabel(x轴标签) plt.ylabel(y轴标签) plt.plot([1,2,3], [1,4,9]) plt.show()很可能会看到这样的错误提示RuntimeWarning: Glyph 24230 missing from current font font.set_text(s, 0.0, flagsflags)这个错误信息中的Glyph指的是字符的形状或图形表示24230是Unicode编码。简单来说就是matplotlib当前使用的字体找不到对应的中文字符。我在处理酒店预订数据可视化时就遇到过这个问题当时需要展示不同月份人均居住价格这样的中文图表结果花了整整一个下午才找到完美解决方案。2. 彻底解决中文显示问题的三种方法2.1 方法一使用系统自带的中文字体最直接的解决方案是指定一个包含中文的字体。Windows系统自带的SimHei(黑体)就是个不错的选择import matplotlib.pyplot as plt plt.rcParams[font.sans-serif] [SimHei] # 设置中文显示 plt.rcParams[axes.unicode_minus] False # 解决负号显示问题 plt.title(完美显示的中文标题) plt.plot([1,2,3], [1,4,9]) plt.show()这个方法简单有效但有几点需要注意不同操作系统可用的中文字体不同Windows: SimHei, Microsoft YaHeiMacOS: PingFang SC, STHeitiLinux: Noto Sans CJK, WenQuanYi Zen Hei如果要把图表保存为PDF或SVG还需要确保字体嵌入plt.savefig(output.pdf, bbox_inchestight, dpi300, metadata{Creator: Your Name, Producer: Your Script})2.2 方法二指定字体文件路径如果你的系统没有合适的中文字体或者你想使用特定字体可以直接指定字体文件路径from matplotlib import font_manager import matplotlib.pyplot as plt # 指定字体文件路径 font_path /path/to/your/font.ttf # 例如C:/Windows/Fonts/simhei.ttf font_prop font_manager.FontProperties(fnamefont_path) plt.title(自定义字体中文标题, fontpropertiesfont_prop) plt.xlabel(x轴标签, fontpropertiesfont_prop) plt.plot([1,2,3], [1,4,9]) plt.show()我特别喜欢这个方法因为它能让我在报告中使用公司规定的品牌字体。记得有一次做季度汇报市场部要求所有图表必须使用特定的中文字体这个方法帮了大忙。2.3 方法三全局设置默认字体如果你经常需要使用中文图表可以修改matplotlib的配置文件一劳永逸首先找到matplotlib的配置文件位置import matplotlib print(matplotlib.matplotlib_fname())打开这个文件找到font.sans-serif和axes.unicode_minus这两行修改为font.sans-serif : SimHei, Microsoft YaHei, WenQuanYi Zen Hei, Noto Sans CJK SC axes.unicode_minus : False保存文件后重启Python环境这样设置后所有图表都会自动使用你指定的中文字体再也不需要每次写代码都设置一遍了。3. 实际案例酒店预订数据可视化让我们通过一个完整的案例来看看如何在实际项目中应用这些方法。假设我们有一份酒店预订数据需要分析不同月份的人均居住价格import pandas as pd import seaborn as sns import matplotlib.pyplot as plt # 设置中文字体 plt.rcParams[font.sans-serif] [Microsoft YaHei] # 使用微软雅黑 plt.rcParams[axes.unicode_minus] False # 加载并预处理数据 data pd.read_csv(hotel_bookings.csv) data[adr_pp] data[adr] / (data[adults] data[children]) full_data_guests data.loc[data[is_canceled] 0] # 准备月份数据 month_mapping { January: 一月, February: 二月, March: 三月, April: 四月, May: 五月, June: 六月, July: 七月, August: 八月, September: 九月, October: 十月, November: 十一月, December: 十二月 } full_data_guests[arrival_date_month] full_data_guests[arrival_date_month].map(month_mapping) # 绘制图表 plt.figure(figsize(12, 6)) sns.lineplot(xarrival_date_month, yadr_pp, huehotel, datafull_data_guests, err_styleband) plt.title(不同月份酒店人均居住价格对比, fontsize16) plt.xlabel(月份, fontsize14) plt.ylabel(人均价格 (元), fontsize14) plt.xticks(rotation45) plt.tight_layout() plt.show()这个例子展示了如何设置全局中文字体处理包含中文的类别数据创建专业的中文数据可视化图表4. 高级技巧与疑难解答4.1 处理特殊符号和复杂字形有时候即使设置了中文字体某些特殊字符或复杂字形仍然可能显示异常。比如同时包含中文、英文和数学符号的标签plt.xlabel(温度(℃) vs 时间(小时))这种情况下可以尝试以下方法使用更全面的字体如Noto Sans CJK单独设置不同部分的字体属性使用Unicode转义序列表示特殊符号4.2 在Jupyter Notebook中确保字体生效在Jupyter Notebook环境中有时需要额外设置才能使字体更改生效%matplotlib inline import matplotlib.pyplot as plt plt.rcParams[font.sans-serif] [SimHei] plt.rcParams[axes.unicode_minus] False # 需要加上这行才能在某些环境下生效 plt.rcParams[figure.facecolor] white4.3 导出高质量中文图表当需要将图表用于印刷或正式报告时导出设置尤为重要plt.savefig(output.png, dpi300, bbox_inchestight, facecolorwhite, edgecolornone, metadata{Title: 中文图表, Author: Your Name})对于矢量图格式建议使用PDF或SVGplt.savefig(output.pdf, formatpdf, bbox_inchestight, metadata{CreationDate: None})4.4 跨平台字体兼容性解决方案为了确保你的代码在不同操作系统上都能正常工作可以使用以下策略import platform from matplotlib import font_manager system platform.system() if system Windows: font_name SimHei elif system Darwin: # MacOS font_name PingFang SC else: # Linux font_name WenQuanYi Zen Hei # 检查字体是否可用 if font_name in [f.name for f in font_manager.fontManager.ttflist]: plt.rcParams[font.sans-serif] [font_name] else: # 备用方案使用字体文件 try: font_path /usr/share/fonts/truetype/wqy/wqy-zenhei.ttc # Linux常见路径 font_manager.fontManager.addfont(font_path) plt.rcParams[font.sans-serif] [WenQuanYi Zen Hei] except: print(警告未找到合适的中文字体)这个方案会先检测操作系统然后尝试使用该平台最常见的中文字体如果找不到再尝试加载特定字体文件。

更多文章