【问题标题】:Opacity in EPS figuresEPS 数据中的不透明度
【发布时间】:2011-04-05 18:05:01
【问题描述】:

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

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

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

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

在 Mathematica 8 中看起来像

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

【问题讨论】:

  • Wikipedia claims EPS 不支持真正的透明度。但是 PDF 确实...我假设您想要 LaTeX 文档的图形?为什么不直接使用 pdflatex?
  • 附带说明:Mma8 的 EPS 导出中的颜色要好得多!
  • @Simon:我主要使用 MATLAB,并且来自 MATLAB 的 EPS 图形中的边界框非常紧凑(就像在 Mma 中一样)。另一方面,来自 MATLAB 的 PDF 文件有额外的空格。所以为了避免不得不处理转换、裁剪等,我只是使用乳胶,而不是 pdflatex。我知道我可以使用epstopdf 包在pdflatex 中进行即时转换。但是,一些期刊特定的样式表打破了这一点,并且与该包不兼容。
  • @Simon:我确实知道 EPS 不支持真正的透明度。但是,不透明度可以通过等效的较浅颜色充分表示,并且想知道是否有这样的选项可以将不透明度后的颜色更改为在 Mma 中等效的纯浅色。
  • 使用 Mma8,绘图可以正确导出,并具有对 EPS 的模拟透明度。您使用的是哪个版本的 Mma?

标签: wolfram-mathematica opacity eps


【解决方案1】:

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

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

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

【讨论】:

  • @Mark:虽然我不想光栅化,但我想这似乎是唯一的方法。或者,我可以吸收它并使用 PDF 或获取 Mma 8。
  • 这是 3D 图形的标准建议,可以生成非常漂亮的图像,而文件大小实际上会减小。 PDF也有缺点。例如,对于 PDFTeX,您不能使用 psfrag,它可以让您轻松地将文档的环境字体嵌入到图像中。
【解决方案2】:

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

Mathematica 7 输出的问题在于,当您真正想要较浅的颜色时,它使用与曲线相同的颜色进行填充。 EPS 是一种纯文本格式,因此编写一个快速的 hack 非常容易。这是 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"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 的位置,是不必要的,整个事情可能会被整理。但是我现在已经花足够的时间了!

【讨论】:

  • 哇西蒙!你有很多空闲时间来摆弄mma。感谢 mma7 的洞察力和“修复”。看到你的方法给了我一个“解决”透明度问题的想法。鉴于您可以导入路径和颜色,应该可以找到相交区域并使用(rgb_1+...+rgb_n)/n 重新着色重叠,其中n 是重叠区域的数量。目前我对 mma 的了解还不足以承担这项任务,但肯定有一天会很有趣。
  • @d'o-o'b:今天早上花了一个多小时......如果我在尝试之前阅读有关 PS 图形的内容会更快写“修复”。另外,我没有空闲时间——我打算把每一秒都花在写论文上!我考虑过混合......应该是可能的,但需要更多的工作。
  • 我并没有恶意。我距离完成自己的论文还有一年左右的时间,所以我完全知道你想要尝试做所有其他事情而不是需要做的事情的感觉。
【解决方案3】:

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

Export[
  "testfile.png",
  Plot[Evaluate[Table[BesselJ[n, x], {n, 4}]], {x, 0, 10}, Filling -> Axis],
  ImageSize -> 600,
  Background -> None
]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-23
    • 2012-08-13
    • 2012-01-13
    • 2016-10-12
    • 2014-01-05
    • 2020-07-12
    • 1970-01-01
    • 2017-01-11
    相关资源
    最近更新 更多