Hoe een 3D-spreidingsdiagram plotten met ggplot?

Ik heb geprobeerd het pakket plotlyte gebruiken, maar het werkt in mijn geval helemaal niet. Het ggplot-pakket werkt voor 2D-plots, maar het geeft een foutmelding bij het toevoegen van nog een as. Hoe dit probleem op te lossen?

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

Hoe voeg je nog een as toe en krijg je de 3D-plot hierin?


Antwoord 1, autoriteit 100%

Aangezien je je vraag hebt getagd met plotlyen hebt gezegd dat je het met plotly hebt geprobeerd te gebruiken, denk ik dat het nuttig zou zijn om je een werkende code-oplossing te geven in plotly:

Een aantal gegevens maken om mee te plotten:

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

Een grafische weergave van uw 3D-scatterplot met behulp van het scatter3d-type van plotly:

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

Rendert het volgende:

ggplotzoals anderen al hebben opgemerkt, ondersteunt op zichzelf geen 3D-weergave van afbeeldingen.


Antwoord 2, autoriteit 45%

Een mogelijke oplossing is gg3D.

GG3D is een pakket gemaakt om GGPLOT2 uit te breiden om 3D-percelen te produceren. Het doet precies waar je om vraagt: het voegt een derde as toe aan een ggplot. Ik vind het redelijk goed en gemakkelijk in gebruik en dat is wat ik gebruik voor mijn beperkte behoeften.

Een voorbeeld van het vignet om een ​​basisplot

te produceren

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()

Er zijn andere opties die geen GGPLOT betrekken. Bijvoorbeeld de uitstekende plot3d pakket met zijn extensie plot3DGL naar plot in opengl.


Antwoord 3, Autoriteit 6%

In uw vraag verwijst u naar het plotly-pakket en naar het ggplot2pakket. Zowel plotly als ggplot2 zijn geweldige pakketten: plotly is goed in het creëren van dynamische plots waarmee gebruikers kunnen communiceren, terwijl ggplot2 goed is in het creëren van statische plots voor extreme aanpassingen en wetenschappelijke publicatie. Het is ook mogelijk om ggplot2-uitvoer naar plotly te sturen. Helaas ondersteunt ggplot2 op het moment van schrijven (april 2021) geen native 3D-plots. Er zijn echter andere pakketten die kunnen worden gebruikt om 3D-plots te maken en enkele manieren om de kwaliteit van ggplot2 aardig te benaderen. Hieronder bespreek ik verschillende opties. Deze suggesties zijn zeker niet uitputtend.

plotly

Zie het antwoord van onlyphantomin deze thread.

gg3D

Zie Marco Stamazza‘s antwoord in deze thread. Zie ook mijn poging hieronder.

scatterplot3d

Zie Seth‘s antwoord in een gerelateerde thread.

rooster

Zie Backlin‘s antwoord in een gerelateerde thread.

rgl

Bekijk deze overzichtin de wikigids.

rayshader

Bekijk dit overzichtvan de geweldige mogelijkheden van dit pakket.

trans3d

Zie data-imaginisttrans3d gebruiken om een kubus in ggplot2 te krijgen.

ggrgl

Bekijk deze coole en nuttige coolbutuselessintroductie.


Laat me nu enkele van mijn inspanningen met de Lorenz-attractortrajecten bekijken. Hoewel de aanpassing beperkt blijft, heb ik de beste resultaten behaald voor PDF-uitvoer met gg3D. Ik voeg ook een ggrgl-voorbeeld toe.

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")

Voors: Geeft PDF van hoge kwaliteit weer:

Nadelen: Nog steeds beperkte aanpassingsmogelijkheden. Maar voor mijn specifieke behoeften, momenteel de beste optie.

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()

Voors: de plot kan worden geroteerd op een manier die vergelijkbaar is met plotly. Het is mogelijk om een basisplot te ‘thematiseren’:

Nadelen: de figuur mist een derde as met labels. Kan geen plots van hoge kwaliteit uitvoeren. Hoewel ik een zwart traject van lage kwaliteit in PNG heb kunnen bekijken en opslaan, kon ik een gekleurd traject zoals hierboven bekijken, maar kon het niet opslaan, behalve met een screenshot van lage kwaliteit:

Verwante onderwerpen: plot-3d-data-in-r, ploting-3d-graphics-with-r.

Other episodes