Как построить трехмерную диаграмму рассеяния с помощью ggplot?

Я пытался использовать функцию "сюжета", но она не работает в моем случае вообще. "ggplot" работает в случае 2D, но выдает ошибку при добавлении еще одной оси. Как решить эту проблему?

ggplot(data,aes(x=D1,y=D2,z=D3,color=Sample))+geom_point()

Как добавить еще одну ось и получить в этом 3D-график? Благодарю вас.

3 ответа

Поскольку вы отметили свой вопрос plotly и сказал, что вы пытались использовать его с плотно, я думаю, что было бы полезно дать вам решение для рабочего кода в plotly:

Создание некоторых данных для построения графика:

set.seed(417)
library(plotly)
temp <- rnorm(100, mean=30, sd=5)
pressure <- rnorm(100)
dtime <- 1:100

Построение графика вашего трехмерного рассеяния с использованием plotly's scatter3d тип:

plot_ly(x=temp, y=pressure, z=dtime, type="scatter3d", mode="markers", color=temp)

Оказывает следующее: введите описание изображения здесь

ggplot как отмечают другие, само по себе не поддерживает рендеринг 3D-графики.

Возможные решения - gg3D.

gg3D - это пакет, созданный для расширения ggplot2 для создания 3D-графиков. Он делает именно то, что вы просите: он добавляет третью ось к ggplot. Я нахожу его довольно хорошим и простым в использовании, и это то, что я использую для своих ограниченных потребностей.

Пример взят из виньетки для создания основного сюжета

devtools::install_github("AckerDWM/gg3D")

library("gg3D")

## An empty plot with 3 axes
qplot(x=0, y=0, z=0, geom="blank") + 
  theme_void() +
  axes_3D()

Пустые трехмерные оси

## Axes can be populated with points using the function stat_3D.

data(iris)
ggplot(iris, aes(x=Petal.Width, y=Sepal.Width, z=Petal.Length, color=Species)) + 
  theme_void() +
  axes_3D() +
  stat_3D()

данные радужной оболочки

Есть и другие варианты, не связанные с ggplot. Например, отличный пакет plot3D с расширением plot3Drgl для печати в openGL.

В своем вопросе вы ссылаетесь на пакет и на пакет ggplot2 . И plotly, и ggplot2 - отличные пакеты: plotly хорош для создания динамических графиков, с которыми пользователи могут взаимодействовать, в то время как ggplot2 хорош для создания статических графиков для экстремальной настройки и научных публикаций. Также можно отправить вывод ggplot2 в plotly. К сожалению, на момент написания (апрель 2021 г.) ggplot2 изначально не поддерживает 3D-графики. Однако есть и другие пакеты, которые можно использовать для создания трехмерных графиков, и некоторые способы приблизиться к качеству ggplot2. Ниже я рассмотрю несколько вариантов. Эти предложения ни в коем случае не являются исчерпывающими. К тому же я не специалист, просто пользователь с похожими на твои потребностями. Вот несколько известных мне вариантов:

plotlyхитроумный

Смотрите ответ толькоФанта в этой теме.

gg3D

См. Ответ Марко Стамаццы в этой теме. См. Также мои усилия ниже.

scatterplot3d

См. Ответ Сета в связанной теме.

решетка

См. Ответ Баклина в соответствующей теме.

rgl

См. Этот обзор в вики-руководстве.

См. Этот шейдер лучейобзор замечательных возможностей этого пакета.

Посмотрите, как trans3ddata- imaginist использует trans3d для получения куба в ggplot2.

Посмотрите это крутое и полезное ggrglкрутое, но бесполезное введение.

И позвольте мне рассмотреть некоторые из моих усилий с траекториями аттракторов Лоренца. Хотя возможности настройки остаются ограниченными, у меня были лучшие результаты для вывода PDF с помощью gg3D. Я также включаю пример ggrgl. Пакет, который выглядит очень многообещающим, - это rayhader, поэтому, если кто-то знает, как отобразить аттрактор Лоренца с помощью rayhader, это было бы отличным примером.

