4

グラフィックをMathematicaで保存する場合、不透明度のある図形をEPS形式で保存することはできますか?例えば、

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

EPS以外の形式できれいに保存される次の図を示します。

Mmaの透明性

EPS(Mathematica 7)に保存しようとすると、結果は次のようになります。

Mma7からのEPS

Mathematica8では次のようになります

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は真の透明度/不透明度をサポートできませんが、それはMathematica7がそのような悪い仕事をすることを許されているという意味ではありません。私のMathematica8で証明されているように、見栄えを良くすることは可能です。

Mathematica 7の出力の問題は、本当に明るい色が必要なときに、曲線と同じ色を塗りつぶしに使用することです。EPSはプレーンテキスト形式であるため、簡単なハックを作成するのは非常に簡単です。これがPSグラフィックスの簡単な説明です。

PSグラフィックスでは、パスを定義してから、それをストローク(線)にするか塗りつぶす(領域)にするか、またはその他の心配する必要がないことを指定します。色が設定され、リセットされるまでそこにとどまります。したがって、Mma7によって生成されたEPSをインポートして、すべての塗りつぶされたパスを見つけます。塗りつぶされたパスごとに、前の色を見つけて、塗りつぶしコマンドのすぐ上の色をより明るい色にリセットします。

それで、ここに例があります(私はそれを単一のスクリプト/モジュールにパッケージ化することを気にしませんでした)。すべての出力はMathematica7.0.1からのものです

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

元の画像

を使用してEPSファイルにエクスポートしますExport["BesselJs7.eps", p]。これは次のような恐ろしいグラフィックを生成します オリジナルEPS

OK、今「修正」

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、ショートカットを定義する行があることに注意してくださいFpList[[FList - 1]]また、sのリストが生成されることを確認できます"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"]

固定EPS

場所を見つけるなどのいくつかのことnewpathは不要であり、おそらくすべてを片付けることができます。しかし、私は今のところそれに十分な時間を費やしました!

于 2011-03-25T02:42:13.823 に答える
1

マークの答えに基づいて、透明度のある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 に答える