Подтвердить что ты не робот

Как уменьшить размер экспортируемых участков при сохранении ярлыков

При экспорте довольно сложных графиков (особенно 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]], он будет намного меньше, но естественность и rescalability изображения естественно страдает.

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

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

Mathematica graphics

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

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

Или, чтобы достичь той же цели с помощью другого умного метода?


Update

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

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

Mathematica graphics

plots = Graphics[plot2[[1]]]

Mathematica graphics

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

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

4b9b3361

Ответ 1

Это именно та проблема, для которой я написал связанную здесь функцию: 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}}]]]

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

Ответ 2

Если вы имеете дело с 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

Ответ 3

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

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

Ответ 4

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

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.1MB