【问题标题】:Matplotlib Plots Lose Transparency When Saving as .ps/.epsMatplotlib 绘图在另存为 .ps/.eps 时失去透明度
【发布时间】:2013-11-07 11:02:30
【问题描述】:

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

这是保存为 .png 的绘图:

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

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

【问题讨论】:

  • 你最终在没有使用任何模仿的情况下解决了问题吗?

标签: image matplotlib png ps


【解决方案1】:

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

有几个选项:

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

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

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

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

编辑

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

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

编辑 2

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

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

【讨论】:

  • 谢谢,我尝试了你的mimic_alpha.py 代码,但你无法通过它看到我也生成的散点图。颜色搭配得很好,但还是不透明。
  • 是的,它模仿颜色,但返回标准 RGB 颜色。无论如何,如果您必须使用 eps ,则无能为力。我用了几次mimic_alpha(我想主要是用fill_between),用阴影区域顶部的标准线来增强限制。
  • @astromax:我已经编辑了答案,为您的问题添加了可能的解决方案
  • 我也试过了 - 问题是即使 hexbin 有许多零 bin,hexbin 图跨越了整个范围。在这种情况下,具有大于椭圆的 zorder 的 hexbin 会完全阻止它们。
  • @astromax 我明白了。这非常烦人。我用可能的解决方法编辑答案
【解决方案2】:

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

savefig('myfigure.pdf')

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

【讨论】:

  • 真的这是正确答案。我不知道 2020 年有任何出版物不接受 PDF 格式的数据。
【解决方案3】:

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

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

【讨论】:

  • 非常有帮助,唯一的问题不是它是33M,太大了。我有很多这样的,它们不可能那么大。
  • 此外,它似乎将绘图的背面涂成黑色,因此它覆盖了 x 和 y 轴标签。知道为什么要这样做吗?
【解决方案4】:

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

pdftops -eps my.pdf my.eps

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

【讨论】:

    【解决方案5】:

    我通过以下方式解决了这个问题: 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 关键字到 savefig 时,这可能无法正常工作,因为透明背景上 alpha

    【讨论】:

      【解决方案6】:

      如上所述,最好和最简单的选择(如果您不想降低分辨率)是栅格化图形

      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区域

      【讨论】:

        【解决方案7】:

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

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

        【讨论】:

          【解决方案8】:

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

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

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

          【讨论】:

            猜你喜欢
            • 2015-01-21
            • 2017-09-08
            • 2015-01-04
            • 2014-08-05
            • 2022-09-08
            • 1970-01-01
            • 2018-03-30
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多