Matplotlib绘图触发Glyph 26 missing字体警告问题咨询
Matplotlib绘制拉曼光谱触发Glyph 26缺失警告解决方案
问题复现信息
- 运行环境:Anaconda + Spyder + Python 3.8 + Matplotlib
- 触发警告信息:
/opt/anaconda3/lib/python3.8/site-packages/IPython/core/pylabtools.py:151: UserWarning: Glyph 26 () missing from current font. fig.canvas.print_figure(bytes_io, **kw)
- 异常表现:绘图输出存在显示异常,非绘图逻辑代码运行正常,重置Anaconda、Spyder环境后问题未解决。
触发问题的完整代码
import pandas as pd import numpy as np import matplotlib.pyplot as plt import matplotlib as mpl class Raman: def __init__(self): '''Initialise the class instance''' def readcsv(self,filename,skipheader=2): ''' Returns the xth column from an input csv file filename : Input csv filename ''' data = pd.read_csv(filename, encoding= 'unicode_escape') data2 = data.to_numpy() x = data2[:,0] y1 = data2[:,1] y2 = data2[:,2] y3 = data2[:,3] av = data2[:,4] return (x,y1,y2,y3,av) def plotRaman(self, x, y, maxh=300,title='Raman'): ''' Plot Raman spectrum ''' plt.plot(x, y,lw=0.8) plt.xlabel("Raman shift") plt.ylabel("Intensity") plt.title(title) plt.show() # 初始化类 s = Raman() #导入csv文件 x_0201, y1_0201, y2_0201, y3_0201, y_0201 = s.readcsv("02_01.csv") #绘图 s.plotRaman(x_0201,y_0201,900,'0201')
异常绘图效果

问题根因
警告中提到的Glyph 26对应ASCII编码为26的不可见控制字符(0x1A,旧系统中用作文件结束标记),这类字符普遍存在于拉曼光谱仪直接导出的CSV文件尾部或表头位置。当前代码读取CSV时未过滤这类不可见控制字符,Matplotlib调用当前字体渲染时找不到对应字形,因此抛出警告并在图中显示异常方块。该问题与中文字体缺失无关,重置环境无法解决。
修复步骤
- 读取CSV时增加不可见控制字符过滤逻辑
在readcsv方法的pd.read_csv语句后添加如下代码,自动清除所有字符串列中ASCII码小于32的控制字符、以及ASCII码127的删除控制符:# 过滤数据中混入的不可见ASCII控制字符 for col in data.columns: if data[col].dtype == object: data[col] = data[col].apply( lambda val: ''.join([c for c in str(val) if 32 <= ord(c) <= 126]) if pd.notna(val) else val ) - 显式配置Matplotlib全局字体参数
在导入Matplotlib后添加全局配置,指定系统存在的可用字体,避免其他潜在的字形缺失问题:# 按操作系统选择对应可用字体,优先匹配系统自带无衬线字体 mpl.rcParams['font.sans-serif'] = ['PingFang SC', 'Microsoft YaHei', 'Noto Sans CJK SC', 'DejaVu Sans'] mpl.rcParams['axes.unicode_minus'] = False # 解决负号显示异常 - 校验传入绘图接口的字符串参数
如果后续传入自定义标题、坐标轴标签时仍触发同类警告,可通过如下语句打印字符串内所有字符的编码,排查是否存在残留控制字符:# 打印字符串每个字符的Unicode编码,定位小于32的控制字符 print([ord(c) for c in 待检查的字符串变量])
内容的提问来源于stack exchange,提问作者Anon
相关产品推荐
相关产品推荐

