You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 22:15:45