Wolfram mathematica 如何在保持标签清晰的同时减小导出绘图的文件大小
将相当复杂的绘图(尤其是Wolfram mathematica 如何在保持标签清晰的同时减小导出绘图的文件大小,wolfram-mathematica,Wolfram Mathematica,将相当复杂的绘图(尤其是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->
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文件。如果我改为尝试导出[“C:\\test1.pdf”,光栅化[plot]]它会小得多,但图像的完整性和可重新缩放性自然会受到影响
如果我的实际数字是一个组合图,例如(编辑:f
goes to 900),这就更加复杂了
(或者使用一些Epilog
)我希望将背景ListDensityPlot
光栅化,但将其他标记和绘图保持为“矢量”形式。或者至少,框架标签是非光栅化的
有没有办法做到这一点
或者,通过其他聪明的方法来实现同样的目标
更新 我已经检查了相关的问题,但这肯定比它需要的要复杂得多(基本上是先导出,然后导入)。我已经能够利用这个问题中的一些技巧,分别从轴中提取情节:
axes = Graphics[{}, Options[plot2]]
但是,绘图
术语会丢失方面
和绘图范围
等。可以使用光栅化
点击绘图
,但需要尺寸固定
然后,如何将它们组合在一起?如果您以PDF、EPs或WMF格式导出,则即使图形中有光栅化组件,文本也应保留为矢量
我认为诀窍是在
ListDensityPlot
命令中将绘图点的数量设置为较低的数字,然后以PDF格式正常导出。只绘制函数而不是制作列表如何
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如果处理二维打印,可以使用
插入将光栅化打印与矢量化轴相结合。比如说
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]
生成约400KB的.pdf文件。帧、记号和黑线仍然是矢量化的,因此放大时它们保持锐利:
这正是我编写的函数所针对的问题:
它基于与Heike的回答相同的想法——我只是添加了一些更多的特性,以便您可以安全地更改纵横比、不透明度,并与其他绘图相结合。请看我在海克回答中的评论
要尝试使用数据,请执行以下操作:
plot = Show[
listContourDensityPlot[data,
PlotRange -> {Automatic, Automatic, {0, 1}},
InterpolationOrder -> 0, Contours -> None],
Graphics[Line[{{500, 500}, {700, 700}}]]]
父页面也链接了两个类似的函数。相关问题:感谢您的链接。看来我可以解决这个问题。“取消”一个问题的合适方式是什么?如果有五张“结束”票,我们可以结束一个问题,但通常只有当问题与前面的问题非常相似时,我们才能结束这个问题。然后,封闭式问题作为指向前面问题的指针。我必须更仔细地比较这两个问题,看看它们是否重复。也许现在最好不要做任何事。好吧,这不完全一样。但我可能会用到一些技巧。作为Mathematica标签的活跃成员,您是否考虑过加入Mathematica标签?我们可能需要你的帮助。我希望生成一个带有非光栅化文本的光栅化绘图,并将其导出。即使调整MaxPlotPoints
,对于一些需要大量点的更复杂图形也可能没有帮助。此外,使用MaxPlotPoints->2
这是最小的选项,不会更改导出的文件大小。这是一个示例数据集。实际上,我正在处理许多计算机模拟的输出。绘制的函数比直线复杂得多。@Eli Lansey你能用有关真实生活数据的信息更新它吗,是3D的还是转换成3D的等等。也许可以提供一个示例。你想把函数图叠加到列表的密度图上吗?有Show、Overlay和Inset(根据Heike的例子)。问题中的数据是一个人工构造的、简单的,但很好地代表了我通常使用的数据类型、格式和大小。然后,我将数据集与理论模型进行比较,并将其覆盖在图表上。我的目标是得到一个较小的导出文件以包含在出版物中。我个人也支持这种通用方法。我们只需要小心缩放坐标。用你的绘图试试这个,看看我的意思:显示[绘图,图形[{EdgeForm[Red],FaceForm[],矩形[{0,0},{1000,1000}]}],绘图范围->所有]@noeckel我同意以这种方式使用插入
是相当脆弱的;即使更改纵横比也会破坏它。理想情况下,我想做一些像plot=Graphics[{Texture[plot2],Polygon[Tuples[plotRange][{1,2,4,3}]],vertextexturecordinates->Tuples[{0,1},2][{1,2,4,3}]]},Frame->True]
的事情,但出于某种原因,Mathematica拒绝将生成的绘图导出为pdf格式(至少在我的Mathematica版本中是这样),但是我认为@noeckel写了一个很好的函数。@heike我试过同样的方法,结果也一样。我的记忆是,我把它归因于顶点颜色PDF导出中的一个bug,但我没有进一步追查。哇!这正是我想要的。我基本上可以使用开关等高线->无
将我所有的ListDensityPlot
转换为listContourDensityPlot
。非常感谢!我很好奇绝对选项[p]
与选项[p]
的用法,后者更适合古怪的帧标记规范。我想我可以使用FullOptions,但不仅仅是选项,因为我想避免像Automatic、All等符号值。它们在subsqu中不起作用
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]
plot = Show[
listContourDensityPlot[data,
PlotRange -> {Automatic, Automatic, {0, 1}},
InterpolationOrder -> 0, Contours -> None],
Graphics[Line[{{500, 500}, {700, 700}}]]]