Непрозрачность в цифрах EPS - PullRequest
4 голосов
/ 24 марта 2011

При сохранении графики в Mathematica возможно ли сохранить фигуры с непрозрачностью в формате EPS? Например,

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

дает следующий рисунок, который аккуратно сохраняется в любом формате, кроме EPS.

Transparency in Mma

Если я попытаюсь сохранить в EPS (в Mathematica 7), результат будет выглядеть как

EPS from Mma7

В Mathematica 8 это выглядит как

EPS from Mma8

Кто-нибудь знает, как получить непрозрачность на графиках EPS (или, если это вообще возможно)? Параметр «Использовать растеризацию для прозрачности» не выглядит столь же впечатляющим, как настоящий EPS при масштабировании.

Ответы [ 3 ]

3 голосов
/ 25 марта 2011

ОК, поэтому EPS не может поддерживать истинную прозрачность / непрозрачность - но это не значит, что Mathematica 7 оправдана за такую ​​плохую работу.Как свидетельствует мой Mathematica 8, можно сделать так, чтобы он выглядел лучше.

Проблема с выводом Mathematica 7 заключается в том, что он использует тот же цвет для заливки, что и для кривых, когда вы действительно хотите более светлый цвет.EPS - это простой текстовый формат, поэтому довольно легко написать быстрый взлом.Вот быстрая настройка на графике PS.

В графике PS вы определяете путь, а затем говорите, хотите ли вы, чтобы он был обведен (линии) или заполнен (области) - или о других вещах, о которых нам не нужно беспокоиться.Цвета установлены и остаются там, пока они не будут сброшены.Поэтому я просто импортирую EPS, созданный Mma7, и нахожу все заполненные пути.Для каждого заполненного пути вы находите предыдущий цвет и сбрасываете цвет чуть выше команды заливки, чтобы он был светлее.

Итак, вот пример (я не удосужился собрать его в один скрипт / модуль).Все данные получены из Mathematica 7.0.1

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

original image

Экспорт в файл EPS с использованием Export["BesselJs7.eps", p].Это приводит к ужасной графике, такой как original 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}]]

Теперь взломать создание новых цветов - все, что я делаю, это добавляю .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"]

fixed EPS

Некоторые вещи, такие какобнаружение newpath местоположений не является необходимым, и все это, вероятно, можно привести в порядок.Но я потратил на это достаточно времени!

3 голосов
/ 24 марта 2011

Я обычно растеризую свою графику в этой ситуации. Попробуйте

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

Конечно, результат не будет масштабируемым и может занять больше памяти. Вы можете частично решить проблему масштабируемости, установив RasterSize больше, чем ImageSize, как я сделал здесь.

1 голос
/ 05 апреля 2011

Опираясь на ответ Марка, чтобы экспортировать PNG с прозрачностью, используйте:

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