【问题标题】:Optimizing size of eps/pdf files generated by Mathematica优化 Mathematica 生成的 eps/pdf 文件的大小
【发布时间】:2011-10-31 12:51:26
【问题描述】:

如何优化 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

【问题讨论】:

标签: pdf wolfram-mathematica export figure eps


【解决方案1】:

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

我发现如果你想创建一个好的情节,你需要非常具体地使用 Mathematica。出于这个原因,您可能已经在我的帖子Rasters in 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]]]

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

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]]]

【讨论】:

  • 成功了,非常感谢!在我的电脑上,大小为:180kB (eps) 和 123kb (pdf)。
  • 但是,对于 eps 文件,背景是黑色的,覆盖了轴; Export["Result.eps", result, Background -> White] 没有帮助。对于 pdf 文件,一切正常。
  • @PiotrMigdal,我认为这可能是因为您使用的是 MMA7。这是我在 3D 栅格中指出的。如果你切换到 MMA8,那么 eps 文件应该可以出来。我相信这只是版本 7 中的一个错误。很高兴这有帮助。
  • 坐标轴标签有小数点,因为 AbsolutOptions 中的一个错误 - 只需查看 FrameTicks /. AbsoluteOptions[plot]
  • 使用FilterRules[AbsoluteOptions[plot], Except[FrameTicks]] 代替AbsoluteOptions[plot] 作为解决方法。
【解决方案2】:

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

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

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

丹尼尔·利希特布劳

【讨论】:

  • 谢谢。不幸的是,当我测试它时,ps2pdf plot.eps 产生了一个 7.7MB 的文件,所以它让事情变得更糟。
  • @Piotr Migdal 哎哟。我从来没有发生过这种情况。我的似乎总是缩小 10 倍左右。
【解决方案3】:

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

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

600 dpi 的输出大小为 242 KB,300 dpi 的输出大小为 94 KB。也可以将ImageSize设置为Export

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

【讨论】:

  • 谢谢。但实际上,我已经知道这个选项,这不是我要找的东西。 ImageResolution -> res 是数据点和轴的栅格化。
猜你喜欢
  • 2010-10-23
  • 2020-12-15
  • 1970-01-01
  • 1970-01-01
  • 2013-09-09
  • 2011-03-17
  • 2013-05-22
  • 1970-01-01
  • 2020-03-20
相关资源
最近更新 更多