我在尝试保存一些带有透明椭圆的绘图时遇到了问题,如果我尝试使用 .ps/.eps 扩展名保存它们,就会出现问题。
这是以 .png 格式保存的绘图:
如果我选择将其保存为 .ps/.eps,它会变成这样:
我的解决方法是使用 ImageMagick 将原始 png 转换为 ps。唯一的问题是,png 格式的图像大小约为 90k,在转换后大小只有不到 4M 。这并不好,因为我有很多这样的图像,而且编译我的 LaTeX 文档需要太长时间。有没有人有解决这个问题的办法?
我在尝试保存一些带有透明椭圆的绘图时遇到了问题,如果我尝试使用 .ps/.eps 扩展名保存它们,就会出现问题。
这是以 .png 格式保存的绘图:
如果我选择将其保存为 .ps/.eps,它会变成这样:
我的解决方法是使用 ImageMagick 将原始 png 转换为 ps。唯一的问题是,png 格式的图像大小约为 90k,在转换后大小只有不到 4M 。这并不好,因为我有很多这样的图像,而且编译我的 LaTeX 文档需要太长时间。有没有人有解决这个问题的办法?
eps
不支持本地透明度。有几个选择:
将图像光栅化并嵌入eps文件(如@Molly所建议的)或导出为pdf并使用某些外部工具进行转换(如gs)(通常也依赖于光栅化)。
“模拟”透明度,给出在给定背景下看起来像透明的颜色。
zorder
关键字对绘制的部分进行排序。尝试使用zorder=10
来绘制蓝色椭圆形、zorder=11
来绘制绿色椭圆形和zorder=12
来绘制hexbins。mimic_alpha.py
进行调整。
编辑2
如果你百分之百确定必须使用 eps,那么我想到了几个解决方法(比你的绘图要丑陋):
hexbin
中相同的颜色映射制作 散点图 ,并根据需要调整标记大小和形状。您可能需要在此基础上重新绘制椭圆形边框。mimic_alpha
(我认为主要是与fill_between
一起),通过在阴影区域之上使用标准线条来增强限制。 - Francesco Montesano另一种选择是将它们保存为PDF文件。
savefig('myfigure.pdf')
如果使用pdflatex,那就可以工作了,如果这就是你需要使用eps而不是svg的原因。
在保存前,您可以对图形进行光栅化处理,以保留eps文件中的透明度:
ax.set_rasterized(True)
plt.savefig('rasterized_fig.eps')
我遇到了同样的问题。为了避免光栅化,您可以将图像保存为pdf格式,然后在终端上(至少在类Unix系统中)运行以下命令:
pdftops -eps my.pdf my.eps
这将生成一个.eps文件作为输出。
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=任意数字的zorder=0:
ax110.scatter(xs1,ys1 , marker='o', color='gray' , s=1.5,zorder=0,alpha=0.3)#, label=label_bg)
最后,在保存时设置rasterized=True:
P.savefig(str(PLOTFILENAME)+'.eps', rasterized=True)
请注意,使用transparent
关键字对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)