Прежде чем мы начнем, это не борьба между 2D и 3D-графиками, и это не означает, что 3D-графики превосходят 2D, потому что у них есть одно дополнительное измерение. Фактически, я из тех, кто старается не добавлять в сюжет слишком много, чтобы сюжет потерял свой собственный сюжет. Но бывают случаи, когда вы знаете, что можете лучше рассказывать истории, используя трехмерные сюжеты. Эта статья поможет вам в таких случаях!

3D-сюжеты, построенные правильным образом для правильных целей, всегда ошеломляют. В этой статье мы увидим, как создавать потрясающие 3D-графики с помощью R, используя ggplot2 и rayshader. В то время как ggplot2 может быть знаком любому специалисту в области науки о данных, rayshader - нет. Итак, давайте начнем с небольшого введения в rayshader.

Из описания пакета rayshader:

rayhader - это пакет с открытым исходным кодом для создания 2D и 3D визуализации данных в R. rayhader использует данные высот в базовой R-матрице и комбинацию трассировки лучей, наложения сферической текстуры и наложений. , и окружающая окклюзия для создания красивых топографических 2D и 3D карт. Помимо карт, rayhader также позволяет пользователю преобразовывать объекты ggplot2 в красивую трехмерную визуализацию данных.

Необходимые библиотеки / пакеты:

Последняя версия rayshader доступна на github, которую можно установить с помощью devtools или remotes.

devtools::install_github("tylermorganwall/rayshader")

И убедитесь, что у вас установлена ​​самая последняя версия ggplot2. Если вы любитель аккуратных вселенных, то получите самые свежие новости.

install.packages('tidyverse')

Данные

Чтобы требования этой статьи были минимальными, мы будем использовать faithfuld один из встроенных наборов данных в ggplot2 библиотеке.

> glimpse(faithfuld)
Observations: 5,625
Variables: 3
$ eruptions <dbl> 1.600000, 1.647297, 1.694595, 1.741…
$ waiting   <dbl> 43, 43, 43, 43, 43, 43, 43, 43, 43,…
$ density   <dbl> 0.003216159, 0.003835375, 0.0044355…

Как видите, faithfuld имеет 3 непрерывные переменные, которые мы будем использовать для построения графиков.

2D график

Наше путешествие по 3D-графику только начинается с обычного 2D-графика ggplot2. Мы построим график плотности с помощью geom_raster между waiting, eruptions, чтобы увидеть, как обстоят дела с данными.

faithful_dd <- ggplot(faithfuld, aes(waiting, eruptions)) +
  geom_raster(aes(fill = density)) +
  ggtitle("3D Plotting in R from 2D_ggplot_graphics") +
  labs(caption = "Package: rayshader") +
  theme(axis.text = element_text(size = 12),
        title = element_text(size = 12,face="bold"),
        panel.border= element_rect(size=2,color="black",fill=NA))  
faithful_dd

Как вы можете видеть в приведенном выше коде, наряду с сюжетом мы немного улучшили внешний вид сюжета.

Что ж, это красиво, но это один из тех сюжетов, где я хотел бы показать его в 3D, чтобы показать небольшой холм - на самом деле, два небольших холма. Итак, приступим к трехмерному сюжету.

Путешествие от 2D-сюжета к 3D-сюжету - одна линия!

Переход от 2D-графика к 3D-графику - это всего лишь одна дополнительная строка кода, которая поступает из пакета rayshader. Функция plot_gg() which принимает набор аргументов, чтобы определить, как должен выглядеть трехмерный график.

plot_gg(faithful_dd, multicore = TRUE, width = 8, height = 8, scale = 300, 
          zoom = 0.6, phi = 60,
          background = "#afceff",shadowcolor = "#3a4f70")

faithful_dd - это объект ggplot2, который мы создали на предыдущем шаге. Поскольку большинство аргументов говорят сами за себя, например — multicore для активации всех ядер компьютера во время рендеринга. Такие аргументы, как zoom и phi, предназначены для установки того, где должен быть вид 3D-камеры.

Давайте посмотрим на сгенерированные графики:

Разве это не красиво? Это не просто потрясающе, но и целенаправленно. Представьте, что вам нужно объяснить градиентный спуск или какой-то алгоритм оптимизации, подобный этому, который является более интуитивным и не требует пояснений для получения ментальной модели.

Еще кое-что!

Эта история не заканчивается просто трехмерным сюжетом, но разработчик (Тайлер Морган-Уолл) любезно предоставил нам еще одну функцию render_movie(), которая размещает камеру и вращает ее вокруг трехмерного сюжета, который мы только что построили, и дает нам потрясающее видео 3D сюжета. render_movie() внутренне использует пакет av для создания видео.

render_movie("faithful_3d.mp4", frames = 480)

Резюме

Благодаря Тайлеру, теперь мы можем создавать потрясающие 3D-графики из 2D-графиков - просто используя одну дополнительную функцию plot_gg(), в конечном итоге даже создавая 360-градусное видео 3D-графика. Узнайте больше о Визуализации данных в R здесь и документации rayhader. Используемый здесь код и sessionInfo доступны здесь.