4

在 Mathematica 中保存图形时,是否可以以 EPS 格式保存不透明的图形?例如,

Plot[Evaluate[Table[BesselJ[n, x], {n, 4}]], {x, 0, 10}, 
 Filling -> Axis]

给出了下图,它以 EPS 以外的任何格式整齐地保存。

Mma 的透明度

如果我尝试保存到 EPS(在 Mathematica 7 中),结果看起来像

来自 Mma7 的 EPS

在 Mathematica 8 中,它看起来像

来自 Mma8 的 EPS

有谁知道如何在 EPS 图中获得不透明度(或者如果这可能)?“使用光栅化实现透明度”选项在缩放时看起来不像真正的 EPS 那样令人印象深刻。

4

3 回答 3

3

在这种情况下,我通常会光栅化我的图形。尝试

Rasterize[Plot[Evaluate[Table[BesselJ[n, x], {n, 4}]],
  {x, 0, 10}, Filling -> Axis], RasterSize -> 600, ImageSize -> 400]

当然,结果将不可扩展,并且会占用更多内存。您可以通过将 RasterSize 设置为大于 ImageSize 来部分解决可伸缩性问题,就像我在这里所做的那样。

于 2011-03-24T09:40:41.377 回答
3

好的,所以 EPS 不能支持真正的透明度/不透明度 - 但这并不意味着 Mathematica 7 可以原谅做如此糟糕的工作。正如我的 Mathematica 8 所证明的那样,可以让它看起来更好。

Mathematica 7 输出的问题在于,当您真正想要较浅的颜色时,它使用与曲线相同的颜色进行填充。EPS 是一种纯文本格式,因此编写一个快速的 hack 非常容易。这是关于PS图形的快速教程。

在 PS 图形中,你定义一个路径,然后你说你想要它是描边(线条)还是填充(区域)——或者其他我们不需要担心的事情。颜色被设置并保持在那里,直到它们被重置。所以我简单的导入Mma7生成的EPS,找到所有填充的路径。对于每个填充路径,您可以找到以前的颜色并将填充命令上方的颜色重置为更亮的颜色。

所以这是一个例子(我没有费心将它打包成一个脚本/模块)。所有输出均来自 Mathematica 7.0.1

p = Plot[Evaluate[Table[BesselJ[n, x], {n, 4}]], {x, 0, 10}, Filling -> Axis]

原始图像

使用 . 导出到 EPS 文件Export["BesselJs7.eps", p]。这会产生一个可怕的图形 原EPS

好的,现在“修复”

pList = Import["BesselJs7.eps", "List"];  (* Import image as a list of strings *)
FList = Flatten@Position[pList, "F"];     (* find all fill commands            *)

请注意,EPS 文件有/F { fill} bind def定义快捷方式的行F。此外,您可以检查是否pList[[FList - 1]]产生了"closepath"s 列表。

FColorList = {}; (* get list of colors associated with fills *)
Catch[Do[
  i = 0; rgb = True; newpath = True;
  While[rgb || newpath,
   (*Print[{f,i,f-i,rgb,newpath,pList[[f-i]]}];*)
   If[rgb && StringMatchQ[pList[[f - i]], __ ~~ "r"], rgb = False; 
    AppendTo[FColorList, pList[[f - i]]]];
   If[newpath && StringMatchQ[pList[[f - i]], "newpath" ~~ __], 
    newpath = False; np[f] = f - i];
   If[f - i == 1, Throw[{f, rgb, newpath}]];
   i++],
  {f, FList}]]

现在创建新颜色的技巧 - 我所做的就是将 0.5 添加到每个 rgb 值。这绝对可以做得更好:

FColorListNew = Table[Most@ToExpression@StringSplit[f] + .5, 
                {f, FColorList}] /. _?(# > 1 &) -> 1.;
FColorListNew = Table[StringJoin[{Riffle[ToString /@ f, " "], " r"}],
                {f, FColorListNew}];

最后,插入新颜色并将其写回:

Do[pList = Insert[pList, FColorListNew[[i]], np[FList[[i]]] + i], 
   {i, Length[FList]}]
Export["BesselJsFixed.eps", pList, "List"]

固定每股收益

有些事情,比如寻找newpath地点,是不必要的,整个事情可能会被整理好。但是我现在已经花了足够的时间了!

于 2011-03-25T02:42:13.823 回答
1

基于 Mark 的回答,要导出具有透明度的 PNG,请使用:

Export[
  "testfile.png",
  Plot[Evaluate[Table[BesselJ[n, x], {n, 4}]], {x, 0, 10}, Filling -> Axis],
  ImageSize -> 600,
  Background -> None
]
于 2011-04-05T10:05:01.443 回答