ОК, поэтому 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](https://i.stack.imgur.com/3Juc0.png)
Экспорт в файл EPS с использованием Export["BesselJs7.eps", p]
.Это приводит к ужасной графике, такой как ![original EPS](https://i.stack.imgur.com/ltvop.png)
ОК, теперь "исправление"
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](https://i.stack.imgur.com/sp07j.png)
Некоторые вещи, такие какобнаружение newpath
местоположений не является необходимым, и все это, вероятно, можно привести в порядок.Но я потратил на это достаточно времени!