52

如果我尝试使用 .ps/.eps 扩展名保存一些带有透明椭圆体的图,我会遇到问题。

这是保存为 .png 的图: PNG

如果我选择将其另存为 .ps/.eps,则如下所示: ps

我如何解决这个问题,是使用 ImageMagick 将原始 png 转换为 ps。唯一的问题是png格式的图片大概90k左右,转换后就变成了不到4M。这不好,因为我有很多这些图像,编译我的乳胶文档需要太多时间。有人对此有解决方案吗?

4

8 回答 8

35

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

有几个选项:

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

  2. “模仿”透明度,给出一种在给定背景上看起来像透明的颜色。

在 matplotlib 邮件列表上肯定讨论过一次,我得到了光栅化的建议,因为你得到像素化或巨大的数字,这是不可行的。而且它们在放入例如出版物时不能很好地扩展。

我个人使用第二种方法,虽然不理想,但我发现它已经足够好了。我编写了一个小的python 脚本,它实现了这个 SO 帖子中的算法,以获得具有给定透明度的颜色的实心 RGB 表示

编辑

在您的情节的特定情况下,尝试使用zorder关键字来订购绘制的部分。尝试使用zorder=10蓝色椭圆、zorder=11绿色和zorder=12六边形。

这样蓝色应该在所有东西的下方,然后是绿色椭圆,最后是六边形。并且情节应该也可以用纯色阅读。如果你喜欢 png 中的蓝色和绿色阴影,你可以尝试使用mimic_alpha.py.

编辑 2

如果您 100% 确定必须使用 eps,那么我想到了一些解决方法(这绝对比您的情节更丑陋):

  1. 只需在 hexbins 顶部绘制椭圆边框。
  2. 获取每个六边形的中心和幅度,(可能丢弃所有零箱)并使用与中相同的颜色图制作散点图hexbin,并根据需要调整标记的大小和形状。您可能希望在此之上重新绘制椭圆边框
于 2013-10-28T17:41:18.490 回答
26

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

savefig('myfigure.pdf')

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

于 2014-03-11T23:13:40.827 回答
14

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

ax.set_rasterized(True)
plt.savefig('rasterized_fig.eps')
于 2013-10-28T16:38:36.097 回答
11

我有同样的问题。为避免光栅化,您可以将图像保存为 pdf,然后在终端中运行(至少在 unixish 系统上):

pdftops -eps my.pdf my.eps

它给出了一个 .eps 文件作为输出。

于 2014-05-08T11:47:45.043 回答
3

我通过以下方式解决了这个问题: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) 图中每个 alpha=anynumber 中的 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请注意,这对于关键字 to可能无法正常工作,savefig因为透明背景上 alpha<1 的 RGBA 颜色将与 alpha=1 的 RGB 颜色相同。

于 2016-02-19T00:51:41.430 回答
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文件中不会出现label和tick区域

于 2016-11-23T19:49:44.813 回答
0

我的解决方案是将绘图导出为 .eps,例如将其加载到 Inkscape,然后取消组合绘图,选择我要设置透明度的对象,然后在“填充和描边”选项卡中编辑填充的不透明度.

如果您想稍后对其进行调整,可以将文件另存为 .svg,或者将图像导出以供发布。

于 2015-09-10T09:26:14.977 回答
0

如果你是用 Latex 写学术论文,我建议你导出.pdf文件而不是.eps. 该.pdf格式完美支持透明度,具有良好的压缩效率,最重要的是可以在 Adob​​e Illustrator 中轻松编辑。

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

我很高兴使用这种方法。一切都清晰、可编辑且体积小。希望能有所帮助。

于 2021-03-16T13:40:00.717 回答