【问题标题】:How to decrease file size of exported plots while keeping labels sharp如何在保持标签清晰的同时减小导出图的文件大小
【发布时间】:2012-01-03 19:32:44
【问题描述】:

将相当复杂的绘图(尤其是ListDensityPlot)导出为 PDF 或 EPS(例如,用于发布)时,生成的文件可能会非常大。例如:

data = Flatten[Table[{f0, f, Exp[-(f - f0)^2/25^2]}, {f0, 500, 700, 5}, {f, 300, 
 900}], 1];
plot=ListDensityPlot[data,PlotRange->{Automatic,Automatic,{0,1}},InterpolationOrder->0]

这个示例数据集的大小是我通常使用的大小。当我使用Export["C:\\test.pdf", plot] 导出时,它会生成一个 23.9MB 大小的 PDF 文件。如果我改为尝试Export["C:\\test1.pdf", Rasterize[plot]],它会小得多,但图像的完整性和可重新缩放性自然会受到影响。

如果我的实际数字是一个组合图,这会更加复杂,例如 (Edit: f go to 900)

plot2 = Show[plot, Plot[x, {x, 500, 900}, PlotStyle -> Thick]]

(或Epilog 的某些用法)我希望将背景ListDensityPlot 光栅化,但将其他标记和绘图保持为“矢量”形式。或者至少,帧标签是非光栅化的。

有什么办法吗?

或者,通过其他一些巧妙的方法来实现相同的目标?


更新

我已经查看了相关问题,但这肯定比它需要的复杂得多(基本上是先导出然后再导入)。我已经能够利用该问题中的一些技巧将绘图与轴分开提取:

axes = Graphics[{}, Options[plot2]]

plots = Graphics[plot2[[1]]]

但是,plots 术语失去了AspectRatioPlotRange 等。plots 可以用Rasterize 命中,但它需要尺寸修正。

然后,如何将它们组合在一起?

【问题讨论】:

  • 感谢您的链接。看起来我可能可以使用它。 “取消”问题的适当方法是什么?
  • 如果有五个“关闭”投票,我们可以关闭一个问题,但这通常仅在问题与之前的问题非常相似时才会这样做。封闭的问题然后用作指向较早问题的指针。我必须更仔细地比较这两个问题,看看它们是否重复。现在最好不要做任何事情。
  • 好吧,不完全一样。但我也许可以在那里使用一些技巧。
  • 作为 Mathematica 标签的活跃成员,您是否考虑过提交给Area 51 Mathematica proposal?我们可以使用您的帮助。

标签: wolfram-mathematica


【解决方案1】:

这正是我在此处编写链接的函数所针对的问题: http://pages.uoregon.edu/noeckel/computernotes/Mathematica/listContourDensityPlot.html

它基于与 Heike 的回答相同的想法——我只是添加了更多功能,以便您可以安全地更改纵横比、不透明度并与其他绘图结合。请参阅我在 Heike 的回答中的评论。

要对您的数据进行尝试,请执行以下操作:

plot = Show[
 listContourDensityPlot[data, 
  PlotRange -> {Automatic, Automatic, {0, 1}}, 
  InterpolationOrder -> 0, Contours -> None], 
 Graphics[Line[{{500, 500}, {700, 700}}]]]

父页面也链接了几个类似的功能。

【讨论】:

  • 哇!这几乎正​​是我正在寻找的。我基本上可以使用开关Contours -> None 将我所有的ListDensityPlots 转换为listContourDensityPlot。非常感谢!
  • 我很好奇 AbsoluteOptions[p]Options[p] 的用法,后者更适合古怪的 FrameTicks 规范。
  • 我想我可以使用 FullOptions,但不只是 Options,因为我想避免获得像 Automatic、All 等符号值。它们在随后的计算中不起作用。也许你的刻度问题可以通过指定 PlotRangePadding 来解决(我默认设置为零,因为我更喜欢它)。如果您想恢复添加 4% 填充的通常行为,只需在 Show 语句中的选项之前,在 Evaluate@Apply[Sequence, frameOptions] 之前添加以下内容: PlotRangePadding -> If[FreeQ[{opts}, PlotRange ], .04 {-1, 1}.rangeCoords, 0]
  • AbsoluteOptions 目前有许多故障被技术支持确认为错误。
  • 是的,它需要对 V9 进行全面改造。
