使用imshow时,Matplotlib PDF输出不尊重zorder

时间:2013-10-11 07:42:19

标签: python pdf matplotlib

我正在使用imshow在matplotlib中绘制多个图像,并使用zorder关键字在它们之间绘制一些矢量数据。

最小例子:

import numpy as np
import matplotlib.pyplot as plt

img = np.arange(100).reshape((10,10))
plt.imshow(img, extent = [0.25, 0.75, 0.25, 0.75], zorder = 10)
plt.imshow(img, extent = [0.1, 0.9, 0.1, 0.9], zorder = 1)
plt.plot([0, 1], [0, 1], color = 'black', zorder = 5)
plt.axis([0, 1, 0, 1])

plt.savefig('img.png')

导出到PNG时,输出符合预期。但是,当保存为PDF(或EPS,SVG,...)时,不遵守zorder(在两个图像上绘制线条)。这两个图像在导出时似乎合并为一个。使用pcolormesh代替imshow将图像保存为矢量而不是栅格,但在绘制大图像时生成的PDF很大。有没有办法让这个工作imshow

1 个答案:

答案 0 :(得分:1)

这听起来像你应该提出错误报告here - 我确实发现了一个类似的问题here,但你的问题看起来不同,值得一张单独的票。

你可以做的是手动将对角线分成两部分而不是依赖z顺序为你隐藏它。 类似的东西:

plt.plot([0, 0.25], [0, 0.25], color = 'black', zorder = 5)
plt.plot([0.75, 1], [0.75, 1], color = 'black', zorder = 5)

替换你的:

plt.plot([0, 1], [0, 1], color = 'black', zorder = 5)

<强>更新

鉴于您的真实世界情节可能比直线复杂得多,您可能会采取您的顶层,您的情节并找到一个遮罩/边界,其中两个拦截移除,(自动),您的部分需要隐藏的行。

另一种选择是将所有图层生成为单独的图像,然后使用PIL对它们进行分层,但由于PNG输出正常工作,因此最好输出为PNG,然后转换为PDF或嵌入为PDF格式解决方法。