Matplotlib生成的PDF无法在Acrobat Reader中查看。

4

我正在使用matplotlib绘制数据,包括LaTeX字体。创建的PDF可以由evince、inkscape和GIMP显示,但不能由acroread或Adobe Reader显示。该原型代码适用于许多图形,只有少数图形存在这个问题。

...
fig = plt.figure(figsize=(10, 6))
ax = fig.add_subplot(111)
savedpi = 250
fileformat = 'pdf'
... 
p12,=ax.plot(plimit12-binSize/2.0, mean12, '-', lw=2)
ax.set_yscale('log')
ax.yaxis.set_major_formatter(matplotlib.ticker.ScalarFormatter())
ax.legend([p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12], [ "C01", "C02", "C03",  "C04", "C05", "C06", "C07", "C08", "C09", "C10", "C11", "C12"],numpoints=1, loc=1, ncol=3) 
plt.savefig(savepath+'veloDisp'+'.pdf',dpi=None,format=fileformat)

其中一个问题文件可以在http://ubuntuone.com/0kuZIKYeZQyGckE5jonPy6找到。

有人遇到过这样的问题吗?

编辑:感谢William Denman,事实上在evince中打开并打印为pdf就可以了,在acroread中也可以查看。有趣的是,使用LaTeX字体的其他图表一开始就能正常工作。我没有收到任何错误消息,无法猜测问题所在,这就是我首先在这里问的原因。暂时用你的解决方法可以,谢谢。但是我真的想知道如何通常情况下避免这种问题。由于这些图应该是出版物的一部分,我还必须考虑那些使用Adobe pdf阅读器的人。

编辑:如建议所述,我在MPL开发人员邮件列表上开了一个主题,请参见http://matplotlib.1069221.n5.nabble.com/PDF-not-readable-by-Adobe-PDF-readers-td42580.html

编辑:由matplotlib开发人员解决!问题是这行代码:

ax.axvline(x=1, c='#000000', lw='2', alpha=0.5) 

该字符串表示线条的宽度。应为

ax.axvline(x=1, c='#000000', lw=2, alpha=0.5)

很遗憾,标准的PDF后端目前还不能提醒这一点。

1
如果您从Evince或Inkscape导出PDF到PDF中,第二个PDF是否可以在Adobe Acrobat中查看?就我个人而言,我在Linux系统下使用Acrobat时遇到的问题不少。您是否将LaTeX嵌入PDF中?这可能也会对Acrobat造成问题。当您说“无法由acroread显示”时,您是否收到了错误提示?stderr中有任何信息吗? - William Denman
你使用的 mpl 版本是什么?你能够可靠地生成错误文件吗?如果可以,你能否提供一个最小化的示例?这听起来像是应该报告的一个 bug。 - tacaswell
我正在使用1.2.1版本,但是当简化绘图例程时无法重现错误。该问题仅在非常大的问题中出现;在我的情况下,处理了大约12个4GB的hdf5文件。此外,如果绘图脚本内没有太多计算,则输出文件是正常的;因此,如果我加载这些文件并只读取和绘制某个数量,则保存的PDF文件没有问题。但是,当我对数据进行一些处理时,PDF似乎不符合Adobe标准。 - Giant Molecular Klaus
@Giant Molecuar Klaus:错误文件的链接已经失效了,你还有吗? - ZF007
1个回答

0
在追踪matplotlib中的自己的错误后,我根据这篇文章和OP在matplotlib网站上的引荐发现,可以使用cairo来追踪matplotlib中的错误。 pip install cairo。然后在所有其他MPL导入的顶部添加:
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import ...

import matplotlib
matplotlib.use("cairo")

from matplotlib.backends.backend_pdf import PdfPages
..etc.

否则,追踪将失败,因为后端已经设置和加载完毕...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接