Python Agg和CAROO之间的Matplotlib后端差异

Python Agg和CAROO之间的Matplotlib后端差异,python,pdf,matplotlib,backend,Python,Pdf,Matplotlib,Backend,嘿 我想从matplotlib绘图中生成高质量的PDF。使用其他代码,我生成了一个大的数字数组,我使用plt.imshow将其绘制在一个图中。如果我现在使用plt.savefig生成PDF,我会注意到根据我使用的后端的不同而有很大的差异。最重要的是,使用Agg或MacOSX后端生成的文件变得巨大,而使用Cairo生成的文件相当小(参见下面的示例)。另一方面,Cairo后端结合标签的TeX呈现生成奇怪的文本。这在TeX文档中看起来很糟糕。因此,我的问题有两个: 是否可以使用Agg后端生成小型PDF

我想从matplotlib绘图中生成高质量的PDF。使用其他代码,我生成了一个大的数字数组,我使用plt.imshow将其绘制在一个图中。如果我现在使用plt.savefig生成PDF,我会注意到根据我使用的后端的不同而有很大的差异。最重要的是,使用Agg或MacOSX后端生成的文件变得巨大,而使用Cairo生成的文件相当小(参见下面的示例)。另一方面,Cairo后端结合标签的TeX呈现生成奇怪的文本。这在TeX文档中看起来很糟糕。因此,我的问题有两个:

  • 是否可以使用Agg后端生成小型PDF(即,假定不将光栅图像插值到更高的分辨率)
  • 是否可以更改Cairo后端的一些文本设置,使其看起来类似于普通TeX(Agg后端就是这种情况)
  • 以下是一些用于测试目的的示例代码:

    import matplotlib as mpl
    mpl.use( "cairo" )
    
    import numpy as np
    import matplotlib.pyplot as plt
    plt.rcParams['text.usetex'] = True
    
    data = np.random.rand( 50, 50 )
    
    plt.imshow( data, interpolation='nearest' )
    plt.xlabel( 'X Label' )
    plt.savefig( 'cairo.pdf' )
    
    生成一个15Kb的PDF,其中包含一个外观不好的xlabel

    import matplotlib as mpl
    mpl.use( "agg" )
    
    import numpy as np
    import matplotlib.pyplot as plt
    plt.rcParams['text.usetex'] = True
    
    data = np.random.rand( 50, 50 )
    
    plt.imshow( data, interpolation='nearest' )
    plt.xlabel( 'X Label' )
    plt.savefig( 'agg.pdf' )
    
    生成一个986Kb的PDF,看起来不错

    我应该补充一点,我在OSX 10.6.8上使用matplotlib 1.0.1和python 2.6.7。在评论中,有人要求输出
    grep-a Font-agg.pdf

    /Shading 6 0 R /Font 3 0 R >>
    << /FontFile 16 0 R /Descent -285 /FontBBox [ -174 -285 1001 953 ]
    /StemV 50 /Flags 4 /XHeight 500 /Type /FontDescriptor
    /FontName /NimbusSanL-Regu /CapHeight 1000 /FontFamily (Nimbus Sans L)
    %!PS-AdobeFont-1.0: NimbusSanL-Regu 1.05a
    FontDirectory/NimbusSanL-Regu known{/NimbusSanL-Regu findfont dup/UniqueID known{dup
    /UniqueID get 5020902 eq exch/FontType get 1 eq and}{pop false}ifelse
    /FontType 1 def
    /FontMatrix [0.001 0 0 0.001 0 0 ]readonly def
    /FontName /NimbusSanL-Regu def
    /FontBBox [-174 -285 1001 953 ]readonly def
    /FontInfo 9 dict dup begin
    /BaseFont /NimbusSanL-Regu /Type /Font /Subtype /Type1
    /FontDescriptor 15 0 R /Widths 13 0 R /LastChar 255 /FirstChar 0 >>
    << /FontFile 20 0 R /Descent -251 /FontBBox [ -34 -251 988 750 ] /StemV 50
    /Flags 4 /XHeight 500 /Type /FontDescriptor /FontName /CMR12
    /CapHeight 1000 /FontFamily (Computer Modern) /ItalicAngle 0 /Ascent 750 >>
    %!PS-AdobeFont-1.0: CMR12 003.002
    %Copyright:  (<http://www.ams.org>), with Reserved Font Name CMR12.
    % This Font Software is licensed under the SIL Open Font License, Version 1.1.
    FontDirectory/CMR12 known{/CMR12 findfont dup/UniqueID known{dup
    /UniqueID get 5000794 eq exch/FontType get 1 eq and}{pop false}ifelse
    /FontType 1 def
    /FontMatrix [0.001 0 0 0.001 0 0 ]readonly def
    /FontName /CMR12 def
    /FontBBox {-34 -251 988 750 }readonly def
    /FontInfo 9 dict dup begin
     /Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050<http://www.ams.org>\051, with Reserved Font Name CMR12.) readonly def
    << /BaseFont /CMR12 /Type /Font /Subtype /Type1 /FontDescriptor 19 0 R
    
    /Shading 6 0 R/Font 3 0 R>>
    >
    >
    %!PS-ADOBEFOT-1.0:CMR12 003.002
    %版权所有:(),保留字体名称CMR12。
    %本字体软件根据SIL开放式字体许可证1.1版获得许可。
    FontDirectory/CMR12已知{/CMR12 findfont dup/UniqueID已知{dup
    /UniqueID get 5000794 eq exch/FontType get 1 eq和}{pop false}ifelse
    /FontType 1 def
    /FontMatrix[0.001 0 0.001 0 0]只读定义
    /FontName/CMR12 def
    /FontBBox{-34-251 988 750}只读定义
    /FontInfo 9 dict dup begin
    /通知(版权所有\050c\051 1997,2009美国数学学会\050\051,保留字体名称CMR12。)只读def
    
    正如steabert在上面的评论中所建议的,一种解决方法是以不同的格式导出图形,然后将其转换为PDF。从上面调整我的示例,工作流可能如下所示:

    import os
    import matplotlib as mpl
    mpl.use("Agg")
    
    import numpy as np
    import matplotlib.pyplot as plt
    plt.rcParams['text.usetex'] = True
    
    data = np.random.rand(50, 50)
    
    plt.imshow(data, interpolation='nearest')
    plt.xlabel('X Label')
    plt.savefig('agg.eps')
    
    os.system('epspdf agg.eps agg.pdf')
    

    生成一个16KB的文件,看起来不错。与上面的示例还有一个区别:使用(E)PS pipeline似乎忽略了interpolation='nearest'选项,即图像在最终PDF中显得模糊。幸运的是,我可以接受这一点,但研究这个问题可能会很有趣。

    我不知道答案,但请您发布
    grep-a Font agg.PDF
    ?我将输出放在主帖子中,因为评论部分太小了,放不下。谢谢你的努力!我还怀疑字体可能有问题。我基本上是尝试使用Computer Modern,以匹配我的TeX文档。看看这个关于matplotlib和cairo的问题,它可能会给你一些提示。我确实看过这篇文章,但我认为字体属性是ned只有在使用matplotlib渲染文本(而不是TeX)时才适用。我不确定,但cairo后端似乎也能找到正确的字体,但文本似乎更模糊(反阿拉辛?),有时会有一点偏移。我已经尝试了这两个示例(python 2.7.2 mpl 1.0.1 python2 cairo 1.10.0)发现如下:
    plt.rcParams['text.usetex']=True
    在我尝试执行
    plt.savefig(…)
    时导致错误,所以我删除了它。然后cairo.pdf和agg.pdf分别得到15.5Kb和18.3Kb,两者看起来都一样。以后你不能压缩agg.pdf吗?