【问题标题】:Matplotlib PDF output does not respect zorder when using imshow使用 imshow 时 Matplotlib PDF 输出不尊重 zorder
【发布时间】:2013-10-19 05:17:36
【问题描述】:

我在 matplotlib 中使用imshow 绘制多个图像,以及使用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 进行这项工作?

【问题讨论】:

  • 请创建问题。

标签: python pdf matplotlib


【解决方案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解决方法。

【讨论】:

  • 谢谢,我刚刚提交了一个错误报告 (github.com/matplotlib/matplotlib/issues/2517)。不幸的是,我实际上并没有尝试绘制直线,而是绘制等高线图,所以我认为除了现在使用 PNG 输出之外没有简单的解决方法......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-15
  • 2016-05-07
相关资源
最近更新 更多