Бывают случаи, когда экспорт в PDF-изображение просто хлопотен. Если данные, которые вы строите, содержат много точек, тогда ваша фигура будет большого размера, и просмотрщик PDF по вашему выбору будет тратить большую часть своего времени на рендеринг этого высококачественного изображения. Таким образом, мы можем экспортировать это изображение в формате JPEG, PNG или TIFF. С определенного вида изображение будет отличным, но при увеличении изображение будет выглядеть искаженным. В некоторой степени это хорошо для фигуры, которую мы строим, но если ваше изображение содержит текст, тогда этот текст будет выглядеть пиксельным.
Чтобы попытаться получить лучшее из обоих миров, мы можем разделить эту фигуру на две части: оси с метками и трехмерное изображение. Таким образом, оси можно экспортировать в формате PDF или EPS, а 3D-фигуры - в растр. Хотелось бы знать, как позже объединить эти два в Mathematica, поэтому на данный момент мы можем использовать редактор векторной графики, такой как Inkscape или Illustrator, чтобы объединить их.
Мне удалось добиться этого для сюжета, который я сделал в публикации, но это подтолкнуло меня к созданию процедур в Mathematica для автоматизации этого процесса. Вот что у меня есть:
SetDirectory[NotebookDirectory[]];
SetOptions[$FrontEnd, PrintingStyleEnvironment -> "Working"];
Мне нравится запускать записную книжку, установив рабочий каталог в каталог записной книжки. Поскольку я хочу, чтобы мои изображения имели размер, который я указал, я установил рабочую среду стиля печати, проверьте this для получения дополнительной информации.
in = 72;
G3D = Graphics3D[
AlignmentPoint -> Center,
AspectRatio -> 0.925,
Axes -> {True, True, True},
AxesEdge -> {{-1, -1}, {1, -1}, {-1, -1}},
AxesStyle -> Directive[10, Black],
BaseStyle -> {FontFamily -> "Arial", FontSize -> 12},
Boxed -> False,
BoxRatios -> {3, 3, 1},
LabelStyle -> Directive[Black],
ImagePadding -> All,
ImageSize -> 5 in,
PlotRange -> All,
PlotRangePadding -> None,
TicksStyle -> Directive[10],
ViewPoint -> {2, -2, 2},
ViewVertical -> {0, 0, 1}
]
Здесь мы устанавливаем вид сюжета, который мы хотим сделать. Теперь давайте создадим наш сюжет.
g = Show[
Plot3D[Sin[x y], {x, 0, Pi}, {y, 0, Pi},
Mesh -> None,
AxesLabel -> {"x", "y", "z"}
],
Options[G3D]
]
![enter image description here](https://i.stack.imgur.com/Lx44o.png)
Теперь нам нужно найти способ разделения. Начнем с рисования осей.
axes = Graphics3D[{}, AbsoluteOptions[g]]
![enter image description here](https://i.stack.imgur.com/j6PY8.png)
fig = Show[g,
AxesStyle -> Directive[Opacity[0]],
FaceGrids -> {{-1, 0, 0}, {0, 1, 0}}
]
![enter image description here](https://i.stack.imgur.com/QE4JU.png)
Я включил грани сетки, чтобы мы могли сопоставить фигуру с осью в процессе редактирования. Теперь мы экспортируем оба изображения.
Export["Axes.pdf", axes];
Export["Fig.pdf", Rasterize[fig, ImageResolution -> 300]];
Вы получите два файла PDF, которые вы можете редактировать и объединять в PDF или EPS. Хотелось бы, чтобы все было так просто, но это не так. Если вы действительно сделали это, вы получите это:
![enter image description here](https://i.stack.imgur.com/5chBj.png)
Две цифры разных размеров. Я знаю, что файл axes.pdf правильный, потому что когда я открываю его в Inkspace, размер фигуры составляет 5 дюймов, как я ранее указывал.
Я упоминал ранее, что мне удалось получить это на одном из моих участков. Я буду чистить файл и менять графики, чтобы сделать его более доступным для всех, кто хочет убедиться, что это действительно так. В любом случае, кто-нибудь знает, почему я не могу получить два файла PDF одинакового размера? Также имейте в виду, что мы хотим получить симпатичный сюжет для растеризованной фигуры. Спасибо за ваше время.
PS.
В качестве бонуса, мы можем избежать редактирования поста и просто объединить две цифры в Mathematica? Растеризованная версия и версия с векторной графикой.
EDIT:
Спасибо rcollyer за его комментарий. Я публикую результаты своего комментария.
Следует упомянуть, что при экспорте осей нам нужно установить Background
в None
, чтобы получить прозрачную картинку.
Export["Axes.pdf", axes, Background -> None];
Export["Fig.pdf", Rasterize[fig, ImageResolution -> 300]];
a = Import["Axes.pdf"];
b = Import["Fig.pdf"];
Show[b, a]
![enter image description here](https://i.stack.imgur.com/FiHeR.png)
И затем экспорт рисунка дает желаемый эффект
Export["FinalFig.pdf", Show[b, a]]
![enter image description here](https://i.stack.imgur.com/qsrjA.png)
Оси сохраняют прекрасные компоненты векторной графики, в то время как рисунок теперь является Rasterized версией того, что мы нарисовали. Но главный вопрос все еще остается.
Как сделать так, чтобы две цифры совпадали?
UPDATE:
На мой вопрос ответил Алексей Попков. Я хотел бы поблагодарить его за то, что он нашел время, чтобы разобраться в моей проблеме. Следующий код является примером для тех, кто хочет использовать технику, которую я упоминал ранее. Пожалуйста, смотрите ответ Алексея Попкова за полезные комментарии в его коде. Ему удалось заставить его работать в Mathematica 7, а в Mathematica 8 он работает еще лучше. Вот результат:
SetDirectory[NotebookDirectory[]];
SetOptions[$FrontEnd, PrintingStyleEnvironment -> "Working"];
$HistoryLength = 0;
in = 72;
G3D = Graphics3D[
AlignmentPoint -> Center, AspectRatio -> 0.925, Axes -> {True, True, True},
AxesEdge -> {{-1, -1}, {1, -1}, {-1, -1}}, AxesStyle -> Directive[10, Black],
BaseStyle -> {FontFamily -> "Arial", FontSize -> 12}, Boxed -> False,
BoxRatios -> {3, 3, 1}, LabelStyle -> Directive[Black], ImagePadding -> 40,
ImageSize -> 5 in, PlotRange -> All, PlotRangePadding -> 0,
TicksStyle -> Directive[10], ViewPoint -> {2, -2, 2}, ViewVertical -> {0, 0, 1}
];
axesLabels = Graphics3D[{
Text[Style["x axis (units)", Black, 12], Scaled[{.5, -.1, 0}], {0, 0}, {1, -.9}],
Text[Style["y axis (units)", Black, 12], Scaled[{1.1, .5, 0}], {0, 0}, {1, .9}],
Text[Style["z axis (units)", Black, 12], Scaled[{0, -.15, .7}], {0, 0}, {-.1, 1.5}]
}];
fig = Show[
Plot3D[Sin[x y], {x, 0, Pi}, {y, 0, Pi}, Mesh -> None],
ImagePadding -> {{40, 0}, {15, 0}}, Options[G3D]
];
axes = Show[
Graphics3D[{}, FaceGrids -> {{-1, 0, 0}, {0, 1, 0}},
AbsoluteOptions[fig]], axesLabels,
Epilog -> Text[Style["Panel A", Bold, Black, 12], ImageScaled[{0.075, 0.975}]]
];
fig = Show[fig, AxesStyle -> Directive[Opacity[0]]];
Row[{fig, axes}]
В этот момент вы должны увидеть это:
![enter image description here](https://i.stack.imgur.com/Myu9Z.png)
Увеличение обеспечивает разрешение вашего изображения. Вам следует попробовать разные значения, чтобы увидеть, как это изменит вашу картину.
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]]];
Экспорт их
Export["Result.pdf", result];
Export["Result.eps", result];
Единственное различие, которое я обнаружил между M7 и M8 с использованием приведенного выше кода, заключается в том, что M7 неправильно экспортирует файл eps. Кроме того, теперь все работает нормально. :)
![enter image description here](https://i.stack.imgur.com/YlZIR.png)
В первом столбце показан результат, полученный от M7. Сверху - версия в формате eps с размером файла 614 КБ, снизу - версия в формате PDF с размером файла 455 КБ. Второй столбец показывает вывод, полученный из M8. Сверху - версия eps с размером файла 643 КБ, снизу - версия PDF с размером файла 463 КБ.
Надеюсь, вы найдете это полезным. Пожалуйста, проверьте ответ Алексея, чтобы увидеть комментарии в его коде, они помогут вам избежать ошибок с Mathematica.