Оптимизация размера файлов eps/pdf, сгенерированных Mathematica

Как оптимизировать размер файла 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, если это имеет значение).

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

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


person Piotr Migdal    schedule 31.10.2011    source источник
comment
Сильно связанная тема (но о 3D-графике): Mathematica: Растры в 3D-графике.   -  person Alexey Popkov    schedule 31.10.2011
comment
@AlexeyPopkov спасибо, это решает проблему.   -  person Piotr Migdal    schedule 31.10.2011


Ответы (3)


Возможно, вы уже поняли, как применить ответ Алексея в предоставленной им ссылке. Но на случай, если у вас возникнут проблемы, я расскажу, как я применяю эту технику к 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]
]

Вывод

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

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]]]

Выход2

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

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]]]
person jmlopez    schedule 01.11.2011
comment
Это работает, большое спасибо! На моем компьютере размеры: 180 КБ (eps) и 123 КБ (pdf). - person Piotr Migdal; 02.11.2011
comment
Однако для файла eps фон черный, закрывающий оси; Export["Result.eps", result, Background -> White] не помогает. Для pdf-файла все работает нормально. - person Piotr Migdal; 02.11.2011
comment
@PiotrMigdal, я думаю, это может быть из-за того, что ты используешь ММА7. Это то, на что я указал в Растрах в 3D. Если перейти на MMA8, то файл eps должен выйти нормально. Это просто ошибка в версии 7, я думаю. Рад, что это помогает. - person jmlopez; 02.11.2011
comment
Метки осей имеют десятичную точку из-за ошибки в AbsolutOptions — просто посмотрите на FrameTicks /. AbsoluteOptions[plot]. - person Alexey Popkov; 04.11.2011
comment
@AlexeyPopkov, Есть идеи, как это исправить? В прошлом мне везло, что метки выводились правильно, поскольку большую часть времени они были десятичными. Для тех немногих, которые выходят неправильно, я обычно исправляю FrameTicks один за другим, так как их немного. - person jmlopez; 04.11.2011
comment
Используйте FilterRules[AbsoluteOptions[plot], Except[FrameTicks]] вместо AbsoluteOptions[plot] в качестве обходного пути. - person Alexey Popkov; 04.11.2011
comment
Для меня это не работало, пока я не установил PlotRange вручную, и, что было самым важным, мне пришлось указать также 3-е измерение PlotRange, хотя я строил 2D-график. Но я получил потрясающий результат. ListPlot с более чем 80 000 значений, который имел 5,3 МБ, имеет после применения этой подсказки 83 КБ. Спасибо! - person matejuh; 22.04.2012
comment
@matejuh, не могу точно сказать, что все получится. Обычно вы должны быть очень конкретными во всем, что касается Mathematica. Рад, что у вас получилось с хорошими результатами. - person jmlopez; 26.04.2012

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

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

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

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

person Daniel Lichtblau    schedule 31.10.2011
comment
Спасибо. К сожалению, как я тестировал, ps2pdf plot.eps уступает в файле размером 7,7 МБ, так что это еще хуже. - person Piotr Migdal; 31.10.2011
comment
@Piotr Migdal Ой. У меня никогда такого не было. Мои всегда кажутся меньше в 10 раз или около того. - person Daniel Lichtblau; 31.10.2011

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

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

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

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

person DavidC    schedule 31.10.2011
comment
Спасибо. Но на самом деле я уже знаю этот вариант, и это не то, что я ищу. ImageResolution -> res — это растеризация как точек данных, так и осей. - person Piotr Migdal; 31.10.2011