Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wolfram mathematica 如何在保持标签清晰的同时减小导出绘图的文件大小_Wolfram Mathematica - Fatal编程技术网

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