【问题标题】:Saving "heavy" figure to PDF in MATLAB - rendering problem在 MATLAB 中将“重”图形保存为 PDF - 渲染问题
【发布时间】:2011-01-26 12:30:30
【问题描述】:

我在 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。

【问题讨论】:

  • 实际上对我来说zbuffer 渲染器生成了一个大小与opengl one 相似的光栅化文件
  • 是的,对我来说速度是一样的,但我认为如果使用更复杂的图表,其中点不会被其他点隐藏太多,opengl 会更快。
  • opengl 不能在终端模式下工作,在 Matlab 中输入opengl info 会告诉你什么时候处于终端模式?
  • >> opengl info 警告:OpenGL 加载失败。
  • > zbuffer 渲染器生成了一个大小类似于 opengl 的光栅化文件。当我不处于真正的终端模式(没有-nodisplay)时,它也发生在我身上。图窗口出现在桌面上。

标签: pdf matlab rendering save


【解决方案1】:

这是一个有趣的问题。您的问题不是 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 ZIP。人们希望在将 PS 转换为 PDF 时获得或多或少相同的结果,但 ps2pdf test.ps 生成了您的 4Mb 文件!

由于您使用的是 Mac,因此您可能拥有 Distiller。我会试一试——像上面那样生成 PS 文件,然后通过 Distiller 运行它们;你应该得到一个 150K 矢量 PDF。

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

【讨论】:

  • 矢量格式可以压缩,但是文件打开速度很慢,无论如何绘制所有矢量元素。这就是为什么我想光栅化这个数字。感谢您提供图像的想法。看似复杂但可行。
【解决方案2】:

如果您不想像BlessedKey 建议的那样使用 2D 直方图(即像素亮度对应于点密度的图像),那么看起来唯一的好方法是自己进行光栅化,如前所述AB.

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

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

    • 真实数据看起来不像云。我需要按原样显示原始数据。我用这个简单的例子来说明问题。
    猜你喜欢
    • 2012-11-13
    • 1970-01-01
    • 1970-01-01
    • 2011-05-07
    • 2018-08-21
    • 1970-01-01
    • 1970-01-01
    • 2019-05-20
    • 1970-01-01
    相关资源
    最近更新 更多