如果我尝试使用 .ps/.eps 扩展名保存一些带有透明椭圆体的图,我会遇到问题。
这是保存为 .png 的图:
如果我选择将其另存为 .ps/.eps,则如下所示:
我如何解决这个问题,是使用 ImageMagick 将原始 png 转换为 ps。唯一的问题是png格式的图片大概90k左右,转换后就变成了不到4M。这不好,因为我有很多这些图像,编译我的乳胶文档需要太多时间。有人对此有解决方案吗?
如果我尝试使用 .ps/.eps 扩展名保存一些带有透明椭圆体的图,我会遇到问题。
这是保存为 .png 的图:
如果我选择将其另存为 .ps/.eps,则如下所示:
我如何解决这个问题,是使用 ImageMagick 将原始 png 转换为 ps。唯一的问题是png格式的图片大概90k左右,转换后就变成了不到4M。这不好,因为我有很多这些图像,编译我的乳胶文档需要太多时间。有人对此有解决方案吗?
问题是它eps
本身不支持透明胶片。
有几个选项:
光栅化图像并嵌入 eps 文件(如@Molly 建议)或导出为 pdf 并使用一些外部工具(如 gs)进行转换(通常也依赖于光栅化)
“模仿”透明度,给出一种在给定背景上看起来像透明的颜色。
我在 matplotlib 邮件列表上肯定讨论过一次,我得到了光栅化的建议,因为你得到像素化或巨大的数字,这是不可行的。而且它们在放入例如出版物时不能很好地扩展。
我个人使用第二种方法,虽然不理想,但我发现它已经足够好了。我编写了一个小的python 脚本,它实现了这个 SO 帖子中的算法,以获得具有给定透明度的颜色的实心 RGB 表示
编辑
在您的情节的特定情况下,尝试使用zorder
关键字来订购绘制的部分。尝试使用zorder=10
蓝色椭圆、zorder=11
绿色和zorder=12
六边形。
这样蓝色应该在所有东西的下方,然后是绿色椭圆,最后是六边形。并且情节应该也可以用纯色阅读。如果你喜欢 png 中的蓝色和绿色阴影,你可以尝试使用mimic_alpha.py
.
编辑 2
如果您 100% 确定必须使用 eps,那么我想到了一些解决方法(这绝对比您的情节更丑陋):
hexbin
,并根据需要调整标记的大小和形状。您可能希望在此之上重新绘制椭圆边框另一种选择是将它们保存为pdf
savefig('myfigure.pdf')
这适用于 pdflatex,如果这就是您需要使用 eps 而不是 svg 的原因。
您可以在保存之前栅格化图形以保持 eps 文件中的透明度:
ax.set_rasterized(True)
plt.savefig('rasterized_fig.eps')
我有同样的问题。为避免光栅化,您可以将图像保存为 pdf,然后在终端中运行(至少在 unixish 系统上):
pdftops -eps my.pdf my.eps
它给出了一个 .eps 文件作为输出。
我通过以下方式解决了这个问题: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 颜色相同。
如上所述,最好和最简单的选择(如果您不想降低分辨率)是栅格化图形
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区域
我的解决方案是将绘图导出为 .eps,例如将其加载到 Inkscape,然后取消组合绘图,选择我要设置透明度的对象,然后在“填充和描边”选项卡中编辑填充的不透明度.
如果您想稍后对其进行调整,可以将文件另存为 .svg,或者将图像导出以供发布。
如果你是用 Latex 写学术论文,我建议你导出.pdf
文件而不是.eps
. 该.pdf
格式完美支持透明度,具有良好的压缩效率,最重要的是可以在 Adobe Illustrator 中轻松编辑。
如果您想进一步编辑图表(不是编辑数据!我的意思是,为了好看),您可以在 Adobe Acrobat - 编辑 - 将元素复制到 Adobe Illustrator 中打开导出的图表。这两个软件可以完美地处理一切。
我很高兴使用这种方法。一切都清晰、可编辑且体积小。希望能有所帮助。