Оптимизация размера файлов eps / pdf, сгенерированных Mathematica - PullRequest
5 голосов
/ 31 октября 2011

Как оптимизировать размер файла eps или pdf, сгенерированного Mathematica?

Обычно размер файла в 50-100 раз больше, чем должен быть (пример ниже). Для некоторых приложений (например, для размещения рисунка в публикации или, что еще важнее, для размещения на большом плакате) мне нужны оси в векторной графике, поэтому использование растровой графики для всего не лучший вариант для меня.

Будем признательны за любое практическое решение (либо с настройкой правильных опций в Mathematica, либо с помощью дальнейших преобразований в других приложениях).

Например, следующий код, создающий рисунок в формате eps:

plot = ListDensityPlot[
Table[Random[], {100}, {100}],
InterpolationOrder -> 0]

Export["testplot.eps", plot]
Export["testplot.pdf", plot]

создает файл eps размером 3,3 МБ и размером PDF 5 МБ (в Mathematica 7 в Mac OS X 10.6, если это имеет значение).

Для сравнения, график 3х3 с теми же осями имеет размер от 8 кБ (pdf) до 20 кБ (eps). 100x100 точек - это 30 КБ в bmp (и чуть меньше в png).

Проблема аналогична для других типов участков с акцентом на ListPlot3D.

Ответы [ 3 ]

5 голосов
/ 01 ноября 2011

Возможно, вы выяснили, как подать ответ Алексея по предоставленной им ссылке.Но на случай, если у вас возникнут проблемы, я расскажу, как применить эту технику к 2D-графике.

Я нашел трудный путь, который, если вы хотите создать хороший сюжет, должен быть очень специфичным для Mathematica.По этой причине, как вы могли заметить в моем посте Растры в 3D Я создал объект, задающий все параметры, чтобы Mathematica могла быть счастливой.

in = 72;
G2D = Graphics[{},
   AlignmentPoint -> Center, 
   AspectRatio -> 1,
   Axes -> False,
   AxesLabel -> None,
   BaseStyle -> {FontFamily -> "Arial", FontSize -> 12},
   Frame -> True,
   FrameStyle -> Directive[Black],
   FrameTicksStyle -> Directive[10, Black],
   ImagePadding -> {{20, 5}, {15, 5}},
   ImageSize -> 5 in, 
   LabelStyle -> Directive[Black],
   PlotRange -> All,
   PlotRangeClipping -> False,
   PlotRangePadding -> Scaled[0.02]
]; 

Я должен упомянуть здесь, чтоВы должны указать ImagePadding.Если вы установите значение all, ваш eps-файл будет отличаться от того, что Mathematica показывает вам.В любом случае, я думаю, что наличие этого объекта позволяет вам легко изменять свойства.

Теперь мы можем перейти к вашей проблеме:

plot = ListDensityPlot[
  Table[Random[], {100}, {100}],
  InterpolationOrder -> 0,
  Options[G2D]
]

Output

Следующее разделяет оси и растр и объединяет их в результат:

axes = Graphics[{}, AbsoluteOptions[plot]];
fig = Show[plot, FrameStyle -> Directive[Opacity[0]]];
fig = Magnify[fig, 5];
fig = Rasterize[fig, Background -> None];
axes = First@ImportString[ExportString[axes, "PDF"], "PDF"];
result = Show[axes, Epilog -> Inset[fig, {0, 0}, {0, 0}, ImageDimensions[axes]]]

Output2

Единственное отличие, которое я пока не могу объяснить, - это метки осей, онииметь десятичную точку.Наконец, мы экспортируем их:

Export["Result.pdf", result];
Export["Result.eps", result];

В результате получаются файлы размером 115 КБ для файла PDF и 168 КБ для файла EPS.

ОБНОВЛЕНИЕ:

ЕслиВы используете Mathematica 7, файл eps не будет корректно отображаться.Все, что вы увидите, это ваша главная фигура с черными по бокам.Это ошибка в версии 7. Однако это исправлено в Mathematica 8.

Я уже упоминал ранее, что не знаю, почему метки осей были разными.Алексей Попков предложил исправить это.Для создания axes, fig и result используйте следующее:

axes = Graphics[{}, FilterRules[AbsoluteOptions[plot], Except[FrameTicks]]];
fig = Show[plot, FrameStyle -> Directive[Opacity[0]]];
fig = Magnify[fig, 5];
fig = Rasterize[fig, Background -> None];
axes = First@ImportString[ExportString[axes, "PDF"], "PDF"];
result = Show[axes, Epilog -> Inset[fig, {0, 0}, {0, 0}, ImageDimensions[axes]]]
3 голосов
/ 31 октября 2011

У меня был некоторый успех с обоими из следующих действий:

(1) Растрирование графиков перед сохранением.Качество обычно приемлемое, размер значительно падает.

(2) Я сохраняю в postscript, затем (я на машине с Linux) использую ps2pdf, чтобы получить pdf.Это, как правило, значительно меньше, чем сохранение непосредственно в PDF от Mathematica.

Даниэль Лихтблау

2 голосов
/ 31 октября 2011

ImageResolution хорошо работает для .pdf, но у меня не получилось с .eps.

Export["testplot600.pdf", plot, ImageResolution -> 600]

Выходной размер составляет 242 КБ для 600 точек на дюйм и 94 КБ для 300 точек на дюйм. Вы также можете установить ImageSize для Export.

Если вы хотите пойти сторонним маршрутом, я бы порекомендовал GraphicConverter. Это очень надежно и имеет много вариантов.

...