优化Mathematica生成的eps/pdf文件的大小

Pio*_*dal 5 pdf wolfram-mathematica export eps figure

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

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

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

例如,下面的代码生成一个eps数字:

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

Export["testplot.eps", plot]
Export["testplot.pdf", plot]
Run Code Online (Sandbox Code Playgroud)

生成一个大小为3.3MB且pdf大小为5MB的eps文件(如果它有所不同,则在Mac OS X 10.6上的Mathematica 7上).

为了进行比较,具有相同轴的3x3图具有8kB(pdf)至20kB(eps).bmp中100x100点为30kB(png略低).

对于其他类型的情节,问题是相同的,重点是ListPlot3D.

jml*_*pez 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]
]; 
Run Code Online (Sandbox Code Playgroud)

我在这里要提到你必须指明ImagePadding.如果将其设置为alleps文件将与Mathematica显示的不同.无论如何,我认为拥有这个对象可以让你很容易地改变属性.

现在我们可以继续讨论你的问题了:

plot = ListDensityPlot[
  Table[Random[], {100}, {100}],
  InterpolationOrder -> 0,
  Options[G2D]
]
Run Code Online (Sandbox Code Playgroud)

产量

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

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]]]
Run Code Online (Sandbox Code Playgroud)

输出2

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

Export["Result.pdf", result];
Export["Result.eps", result];
Run Code Online (Sandbox Code Playgroud)

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

更新:

如果您使用的是Mathematica 7,则无法正确显示eps文件.所有你会看到的是你的主要人物,侧面是黑色.这是版本7中的错误.然而,这在Mathematica 8中得到修复.

我之前曾提到过,我不知道为什么轴标签不同.阿列克谢普普科夫想出了一个解决方案.要创建axes,figresult使用以下命令:

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]]]
Run Code Online (Sandbox Code Playgroud)

  • @PiotrMigdal,我想这可能是因为你使用的是MMA7.这是我在Rasters中用3D指出的.如果你切换到MMA8,那么eps文件应该出来了.这只是我相信版本7中的一个错误.很高兴这是有帮助的. (2认同)
  • 使用`FilterRules [AbsoluteOptions [plot],除[FrameTicks]]`而不是`AbsoluteOptions [plot]`作为解决方法. (2认同)