“储蓄”;沉重的;MATLAB中的图形到PDF-渲染问题

“储蓄”;沉重的;MATLAB中的图形到PDF-渲染问题,pdf,matlab,rendering,save,Pdf,Matlab,Rendering,Save,我在MATLAB中生成了一个包含大量元素(100000+)的图形,并希望将其保存到PDF文件中。使用zbuffer或painters渲染器,我得到了非常大且缓慢打开的文件(超过4MB)-所有点都是矢量格式。使用OpenGL渲染器在PDF中光栅化图形,对于打印来说可以,但对于文本标签来说不太好。文件大小约为150KB 请尝试以下简化代码,例如: x=linspace(1,10,100000); y=sin(x)+randn(size(x)); plot(x,y,'.') set(gcf,'Rend

我在MATLAB中生成了一个包含大量元素(100000+)的图形,并希望将其保存到PDF文件中。使用zbuffer或painters渲染器,我得到了非常大且缓慢打开的文件(超过4MB)-所有点都是矢量格式。使用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的另一个问题是它在MacOSX下的终端模式(-nosplash-nodesktop-nodisplay)下不工作。看起来不支持OpenGL。我必须使用终端模式进行自动化。我运行的MATLAB版本是2007b。Mac OSX服务器10.4。

这是一个有趣的版本。你的问题不是Matlab,而是Ghostscript(至少在Windows上,Matlab通过调用Ghostscript创建PDF)。当我跑的时候

x=linspace(1,10,100000);
y=sin(x)+randn(size(x));
plot(x,y,'.')
print -dpsc2 test.ps
我有一个2Mb的PS文件(当然是全矢量文件),压缩后变成了164Kb的压缩文件。在将PS转换为PDF时,人们希望得到大致相同的结果,但是
ps2pdf test.PS
生成了4Mb的文件

既然你在Mac电脑上,你可能有蒸馏器。我会尝试一下——如上所述生成PS文件,然后通过蒸馏器运行它们;你应该得到一个150K矢量PDF


如果您坚持光栅化,我建议您在不使用任何轴或标签的情况下将图形打印到tiff,打开tiff,然后在其顶部重新创建轴和标签。

如果可能,您应该在构建插图之前尝试对问题进行子采样。如果在曲线上绘制点,则10000可能比您需要的多。一台现代打印机毕竟只有大约600 DPI

如果这些点显示的是具有某些密度特性的云,更好的解决方案可能是首先构建二维直方图,然后使用imshow或imagesc进行说明


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

如果您不想使用2D直方图(即像素亮度对应于点密度的图像),如建议所示,看起来唯一的好方法是自己进行光栅化,正如所提到的

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


作为简单打印或2D直方图的替代方案,您可能需要研究,它将打印点与密度信息结合起来。

实际上,对于我来说,
zbuffer
渲染器生成了一个光栅化文件,大小与
opengl
oneYes相似,速度与我相同,但我认为,如果使用一个更复杂的图形,其中点不会被其他点隐藏得太多,那么opengl会更快,当在Matlab中处于终端模式时,键入
opengl info
告诉您什么?>>opengl info警告:opengl加载失败。>zbuffer渲染器生成了一个大小与opengl相似的光栅化文件。当我没有处于真正的终端模式(没有-nodisplay)时,它也发生在我身上。图形窗口出现在桌面上。矢量格式可以压缩,但文件打开速度非常慢,不管怎样,绘制所有矢量元素。这就是为什么我想光栅化的数字。谢谢你的想法与图像。看起来很复杂但可行。真实的数据看起来不像云。我需要按原样显示原始数据。我用这个简单的例子来说明这个问题。