gg3D

      # Packages
library(deSolve)
library(ggplot2)
library(gg3D)  # remotes::install_github("AckerDWM/gg3D")

# Directory
setwd("~/R/workspace/")

# Parameters
parms <- c(a=10, b=8/3, c=28)

# Initial state 
state <- c(x=0.01, y=0.0, z=0.0)

# Time span
times <- seq(0, 50, by=1/200)

# Lorenz system
lorenz <- function(times, state, parms) {
  with(as.list(c(state, parms)), {
    dxdt <- a*(y-x)
    dydt <- x*(c-z)-y
    dzdt <- x*y-b*z
    return(list(c(dxdt, dydt, dzdt)))
  })
}

# Make dataframe
df <- as.data.frame(ode(func=lorenz, y=state, parms=parms, times=times))

# Make plot
make_plot <- function(theta=0, phi=0){
  ggplot(df, aes(x=x, y=y, z=z, colour=time)) +
    axes_3D(theta=theta, phi=phi) +
    stat_3D(theta=theta, phi=phi, geom="path") +
    labs_3D(theta=theta, phi=phi, 
            labs=c("x", "y", "z"), 
            angle=c(0,0,0),
            hjust=c(0,2,2), 
            vjust=c(2,2,-2)) +
    ggtitle("Lorenz butterfly") +
    theme_void() +
    theme(legend.position = "none")
}

make_plot()

make_plot(theta=180,phi=0)

# Save plot as PDF
ggsave(last_plot(), filename="lorenz-gg3d.pdf")

Плюсы: вывод PDF в высоком качестве:

Минусы: все еще ограниченная настройка. Но для моих конкретных нужд на данный момент лучший вариант.

ggrgl

      # Packages
library(deSolve)
library(ggplot2)
library(rgl)
  #remotes::install_github("dmurdoch/rgl")
library(ggrgl) 
  # remotes::install_github('coolbutuseless/ggrgl', ref='main')
library(devout)
library(devoutrgl) 
  # remotes::install_github('coolbutuseless/devoutrgl', ref='main')
library(webshot2)
  # remotes::install_github("rstudio/webshot2")
library(ggthemes)

# Directory
setwd("~/R/workspace/")

# Parameters
parms <- c(a=10, b=8/3, c=26.48)

# Initial state 
state <- c(x=0.01, y=0.0, z=0.0)

# Time span
times <- seq(0, 100, by=1/500)

# Lorenz system
lorenz <- function(times, state, parms) {
  with(as.list(c(state, parms)), {
    dxdt <- a*(y-x)
    dydt <- x*(c-z)-y
    dzdt <- x*y-b*z
    return(list(c(dxdt, dydt, dzdt)))
  })
}

# Make dataframe
df <- as.data.frame(ode(func=lorenz, y=state, parms=parms, times=times))

# Make plot
ggplot(df, aes(x=x, y=y, z=z)) +
  geom_path_3d() +
  ggtitle("Lorenz butterfly") -> p

# Render Plot in window
rgldev(fov=30, view_angle=-10, zoom=0.7)
p + theme_ggrgl(16) 

# Save plot as PNG
rgldev(fov=30, view_angle=-10, zoom=0.7,
       file = "~/R/Work/plots/lorenz-attractor/ggrgl/lorenz-ggrgl.png", 
       close_window = TRUE, dpi = 300)
p + theme_ggrgl(16) 
dev.off()

Плюсы: Легко тематизировать основной сюжет выше (нет, не из моих лучших усилий):

Минусы: мне не удавалось выводить графики PDF в высоком качестве. И отсутствует третья ось с надписями.

Связанные темы: plot-3d-data-in-r, ploting-3d-graphics-with-r .

Другие вопросы по тегам