2014-01-14 40 views
0

我想绘制一个很好的矩阵,突出显示一些列。我对下面的代码的结果感到非常满意。Pyplot导出为.eps与alpha <1

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倍(文件大小)。我渴望想法。

+0

这将是值得的[阅读这个SO问题的答案](http://stackoverflow.com/questions/4408813/png-to-eps-conversion-massive-increase-in-file-size)关于增加在文件大小。如果因为是矢量图形而需要eps,那么将该文件保存为'.svg'会正确生成透明度。 – Greg

+0

我不太了解它以给出明确的答案,但阅读http://en.wikipedia.org/wiki/Transparency_%28graphic%29#Transparency_in_PostScript表明支持这种类型的透明度是命中还是错过在附记中。对于它的价值,它适用于SVG和PDF格式。 –

+0

谢谢,保存为.svg会生成正确的透明胶片,但是我需要一个.eps版本才能放入我的LaTeX文件。问题是,当我将svg转换为eps时,图像变得很奇怪。我只尝试了一些在线服务的转换,你有什么建议吗? – 5xum

回答

2

您可以直接修改由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版本: grid plot

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

+0

这是我想到之后遇到的同一个解决方案。透明度的概念显然不与eps格式相结合。不是我希望的解决方案,但我想它会做。谢谢。 – 5xum

+0

您需要渲染一次的原因是强制颜色映射发生。更直接的方法是手工完成所有的颜色映射,然后在结果的[[,3] RGB阵列上进行imshow操作。 – tacaswell