使用Savitzky-Golay滤波器搭配matplotlib时无法生成图片的问题
问题根因
该冻结问题是macOS系统下旧版本matplotlib、scipy与系统TeX环境的依赖加载冲突导致的,savgol_filter依赖的线性代数库会和TeX渲染进程抢占环境变量,触发死锁。
可行解决方案
方案1:调整模块导入和配置顺序
先导入scipy并完成所有数据计算,再配置matplotlib的字体参数和usetex设置,避免依赖加载冲突,示例代码如下:from scipy.signal import savgol_filter # 先完成所有数据计算逻辑 y_filt = savgol_filter(y,51,2) # 再导入matplotlib并完成配置 from matplotlib import pyplot as plt from matplotlib import rc # 如果要使用Computer Modern字体,把Helvetica替换为'Computer Modern Roman'即可 rc('font',**{'family':'serif','serif':['Computer Modern Roman']}) rc('text',usetex=True) # 绘图逻辑保持不变 figx = 2 figy = 4 fig = plt.figure() ax1 = plt.subplot2grid((1,1),(0,0)) ax1.plot(x,y_filt,color='k',lw=1) fig.set_size_inches(figx,figy) fig.savefig(dirFigs+'A1_extracted.pdf',dpi=600,bbox_inches='tight')方案2:不启用
usetex实现目标字体效果
跳过TeX渲染直接调用本地字体,从根源避免冲突。如果本地已经安装了Computer Modern或Helvetica字体,直接配置字体参数即可:from matplotlib import pyplot as plt from matplotlib import rcParams rcParams['font.family'] = 'serif' rcParams['font.serif'] = ['Computer Modern Roman', 'Helvetica'] # 按优先级排列字体 rcParams['mathtext.fontset'] = 'cm' # 数学公式也使用Computer Modern字体 # 后续计算、绘图逻辑保持不变,不需要启用usetex方案3:升级依赖包修复已知冲突
当前Python3.8配套的matplotlib、scipy版本较低,可通过Anaconda升级到最新稳定版修复已被修复的依赖冲突:conda update matplotlib scipy同时确保本地TeX环境是完整的MacTeX版本,而非精简版BasicTeX,避免缺少渲染需要的宏包导致进程卡住。
内容的提问来源于stack exchange,提问作者steph c
相关产品推荐
相关产品推荐

