Windows10 Anaconda3环境下matplotlib.pyplot.savefig段错误问题求助
我在Windows 10系统的Visual Studio Code中运行Python脚本时,发现Anaconda3内置的matplotlib包存在异常:调用matplotlib.pyplot.savefig函数将图表保存为.png格式时会触发segmentation fault(段错误),多日搜索资料未定位问题根源,相关公开issue仅明确了问题成因但没有可行解法,特此求助。
补充:Plotter模块代码
import faulthandler faulthandler.enable() from Utilities import * class Plotter: def __init__(self, lst1: list, lst2: list, lst3: list): self.lst1 = lst1 self.lst2 = lst2 self.lst3 = lst3 def plotterFunc(self) -> mpl.pyplot.axes: fig, ax = mpl.pyplot.subplots(figsize=(12, 12)) setScaleLabelTickLimit(ax, t3) ax.set_ylabel('Intensity [$\frac{{W}}{{cm^{{2}}}}$]') plotter2(ax, x3, self.lst3) mpl.pyplot.savefig(PLOT_DIR/'Intensity/Intensity.png', orientation='landscape', bbox_inches='tight') mpl.pyplot.clf() def plotterFunc2(): pass def plotterFunc3(): pass
完整报错信息
Windows fatal exception: access violation
Current thread 0x0001fb6c (most recent call first):
File "C:\ProgramData\Anaconda3\lib\site-packages\matplotlib\backends\backend_agg.py", line 240 in get_text_width_height_descent
File "C:\ProgramData\Anaconda3\lib\site-packages\matplotlib\text.py", line 306 in _get_layout
File "C:\ProgramData\Anaconda3\lib\site-packages\matplotlib\text.py", line 903 in get_window_extent
File "C:\ProgramData\Anaconda3\lib\site-packages\matplotlib\axis.py", line 1068 in
File "C:\ProgramData\Anaconda3\lib\site-packages\matplotlib\axis.py", line 1068 in _get_tick_bboxes
File "C:\ProgramData\Anaconda3\lib\site-packages\matplotlib\axis.py", line 1142 in draw
File "C:\ProgramData\Anaconda3\lib\site-packages\matplotlib\artist.py", line 51 in draw_wrapper
File "C:\ProgramData\Anaconda3\lib\site-packages\matplotlib\image.py", line 132 in _draw_list_compositing_images
File "C:\ProgramData\Anaconda3\lib\site-packages\matplotlib\axes_base.py", line 2921 in draw
File "C:\ProgramData\Anaconda3\lib\site-packages\matplotlib_api\deprecation.py", line 431 in wrapper
File "C:\ProgramData\Anaconda3\lib\site-packages\matplotlib\artist.py", line 51 in draw_wrapper File "C:\ProgramData\Anaconda3\lib\site-packages\matplotlib\image.py", line 132 in _draw_list_compositing_images
File "C:\ProgramData\Anaconda3\lib\site-packages\matplotlib\figure.py", line 2790 in draw
File "C:\ProgramData\Anaconda3\lib\site-packages\matplotlib\artist.py", line 51 in draw_wrapper
File "C:\ProgramData\Anaconda3\lib\site-packages\matplotlib\artist.py", line 74 in draw_wrapper
File "C:\ProgramData\Anaconda3\lib\site-packages\matplotlib\backend_bases.py", line 2230 in print_figure
File "C:\ProgramData\Anaconda3\lib\site-packages\matplotlib\backends\backend_qt5agg.py", line 78 in print_figure
File "C:\ProgramData\Anaconda3\lib\site-packages\matplotlib\figure.py", line 3015 in savefig
File "C:\ProgramData\Anaconda3\lib\site-packages\matplotlib\pyplot.py", line 966 in savefig
File "c:\Users\username...\Plotter.py", line 41 in plotterFunc
File "c:/Users/username/.../my_script.py", line 199 in main
File "c:/Users/username/.../my_script.py", line 211 in
Segmentation fault
- 优先尝试更换matplotlib后端:报错显示当前使用Qt5Agg后端,该GUI后端在无界面环境下保存图片时经常触发段错误,在导入matplotlib.pyplot之前指定无GUI的Agg后端即可:
import matplotlib matplotlib.use('Agg') import matplotlib.pyplot as plt
- 修复LaTeX文本渲染冲突:故障发生在文本宽度计算环节,和ylabel中使用的LaTeX公式渲染直接相关,可先关闭LaTeX渲染测试:
mpl.rcParams['text.usetex'] = False
如果需要保留LaTeX渲染,手动指定系统已安装的兼容字体即可,比如:
# 指定宋体 mpl.rcParams['font.family'] = 'SimSun' # 或者指定Arial mpl.rcParams['font.family'] = 'Arial'
- 调整savefig参数:先去掉savefig的
orientation、bbox_inches参数测试能否正常保存,确认问题触发点后再调整对应配置。 - 替换绘图上下文清理逻辑:将原有
mpl.pyplot.clf()替换为mpl.pyplot.close(fig),彻底清理绘图对象避免内存残留导致的异常。 - 重装matplotlib包:Anaconda内置的matplotlib版本可能存在依赖冲突,先卸载原有包再重新安装:
# 卸载原有包 conda uninstall matplotlib # 用conda重装稳定版 conda install matplotlib # 若conda版本仍有问题,用pip安装最新版 pip install matplotlib -U
内容的提问来源于stack exchange,提问作者Ash

