如何优化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且pdf大小为5MB的eps文件(在Mac OS X 10.6上的Mathematica 7上,如果它有所不同)。
为了进行比较,具有相同轴的3x3图具有8kB(pdf)到20kB(eps)。 bmp中100x100点为30kB(png略低)。
其他类型的情节也是如此,重点是ListPlot3D
。
答案 0 :(得分:5)
您可能已经找到了如何在他提供的链接中应用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中已得到修复。
我之前曾提到我不知道为什么轴标签不同。阿列克谢普普科夫想出了一个解决方案。要创建axes
,fig
和result
,请使用以下内容:
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]]]
答案 1 :(得分:3)
我在以下两个方面取得了一些成功:
(1)保存前栅格化图。质量通常合理,尺寸大幅下降。
(2)我保存到postscript,然后(我在Linux机器上)使用ps2pdf来获取pdf。这比直接从Mathematica直接保存到pdf要小得多。
Daniel Lichtblau
答案 2 :(得分:2)
ImageResolution
适用于.pdf,但我没有成功使用.eps。
Export["testplot600.pdf", plot, ImageResolution -> 600]
600 dpi的输出大小为242 KB,300 dpi的输出大小为94 KB。您还可以为ImageSize
设置Export
。
如果你想进入第三方路线,我建议使用GraphicConverter。它非常可靠,有很多选择。