在MATLAB中将“重”数字保存为PDF - 渲染问题

时间:2010-03-11 18:24:43

标签: pdf matlab rendering save

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

尝试使用此简化代码,例如:

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 个答案:

答案 0 :(得分:2)

这很有趣。你的问题不是Matlab,它是Ghostscript(Matlab通过调用Ghostscript创建PDF,至少在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,因此您可能拥有Distiller。我试一试 - 如上所述生成PS文件,然后通过Distiller运行它们;你应该得到150K矢量PDF。

如果您坚持使用栅格化,我可以建议打印没有任何轴或标签的图形到tiff,打开tiff,并在其上重新创建轴和标签。

答案 1 :(得分:1)

如果您不想使用二维直方图(即像素亮度对应于点密度的图像),BlessedKey建议,看起来唯一好办法就是自己进行栅格化,正如AB所述。

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

作为简单绘图或2D直方图的替代方法,您可能需要查看scattercloud,其中将顺序绘制点与密度信息结合起来。

答案 2 :(得分:0)

如果可能的话,您应该在构建插图之前尝试对问题进行二次采样。如果您在曲线上绘制点,那么10,000可能超过您的需要。现代打印机毕竟只有大约600 DPI。

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

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