代码之家  ›  专栏  ›  技术社区  ›  yuk

在matlab中将“重”图形保存为pdf-呈现问题

  •  4
  • yuk  · 技术社区  · 15 年前

    我在matlab中生成了一个包含大量元素(100000以上)的数字,并希望将其保存到一个pdf文件中。有了zbuffer或painters渲染器,我得到了一个非常大的缓慢打开的文件(超过4 MB)-所有点都是矢量格式的。使用OpenGL渲染器将图形光栅化为PDF格式,可以打印,但不适用于文本标签。文件大小约为150KB。

    尝试此简化代码,例如:

    x=linspace(1,10,100000);
    y=sin(x)+randn(size(x));
    plot(x,y,'.')
    set(gcf,'Renderer','zbuffer')
    print -dpdf -r300 testpdf_zb
    set(gcf,'Renderer','painters')
    print -dpdf -r300 testpdf_pa
    set(gcf,'Renderer','opengl')
    print -dpdf -r300 testpdf_op
    

    实际数字要复杂得多,有几个轴和不同类型的图。

    有没有办法将图形光栅化,但将文本标签保留为矢量?

    OpenGL的另一个问题是,它不能在mac osx下的终端模式下工作(nosplash-nodesktop-nodisplay)。似乎不支持OpenGL。我必须使用终端模式来实现自动化。我运行的Matlab版本是2007b.mac osx服务器10.4。

    3 回复  |  直到 15 年前
        1
  •  2
  •   AVB    15 年前

    这个很有趣。您的问题不是matlab,而是ghostscript(matlab通过调用ghostscript创建pdfs,至少在Windows上)。当我跑步时

    x=linspace(1,10,100000);
    y=sin(x)+randn(size(x));
    plot(x,y,'.')
    print -dpsc2 test.ps
    

    我有一个2MB的ps文件(当然是矢量文件),当压缩后,它变成了164kb的zip文件。人们希望在将ps转换为pdf时得到或多或少相同的结果,但是 ps2pdf test.ps 生成了你的4MB文件!

    既然你在Mac上,你可能有蒸馏器。我会尝试生成如上所述的ps文件,然后通过distiller运行它们;您应该得到一个150k的向量pdf。

    如果你坚持的话 光栅化 ,我可以建议将没有任何轴或标签的图形打印到TIFF,打开TIFF,并在其上重新创建轴和标签。

        2
  •  1
  •   Community CDub    8 年前

    如果您不想使用二维柱状图(即像素亮度与点密度相对应的图像)作为 BlessedKey 建议,看起来唯一的好方法是像前面提到的那样,自己进行光栅化。 AB .

    getframe 然后 frame2im 似乎是实现这一目标的途径。不幸的是,如果使用-nodisplay运行,则getframe返回空值。因此,您必须将图形另存为.fig,然后在另一台计算机上运行一个脚本, 打开图形,使用getframe获取轴的内容,显示getframe中的图像,然后保存到pdf。

    作为简单绘图或二维柱状图的替代方法,您可能需要查看 scattercloud 顺便说一下,它结合了绘制点和密度信息。

        3
  •  0
  •   BlessedKey    15 年前

    如果可能的话,你应该在制作插图之前尝试将你的问题进行细分。如果你在曲线上绘制点,那么10000可能比你需要的要多。一台现代打印机毕竟只有600 dpi。

    如果这些点说明云具有某些密度属性,则更好的解决方案可能是首先建立二维直方图,然后用imshow或imagesc说明这一点。

    如果用不同的颜色显示多个云,您可能有兴趣为每个云构建一个这样的图像,并将它们与透明度结合起来。