Бывают случаи, когда экспортировать в 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]
]
Теперь нам нужно найти способ разделения. Давайте начнем с рисования осей.
axes = Graphics3D[{}, AbsoluteOptions[g]]
fig = Show[g,
AxesStyle -> Directive[Opacity[0]],
FaceGrids -> {{-1, 0, 0}, {0, 1, 0}}
]
Я включил facegrids, чтобы мы могли сопоставить фигуру с осью в процессе редактирования сообщения. Теперь мы экспортируем оба изображения.
Export["Axes.pdf", axes];
Export["Fig.pdf", Rasterize[fig, ImageResolution -> 300]];
Вы получите два pdf файла, которые вы можете редактировать и объединить в pdf или eps. Хотелось бы, чтобы все было так просто, но это не так. Если вы действительно это сделали, вы получите следующее:
Две цифры имеют разные размеры. Я знаю axes.pdf правильно, потому что, когда я открываю его в Inkspace, размер фигуры составляет 5 дюймов, как я уже указывал ранее.
Я уже упоминал, что мне удалось получить это с одним из моих сюжетов. Я очищу файл и изменю графики, чтобы сделать его более доступным для тех, кто хочет видеть, что это на самом деле правда. В любом случае, кто-нибудь знает, почему я не могу получить два файла PDF одинакового размера? Кроме того, имейте в виду, что мы хотим получить красивый сюжет для Растрированной фигуры. Спасибо за ваше время.
PS. В качестве бонуса мы можем избежать редактирования сообщений и просто объединить две фигуры в математике? Растрированная версия и версия векторной графики.
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]
И затем, экспорт фигуры дает желаемый эффект
Export["FinalFig.pdf", Show[b, a]]
Оси сохраняют красивые компоненты векторной графики, а фигура теперь представляет собой растеризованную версию того, что мы нарисовали. Но главный вопрос остается. Как вы сопоставляете две цифры?
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}]
На этом этапе вы должны увидеть следующее:
Увеличение зависит от разрешения вашего изображения. Вы должны попробовать разные значения, чтобы увидеть, как это изменит ваше изображение.
fig = Magnify[fig, 5];
fig = Rasterize[fig, Background -> None];
Совместите графику
axes = [email protected][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 файл правильно. Кроме того, сейчас все работает нормально.:)
В первом столбце показан результат, полученный из M7. Top - это версия eps с размером файла 614 kb, нижняя версия - pdf-версия с размером файла 455 kb. Во втором столбце показан результат, полученный от M8. Вершиной является версия eps с размером файла 643 kb, нижняя версия - pdf-версия с размером файла 463 kb.
Надеюсь, вы сочтете это полезным. Ответьте Alexey, чтобы увидеть комментарии в его коде, они помогут вам избежать ошибок с Mathematica.