【问题标题】:Pyplot exporting to .eps with alpha < 1Pyplot 导出到 .eps 且 alpha < 1
【发布时间】:2014-01-14 22:04:55
【问题描述】:

我正在尝试绘制一个漂亮的矩阵,其中突出显示了一些列。我对下面代码的结果非常满意。

import matplotlib.pyplot as plt
import numpy as np

plt.pcolormesh(np.random.rand(10,10), cmap = 'Greys')
plt.axvspan(3,6, color = 'red', alpha = 0.2)
plt.show()

它提供了一个图像,保存为 .png,看起来像

http://imgur.com/To9D0UT

这个。问题是,如果我将图像保存为 eps,图像会变得更糟,看起来像

https://dl.dropboxusercontent.com/u/8162527/figure_1.eps

这个。你可以想象,第二种变体对我来说不是一个选择。

我尝试将漂亮的 png 图像转换为 eps,它有点工作。问题是生成的图像不可缩放,并且比原始图像大 100 倍(文件大小)。我迫切需要想法。

【问题讨论】:

  • 文件大小的增加值得reading the answers to this SO question。如果您需要 eps 只是因为它是矢量图形,那么将文件另存为 .svg 会正确产生透明度。
  • 我对此知之甚少,无法给出明确的答案,但阅读en.wikipedia.org/wiki/… 表明,对这种透明度的支持在后记中是偶然的。值得一提的是,它适用于 SVG 和 PDF 格式。
  • 谢谢,确实,保存为 .svg 会产生正确的透明胶片,但是我需要一个 .eps 版本才能放入我的 LaTeX 文件中。问题是,当我将 svg 转换为 eps 时,图像变得奇怪。我只尝试了一些在线服务的转换,您有什么建议吗?
  • 我想建议使用 pdflatex 不会有太大帮助?
  • @WarrenWeckesser 不是一个真正的选择,不。我不是本文的主要作者,所以编译方法不是我的电话:)

标签: python matplotlib export alpha


【解决方案1】:

您可以直接修改pcolormesh创建的网格的颜色。例如:

import numpy as np
import matplotlib.pyplot as plt

nrows = 10
ncols = 10
a = np.random.rand(nrows, ncols)
pcm = plt.pcolormesh(a, cmap="Greys")

# Apparently need to render once in order to assign facecolors
# to the grid created by pcolormesh:
plt.draw()

fc = pcm.get_facecolors()
fc_grid = fc.reshape(nrows, ncols, -1)

alpha = 0.2
fc_grid[:, 3:6] = (1-alpha)*fc_grid[:, 3:6] + alpha*np.array([1.0, 0, 0, 1])
fc_grid[4:7, 7:] = (1-alpha)*fc_grid[4:7, 7:] + alpha*np.array([0, 1.0, 0, 1])

plt.show()

这是它创建的绘图的 PNG 版本:

如果你保存为EPS,颜色是正确的。

【讨论】:

  • 这是我经过一番思考后得出的相同解决方案。透明度的概念显然不能与 eps 格式结合。不是我希望的解决方案,但我想它会做到的。谢谢。
  • 您需要渲染一次的原因是强制颜色映射发生。更直接的方法是手动完成所有颜色映射,而不是 imshow 生成的 [..., 3] RGB 数组。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-06
  • 2012-09-26
  • 1970-01-01
  • 2011-07-05
  • 1970-01-01
  • 2016-12-19
  • 2017-09-23
相关资源
最近更新 更多