在Mathematica中保存图形时,是否可以以EPS格式保存不透明的图形?例如,
Plot[Evaluate[Table[BesselJ[n, x], {n, 4}]], {x, 0, 10},
Filling -> Axis]
给出了下图,它以EPS以外的任何格式整齐地保存。
如果我尝试保存到EPS(在Mathematica 7中),结果看起来像
在Mathematica 8中,它看起来像
有没有人知道如何在EPS图中获得不透明度(或者如果可能的话)? “使用栅格化透明度”选项看起来并不像缩放时的真实EPS那样令人印象深刻。
答案 0 :(得分:3)
我通常在这种情况下栅格化我的图形。尝试
Rasterize[Plot[Evaluate[Table[BesselJ[n, x], {n, 4}]],
{x, 0, 10}, Filling -> Axis], RasterSize -> 600, ImageSize -> 400]
当然,结果将无法扩展,并且可能占用更多内存。您可以通过将RasterSize设置为大于ImageSize来部分解决可伸缩性问题,就像我在这里所做的那样。
答案 1 :(得分:3)
好的,因此EPS不能支持真正的透明度/不透明度 - 但这并不意味着Mathematica 7可以免于做这么糟糕的工作。正如我的Mathematica 8所证明的那样,它可以让它看起来更好。
Mathematica 7输出的问题在于,当你真的想要更浅的颜色时,它使用与曲线相同的颜色。 EPS是一种纯文本格式,因此编写快速入侵非常容易。这是PS图形上的quick tute。
在PS图形中,你定义一个路径,然后你说你想要它描边(线)还是填充(区域) - 或者我们不需要担心的其他事情。颜色被设置并保持在那里直到它们被重置。所以我只需导入Mma7生成的EPS并找到所有填充的路径。对于每个填充的路径,您可以找到上一个颜色,并将填充命令上方的颜色重置为更轻的颜色。
所以这是一个例子(我没有费心将它打包成一个脚本/模块)。 所有输出均来自Mathematica 7.0.1
p = Plot[Evaluate[Table[BesselJ[n, x], {n, 4}]], {x, 0, 10}, Filling -> Axis]
使用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"
的列表。
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}]]
现在是创建新颜色的黑客 - 我所做的就是为每个rgb值添加.5。这绝对可以做得更好:
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
位置,是不必要的,整个事情可能会被整理掉。但我现在已经花了足够的时间来做它!
答案 2 :(得分:1)
根据Mark的回答,要导出具有透明度的PNG,请使用:
Export[
"testfile.png",
Plot[Evaluate[Table[BesselJ[n, x], {n, 4}]], {x, 0, 10}, Filling -> Axis],
ImageSize -> 600,
Background -> None
]