5

如何优化 Mathematica 生成的 eps 或 pdf 文件的大小?

文件大小通常比应有的大小大 50-100 倍(以下示例)。对于某些应用程序(例如将图形放在出版物中,或者甚至更多 - 将其放在大海报上),我需要在矢量图形中使用轴,因此对我来说使用光栅图形并不是最好的选择。

每个实用的解决方案(无论是在 Mathematica 中设置正确的选项,还是在其他应用程序中进行进一步的转换)都将受到赞赏。

例如下面的代码产生一个 eps 图形:

plot = ListDensityPlot[
Table[Random[], {100}, {100}],
InterpolationOrder -> 0]

Export["testplot.eps", plot]
Export["testplot.pdf", plot]

生成大小为 3.3MB 的 eps 文件和大小为 5MB 的 pdf 文件(在 Mac OS X 10.6 上的 Mathematica 7 上,如果有区别的话)。

作为比较,具有相同轴的 3x3 绘图具有 8kB (pdf) 到 20kB (eps)。100x100 点在 bmp 中为 30kB(在 png 中略小)。

其他类型的地块的问题是相同的,重点是ListPlot3D.

4

3 回答 3

5

您可能已经知道如何在他提供的链接中应用Alexey 的答案。但是,如果您在这里遇到问题,我会提供我如何将该技术应用于 2D 图形。

我发现如果你想创建一个好的情节,你需要非常具体地使用 Mathematica。出于这个原因,您可能已经注意到,在我的3D 栅格中,我创建了一个指定所有选项的对象,以便 Mathematica 可以满意。

in = 72;
G2D = Graphics[{},
   AlignmentPoint -> Center, 
   AspectRatio -> 1,
   Axes -> False,
   AxesLabel -> None,
   BaseStyle -> {FontFamily -> "Arial", FontSize -> 12},
   Frame -> True,
   FrameStyle -> Directive[Black],
   FrameTicksStyle -> Directive[10, Black],
   ImagePadding -> {{20, 5}, {15, 5}},
   ImageSize -> 5 in, 
   LabelStyle -> Directive[Black],
   PlotRange -> All,
   PlotRangeClipping -> False,
   PlotRangePadding -> Scaled[0.02]
]; 

我应该在这里提到您必须指定ImagePadding. 如果您将其设置为all您的 eps 文件,它将与 Mathematica 显示的不同。无论如何,我认为拥有这个对象可以让您更轻松地更改属性。

现在我们可以继续解决您的问题:

plot = ListDensityPlot[
  Table[Random[], {100}, {100}],
  InterpolationOrder -> 0,
  Options[G2D]
]

输出

以下将轴和栅格分开并将它们组合成结果:

axes = Graphics[{}, AbsoluteOptions[plot]];
fig = Show[plot, FrameStyle -> Directive[Opacity[0]]];
fig = Magnify[fig, 5];
fig = Rasterize[fig, Background -> None];
axes = First@ImportString[ExportString[axes, "PDF"], "PDF"];
result = Show[axes, Epilog -> Inset[fig, {0, 0}, {0, 0}, ImageDimensions[axes]]]

输出2

这里唯一的区别,在这一点上我无法解释的是轴标签,它们有小数点。最后,我们将它们导出:

Export["Result.pdf", result];
Export["Result.eps", result];

结果是 pdf 文件大小为 115 Kb,eps 文件大小为 168 Kb。

更新:

如果您使用的是 Mathematica 7,eps 文件将无法正确显示。您将看到的只是侧面带有黑色的主要人物。这是版本 7 中的一个错误。然而,这在 Mathematica 8 中已修复。

我之前提到过,我不知道为什么轴标签不同。Alexey Popkov 想出了一个解决办法。要创建axesfigresult使用以下内容:

axes = Graphics[{}, FilterRules[AbsoluteOptions[plot], Except[FrameTicks]]];
fig = Show[plot, FrameStyle -> Directive[Opacity[0]]];
fig = Magnify[fig, 5];
fig = Rasterize[fig, Background -> None];
axes = First@ImportString[ExportString[axes, "PDF"], "PDF"];
result = Show[axes, Epilog -> Inset[fig, {0, 0}, {0, 0}, ImageDimensions[axes]]]
于 2011-11-01T19:34:53.673 回答
3

我在以下两个方面都取得了一些成功:

(1) 保存前栅格化图。质量一般是合理的,尺寸大大下降。

(2) 我保存到 postscript,然后(我在 Linux 机器上)使用 ps2pdf 来获取 pdf。这往往比从 Mathematica 直接保存到 pdf 小得多。

丹尼尔·利赫特布劳

于 2011-10-31T14:33:39.470 回答
2

ImageResolution适用于.pdf,但我没有成功使用.eps。

Export["testplot600.pdf", plot, ImageResolution -> 600]

600 dpi 的输出大小为 242 KB,300 dpi 的输出大小为 94 KB。您也可以设置ImageSizeExport.

如果你想走第三方路线,我推荐 GraphicConverter。它非常可靠,并且有很多选择。

于 2011-10-31T13:48:06.777 回答