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