Mathematica: Растры в трехмерной графике

Бывают случаи, когда экспорт в изображение в формате PDF просто затруднен. Если данные, которые вы рисуете, содержат много точек, ваша фигура будет большой по размеру, и программа просмотра PDF-файлов по вашему выбору будет тратить большую часть своего времени на рендеринг этого высококачественного изображения.Таким образом, мы можем экспортировать это изображение в формате jpeg, png или tiff. Изображение будет хорошим с определенного ракурса, но при увеличении оно будет выглядеть искаженным. Это в некоторой степени подходит для фигуры, которую мы рисуем, но если ваше изображение содержит текст, то этот текст будет выглядеть пиксельным.

Чтобы попытаться получить лучшее из обоих миров, мы можем разделить эту фигуру на две части: оси с метками и трехмерное изображение. Таким образом, оси могут быть экспортированы как pdf или eps, а трехмерная фигура - как растр. Мне жаль, что я не знал, как позже объединить эти два в 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

Теперь нам нужно найти способ разделения. Начнем с рисования осей.

axes = Graphics3D[{}, AbsoluteOptions[g]]

enter image description here

fig = Show[g, 
  AxesStyle -> Directive[Opacity[0]],
  FaceGrids -> {{-1, 0, 0}, {0, 1, 0}}
 ]

enter image description here

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

Export["Axes.pdf", axes];
Export["Fig.pdf", Rasterize[fig, ImageResolution -> 300]];

Вы получите два файла pdf, которые вы можете редактировать и объединить в pdf или eps. Я бы хотел, чтобы это было так просто, но это не так. Если вы действительно это сделали, вы получите следующее:

enter image description here

Две фигурки имеют разные размеры. Я знаю, что файл axes.pdf верен, потому что, когда я открываю его в Inkspace, размер рисунка составляет 5 дюймов, как я указывал ранее.

Я упоминал ранее, что мне удалось получить это с помощью одного из моих графиков. Я почищу файл и изменю графики, чтобы сделать его более доступным для всех, кто хочет убедиться, что это действительно так. В любом случае, кто-нибудь знает, почему я не могу получить два файла pdf одинакового размера? Также имейте в виду, что мы хотим получить красивый график для растеризованной фигуры. Спасибо за уделенное время.

PS. В качестве бонуса, можем ли мы избежать редактирования поста и просто объединить две цифры в математике? Растрированная версия и версия векторной графики, то есть.


РЕДАКТИРОВАТЬ:

Спасибо rcollyer за его комментарий. Я публикую результаты его комментария.

Следует упомянуть, что когда мы экспортируем оси, нам нужно установить Фон на Нет , чтобы мы могли получить прозрачный картина.

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

А затем экспорт фигуры дает желаемый эффект

Export["FinalFig.pdf", Show[b, a]]

enter image description here

Оси сохраняют красивые компоненты векторной графики, в то время как фигура теперь является растеризованной версией того, что мы построили. Но главный вопрос по-прежнему остается. Как сделать так, чтобы две цифры совпадали?

ОБНОВЛЕНИЕ:

На мой вопрос ответил Алексей Попков. Я хотел бы поблагодарить его за то, что он нашел время разобраться в моей проблеме. Следующий код является примером для тех из вас, кто хочет использовать технику, о которой я упоминал ранее. Пожалуйста, смотрите ответ Алексея Попкова для полезных комментариев в его коде. Ему удалось заставить его работать в 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

Увеличение влияет на разрешение вашего изображения. Вы должны попробовать разные значения, чтобы увидеть, как это изменит ваше изображение.

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

Первый столбец показывает результат, полученный от M7. Сверху - версия в формате eps с размером файла 614 кб, внизу - версия в формате pdf с размером файла 455 кб. Во втором столбце показаны выходные данные, полученные от M8. Сверху - версия в формате eps с размером файла 643 кб, внизу - версия в формате pdf с размером файла 463 кб.

Надеюсь, вам это пригодится. Пожалуйста, проверьте ответ Алексея, чтобы увидеть комментарии в его коде, они помогут вам избежать ошибок с Mathematica.

17
задан Community 23 May 2017 в 12:24
поделиться