我在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。
答案 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来说明。
如果用不同颜色说明多个云,您可能有兴趣为每个云构建一个这样的图像,并将它们与透明度结合起来。