保存为.ps / .eps时,Matplotlib图失去透明度

时间:2013-10-28 15:27:29

标签: image matplotlib png ps

如果我尝试使用.ps / .eps扩展名保存它们,我在尝试使用透明椭圆体保存一些图时遇到问题。

这是保存为.png的情节: png

如果我选择将其保存为.ps / .eps,这就是它的样子: ps

我是如何解决这个问题的,是使用ImageMagick将原始png转换为ps。唯一的问题是png格式的图像大约是90k,转换后它变得不到4M。这不好,因为我有很多这些图像,编辑我的乳胶文件需要太多时间。有人有解决方案吗?

7 个答案:

答案 0 :(得分:23)

问题是eps本身不支持透明胶片。

选项很少:

  1. 光栅化图像并嵌入eps文件(如@Molly建议)或导出为pdf并使用某些外部工具(如gs)进行转换(通常也依赖于光栅化)

  2. '模仿'透明度,给出的颜色看起来像给定背景上的透明颜色。

  3. 我讨论了这个for sure once on the matplotlib mailing list,我得到了栅格化的建议,这是不可行的,因为你得到像素化或巨大的数字。并且当它们被放入例如出版物时它们不能很好地扩展。

    我个人使用第二种方法,虽然不理想,但我发现它已经足够好了。我写了一个小python script来实现this SO post的算法,以获得具有透明度的颜色的纯RGB表示

    修改

    在您的绘图的特定情况下,尝试使用zorder关键字来对绘制的零件进行排序。尝试使用zorder=10作为蓝色椭圆,zorder=11作为绿色,zorder=12作为hexbins。

    这样蓝色应该低于一切,然后是绿色椭圆,最后是六角形。情节也应该是可读的纯色。如果你喜欢png中的蓝色和绿色,你可以尝试使用mimic_alpha.py

    编辑2

    如果您100%确定 使用eps,那么我会想到几种解决方法(这绝对比您的情节更难):

    1. 只需在hexbins上绘制椭圆边框即可。
    2. 获取每个六边形的中心和幅度,(可能丢弃所有零容器)并使用与hexbin中相同的颜色贴图制作scatter plot并根据需要调整标记尺寸和形状。您可能希望在
    3. 之上重绘椭圆边框

答案 1 :(得分:13)

另一种选择是将它们保存为pdf

savefig('myfigure.pdf')

这适用于pdflatex,如果这就是你需要使用eps而不是svg的原因。

答案 2 :(得分:8)

我遇到了同样的问题。要避免栅格化,可以将图像另存为pdf,然后在终端中运行(至少在unixish系统上):

  

pdftops -eps my.pdf my.eps

将.eps文件作为输出。

答案 3 :(得分:7)

您可以在保存之前栅格化图形以保持eps文件中的透明度:

ax.set_rasterized(True)
plt.savefig('rasterized_fig.eps')

答案 4 :(得分:2)

我解决了这个问题: 1)在定义图形区域时添加set_rasterization_zorder(1):

fxsize=16
fysize=8
f = figure(num=None, figsize=(fxsize, fysize), dpi=180, facecolor='w',
edgecolor='k')
plt.subplots_adjust(
left    = (18/25.4)/fxsize, 
bottom  = (13/25.4)/fysize, 
right   = 1 - (8/25.4)/fxsize, 
top     = 1 - (8/25.4)/fysize)
subplots_adjust(hspace=0,wspace=0.1)
#f.suptitle('An overall title', size=20)
gs0 = gridspec.GridSpec(1, 2)

gs11 = gridspec.GridSpecFromSubplotSpec(1, 1, subplot_spec=gs0[0])

ax110 = plt.Subplot(f, gs11[0,0])
f.add_subplot(ax110)

ax110.set_rasterization_zorder(1)

2)a = a中的zorder = 0 =图中的任何数字:

ax110.scatter(xs1,ys1  , marker='o', color='gray'  , s=1.5,zorder=0,alpha=0.3)#, label=label_bg)

和 3)保存时最后一个rasterized = True:

P.savefig(str(PLOTFILENAME)+'.eps', rasterized=True)

请注意,使用transparent关键字savefig可能无法正常工作,因为透明背景上alpha <1的RGBA颜色将与alpha = 1的RGB颜色相同。

答案 5 :(得分:1)

如上所述,最好和最简单的选择(如果你不想放松分辨率)是光栅化图形

f = plt.figure()
f.set_rasterized(True)

ax = f.add_subplot(111)

ax.set_rasterized(True)
f.savefig('figure_name.eps',rasterized=True,dpi=300)

这样,您也可以通过dpi选项管理大小。实际上,您还可以使用以下要应用光栅化的zorder:

ax.set_rasterization_zorder(0)

注意:使用plt.subplot和plt.subplot2grid函数时,保持f.set_rasterized(True)非常重要。否则,标签和刻度区域将不会出现在.eps文件中

答案 6 :(得分:0)

如果您使用乳胶撰写学术论文,我建议您导出 .pdf 文件而不是 .eps.pdf 格式完美支持透明度,压缩效率高,最重要的是可以在 Adob​​e Illustrator 中轻松编辑。

如果您想进一步编辑图形(不是编辑数据!我是说,为了好看),您可以在 Adob​​e Acrobat 中打开导出的图形 - 编辑 - 将元素复制到 Adob​​e Illustrator 中。这两个软件可以完美处理一切。

我很高兴使用这种方法。一切都清晰,可编辑和小尺寸。希望能帮上忙。