如果我尝试使用.ps / .eps扩展名保存它们,我在尝试使用透明椭圆体保存一些图时遇到问题。
这是保存为.png的情节:
如果我选择将其保存为.ps / .eps,这就是它的样子:
我是如何解决这个问题的,是使用ImageMagick将原始png转换为ps。唯一的问题是png格式的图像大约是90k,转换后它变得不到4M。这不好,因为我有很多这些图像,编辑我的乳胶文件需要太多时间。有人有解决方案吗?
答案 0 :(得分:23)
问题是eps
本身不支持透明胶片。
选项很少:
光栅化图像并嵌入eps文件(如@Molly建议)或导出为pdf并使用某些外部工具(如gs)进行转换(通常也依赖于光栅化)
'模仿'透明度,给出的颜色看起来像给定背景上的透明颜色。
我讨论了这个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,那么我会想到几种解决方法(这绝对比您的情节更难):
hexbin
中相同的颜色贴图制作scatter plot并根据需要调整标记尺寸和形状。您可能希望在答案 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
格式完美支持透明度,压缩效率高,最重要的是可以在 Adobe Illustrator 中轻松编辑。
如果您想进一步编辑图形(不是编辑数据!我是说,为了好看),您可以在 Adobe Acrobat 中打开导出的图形 - 编辑 - 将元素复制到 Adobe Illustrator 中。这两个软件可以完美处理一切。
我很高兴使用这种方法。一切都清晰,可编辑和小尺寸。希望能帮上忙。