Как уменьшить размер файла экспортируемых графиков, сохраняя метки четкими - PullRequest
12 голосов
/ 03 января 2012

При экспорте довольно сложных графиков (особенно ListDensityPlot) в формате PDF или EPS (например, для публикации) размер получаемого файла может быть довольно большим. Например:

data = Flatten[Table[{f0, f, Exp[-(f - f0)^2/25^2]}, {f0, 500, 700, 5}, {f, 300, 
 900}], 1];
plot=ListDensityPlot[data,PlotRange->{Automatic,Automatic,{0,1}},InterpolationOrder->0]

Mathematica graphics

Этот пример набора данных порядка того размера, с которым я обычно работаю. Когда я экспортирую, используя Export["C:\\test.pdf", plot], он генерирует PDF-файл размером 23,9 МБ. Если я вместо этого попробую Export["C:\\test1.pdf", Rasterize[plot]], это будет намного меньше, но целостность и изменяемость изображения естественным образом страдают.

Это еще более усложняется, если моя фактическая фигура представляет собой комбинированный сюжет, такой как ( Редактировать : f переходит к 900)

plot2 = Show[plot, Plot[x, {x, 500, 900}, PlotStyle -> Thick]]

Mathematica graphics

(или с некоторым использованием Epilog), где я бы хотел, чтобы фон ListDensityPlot был растеризован, но оставил другую разметку и графики в виде `` вектора ''. Или, по крайней мере, метки кадров не растеризованы.

Есть ли способ сделать это?

Или для достижения той же цели другим умным методом?


Обновление

Я проверил связанный с этим вопрос, но это должно быть намного сложнее, чем нужно (по сути, экспорт, а затем импорт). Я смог использовать некоторые приемы в этом вопросе, чтобы извлечь график отдельно от осей:

axes = Graphics[{}, Options[plot2]]

Mathematica graphics

plots = Graphics[plot2[[1]]]

Mathematica graphics

Но, член plots теряет AspectRatio и PlotRange и т. Д. plots можно ударить с помощью Rasterize, но это требует размерной фиксации.

А потом, как их объединить?

Ответы [ 4 ]

6 голосов
/ 04 января 2012

Это именно та проблема, для которой я написал функцию, связанную здесь: http://pages.uoregon.edu/noeckel/computernotes/Mathematica/listContourDensityPlot.html

Она основана на той же идее, что и в ответе Хайке - я просто добавил еще несколько функций, чтобы вы моглисмело меняйте пропорции, непрозрачность и совмещайте с другими графиками.Смотрите мой комментарий в ответе Хайке.

Чтобы попробовать это с вашими данными, сделайте что-то вроде этого:

plot = Show[
 listContourDensityPlot[data, 
  PlotRange -> {Automatic, Automatic, {0, 1}}, 
  InterpolationOrder -> 0, Contours -> None], 
 Graphics[Line[{{500, 500}, {700, 700}}]]]

С родительской страницей тоже связаны несколько похожих функций.1009 *

5 голосов
/ 04 января 2012

Если вы имеете дело с 2D-графиками, вы можете объединить растеризованный график с векторизованными осями, используя Inset.Например,

plot2 = ListDensityPlot[data, 
   PlotRange -> {Automatic, Automatic, {0, 1}}, 
   InterpolationOrder -> 0, Axes -> False, Frame -> False, 
   PlotRangePadding -> 0];

plotRange = PlotRange /. AbsoluteOptions[plot2, PlotRange];

plot = Graphics[{
  Inset[Image[plot2], plotRange[[All, 1]], {Left, Bottom}, Scaled[{.96, .96}]],
  Line[{{500, 500}, {700, 700}}]}, 
 Frame -> True, AspectRatio -> 1, 
 PlotRange -> plotRange, PlotRangePadding -> Scaled[.02]]

Export["test.pdf", plot]

создает PDF-файл размером около 400 КБ.Рамка, метки и черная линия по-прежнему векторизованы, поэтому при увеличении они остаются резкими:

detail of image

0 голосов
/ 04 января 2012

Как насчет простого построения функции вместо создания списка?

plot=DensityPlot[Exp[-(f - f0)^2/25^2], {f0, 500, 700}, {f, 300, 900}, 
 Epilog -> {Thick, Line[{{500, 500}, {700, 700}}]}, PlotPoints -> 50]

Export["test.pdf", plot]

размер файла 1,1 МБ

0 голосов
/ 04 января 2012

Если вы экспортируете в формате PDF, EP или WMF, текст должен оставаться в качестве векторов, даже если у вас есть растровый компонент для графики.

Я думаю, что хитрость заключается в том, чтобы установить число точек печати на какое-то меньшее число в команде ListDensityPlot, а затем экспортировать в формате PDF как обычно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...