Windows更新后Matplotlib+LaTeX无法保存PDF绘图求助
解决Matplotlib使用LaTeX保存PDF时的UnicodeDecodeError问题
从你的错误日志能一眼定位问题根源:你的用户名包含非ASCII字符(Fábio里的á),Windows更新后,Matplotlib在读取TeX字体映射文件pdftex.map时,强制用ASCII编码解码路径,导致无法处理包含特殊字符的路径,最终触发了UnicodeDecodeError。
下面给你几个可行的解决方案,按推荐程度排序:
方案1:修改Matplotlib的dviread.py文件(一劳永逸)
找到你Anaconda环境下的dviread.py文件,路径大概是C:\ProgramData\Anaconda3\lib\site-packages\matplotlib\dviread.py:
- 打开这个文件,找到第1057行(对应你错误日志里的报错行):
return result.decode('ascii') - 把它改成:
return result.decode('utf-8') - 保存文件后重启Spyder,再运行代码就能正常保存PDF了。
这个修改让Matplotlib用UTF-8解码路径,完美兼容包含非ASCII字符的路径。
方案2:转移文件到无特殊字符的路径(快速临时解决)
把你的脚本文件plotter.py移到一个不含非ASCII字符的目录下,比如C:\Temp\,然后修改保存路径为这个目录:
plt.savefig('C:/Temp/plot.pdf', bbox_inches='tight')
这样避开了包含特殊字符的用户目录,也能快速解决问题。
方案3:手动指定pdftex.map的路径
如果你能找到MiKTeX中pdftex.map的位置(一般在C:\Program Files\MiKTeX\miktex\data\fonts\map\pdftex\pdftex.map),可以在代码开头添加以下配置:
import matplotlib # 强制使用指定的字体映射文件 matplotlib.rcParams['dvipng.filename'] = r'C:\Program Files\MiKTeX\miktex\data\fonts\map\pdftex\pdftex.map'
不过这个方法需要你准确找到文件位置,不如前两个方便。
补充说明
为什么保存PNG、EPS没问题?因为这些格式的保存流程不需要读取TeX字体映射文件,只有PDF保存时会触发这个路径解码的步骤,而Windows更新后Matplotlib的编码处理逻辑变严格了,才导致之前正常的代码现在出错。
内容的提问来源于stack exchange,提问作者Fábio Nascentes
相关产品推荐
相关产品推荐

