读取PNG头部错误"运行时错误
有时候,我用 matplotlib
的 canvas.print_figure
来绘图时,会遇到一个我搞不懂的 RuntimeError
错误。要给出一个简单的运行示例对我来说太复杂了(尤其是我无法重现这个问题),不过我可以把调用的代码和错误追踪信息放在这里,希望有人能帮我找出问题所在。
这是函数调用的代码:
canvas.print_figure(filename, papertype='a4', orientation='landscape',
dpi=300, format='png')
这里的 canvas
是一个 FigureCanvas
实例,而 filename
是像 picture1110101.png
这样的文件名。
这是完整的错误追踪信息(我把长路径名用点替代了):
Traceback (most recent call last):
File ".../draw.py", line 235, in plot
_plot(*args[1:], **kwargs)
File ".../draw.py", line 177, in _plot
dpi=dpi, format=ftype)
File ".../matplotlib/backend_bases.py", line 2093, in print_figure
**kwargs)
File ".../matplotlib/backends/backend_agg.py", line 491, in print_png
FigureCanvasAgg.draw(self)
File ".../matplotlib/backends/backend_agg.py", line 439, in draw
self.figure.draw(self.renderer)
File ".../matplotlib/artist.py", line 54, in draw_wrapper
draw(artist, renderer, *args, **kwargs)
File ".../matplotlib/figure.py", line 999, in draw
func(*args)
File ".../matplotlib/artist.py", line 54, in draw_wrapper
draw(artist, renderer, *args, **kwargs)
File ".../matplotlib/axes.py", line 2086, in draw
a.draw(renderer)
File ".../matplotlib/artist.py", line 54, in draw_wrapper
draw(artist, renderer, *args, **kwargs)
File ".../matplotlib/axis.py", line 1053, in draw
tick.draw(renderer)
File ".../matplotlib/artist.py", line 54, in draw_wrapper
draw(artist, renderer, *args, **kwargs)
File ".../matplotlib/axis.py", line 240, in draw
self.label1.draw(renderer)
File ".../matplotlib/artist.py", line 54, in draw_wrapper
draw(artist, renderer, *args, **kwargs)
File ".../matplotlib/text.py", line 576, in draw
self._fontproperties, angle)
File ".../matplotlib/backends/backend_agg.py", line 226, in draw_tex
Z = texmanager.get_grey(s, size, self.dpi)
File ".../matplotlib/texmanager.py", line 510, in get_grey
X = read_png(os.path.join(self.texcache, pngfile))
RuntimeError: _image_module::readpng: error reading PNG header
看起来这个问题和 TeX
有关。我确实在使用 TeX
,而且在包的初始化文件开头有以下配置行:
matplotlib.rc("text", usetex=True)
有没有什么提示呢?
1 个回答
2
这个问题是因为从 latex 转换到 dvi 再到 png 的过程中,生成了一个空的 png 文件。这个错误发生在 mpl 尝试读取这个 png 文件并把它放到画布上时,因为这个文件是空的,所以无法被识别为有效的 png 文件。
简单来说,mpl 在使用 Agg 后端把 latex 插入到你的图形中的步骤大概是这样的:
- 把你的 latex 字符串放进一个模板里。
- 调用 latex 来渲染这个模板,生成 dvi 文件。
- 用
dvipng
把 dvi 转换成 png 文件。 - 再把这个 png 文件读回来,作为图像插入到你的图形中。
我建议你捕捉这个错误,然后再试一次。