【解决方案2】:

如果您正在处理 2D 绘图,您可以使用 Inset 将光栅化绘图与矢量化轴结合起来。例如

plot2 = ListDensityPlot[data, 
   PlotRange -> {Automatic, Automatic, {0, 1}}, 
   InterpolationOrder -> 0, Axes -> False, Frame -> False, 
   PlotRangePadding -> 0];

plotRange = PlotRange /. AbsoluteOptions[plot2, PlotRange];

plot = Graphics[{
  Inset[Image[plot2], plotRange[[All, 1]], {Left, Bottom}, Scaled[{.96, .96}]],
  Line[{{500, 500}, {700, 700}}]}, 
 Frame -> True, AspectRatio -> 1, 
 PlotRange -> plotRange, PlotRangePadding -> Scaled[.02]]

Export["test.pdf", plot]

生成大约 400 KB 的 .pdf。边框、刻度线和黑线仍然是矢量化的,因此在放大时它们保持清晰:

【讨论】:

  • 我个人也赞成这种通用方法。只需要小心缩放坐标。用你的情节试试这个,看看我的意思: Show[plot, Graphics[{EdgeForm[Red], FaceForm[], Rectangle[{0, 0}, {1000, 1000}]}], PlotRange -> All]
  • @noeckel 我同意以这种方式使用Inset 是相当脆弱的;即使改变纵横比也会破坏它。理想情况下,我想做plot = Graphics[{Texture[plot2], Polygon[Tuples[plotRange][[{1, 2, 4, 3}]], VertexTextureCoordinates -> Tuples[{0, 1}, 2][[{1, 2, 4, 3}]]]}, Frame -> True] 之类的事情,但出于某种原因,Mathematica 拒绝将结果图导出为 pdf(至少在我的 Mathematica 版本中)。
  • 我喜欢这种方法,但我认为@noeckel 写了一个很棒的函数。
  • @heike 我尝试了同样的事情,结果也一样。我的回忆是我把它归因于顶点颜色 PDF 导出中的一个错误,但我没有进一步追究。
【解决方案3】:

如果您要导出为 PDF、EP 或 WMF,那么即使您对图形有光栅化组件,文本也应保留为矢量。

我认为诀窍是在ListDensityPlot 命令中将绘图点的数量设置为某个较低的数字,然后正常导出为 PDF。

【讨论】:

  • 我希望生成一个带有非光栅化文本的光栅化图,然后将其导出。即使调整MaxPlotPoints,对于一些需要大量点的更复杂的图表也可能无济于事。
  • 另外,使用MaxPlotPoints->2 这是最小的可能选项,不会改变导出的文件大小。
【解决方案4】:

仅绘制函数而不是列表如何?

plot=DensityPlot[Exp[-(f - f0)^2/25^2], {f0, 500, 700}, {f, 300, 900}, 
 Epilog -> {Thick, Line[{{500, 500}, {700, 700}}]}, PlotPoints -> 50]

Export["test.pdf", plot]

文件大小 1.1MB

【讨论】:

  • 这是一个样本数据集。在实践中,我正在处理许多计算机模拟的输出。
  • 而且绘制的函数远比直线复杂。
  • @Eli Lansey 您能否更新有关现实生活数据的信息,是 3D 还是将其转换为 3D 等等。也许提供一个样本。所以你想将函数图覆盖到列表的密度图上?有 Show、Overlay 和 Inset(根据 Heike 的示例)。
  • 问题中的data 是人为构造的、简单但体面的代表我通常使用的数据的类型、格式和大小。然后,我将数据集与理论模型进行比较,并将其覆盖在图表上。我的目标是获得一个较小的导出文件以包含在出版物中。
猜你喜欢
  • 2011-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-04
  • 1970-01-01
  • 2013-10-01
  • 1970-01-01
  • 2018-01-29
相关资源
最近更新 更多