簡體   English   中英

如何使用ggplot繪制3D散點圖?

[英]How to plot 3D scatter diagram using ggplot?

我嘗試使用plotly包,但在我的情況下它根本不起作用。 ggplot包適用於 2D 繪圖,但在添加更多軸時出現錯誤。 如何解決這個問題?

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

如何再添加一個軸並在此獲得 3D 繪圖?

由於您用plotly標記了您的問題並說您已嘗試將其與 plotly 一起使用,因此我認為在plotly為您提供一個有效的代碼解決方案會plotly

創建一些數據來繪制:

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

使用 plotly 的scatter3d類型繪制 3d 散點圖:

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

空的 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 中繪圖。

在您的問題中,您指的是plotly包和ggplot2包。 plotly 和 ggplot2 都是很棒的包:plotly 擅長創建用戶可以交互的動態圖,而 ggplot2 擅長為極端定制和科學出版創建靜態圖。 也可以將 ggplot2 輸出發送到 plotly。 不幸的是,在撰寫本文時(2021 年 4 月),ggplot2 本身不支持 3d 繪圖。 但是,還有其他軟件包可用於生成 3d 繪圖和一些方法可以非常接近 ggplot2 質量。 下面我回顧幾個選項。 這些建議絕不是詳盡無遺的。

情節地

請參閱此線程中onlyphantom的答案。

GG3D

請參閱Marco Stamazza在此線程中的回答。 另請參閱下面的我的努力。

散點圖3d

請參閱相關主題中的Seth回答。

格子

請參閱相關主題中Backlin的回答。

rgl

請參閱 wiki 指南中的此概述

光線着色器

請參閱此軟件包出色功能的概述

轉3d

參見data-imaginist使用 trans3d 將立方體放入 ggplot2。

咕嚕咕嚕

請參閱這個很酷且有用的coolbutuseless介紹。


現在讓我回顧一下我對洛倫茲吸引子軌跡所做的一些努力。 雖然自定義仍然有限,但我已經獲得了使用 gg3D 輸出 PDF 的最佳結果。 我還包括一個 ggrgl 示例。

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:

在此處輸入圖片說明

缺點:仍然有限的定制。 但對於我的特定需求,目前是最好的選擇。

咕嚕咕嚕

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

在此處輸入圖片說明

優點:情節可以以類似於情節的方式旋轉。 可以“主題化”基本情節:

在此處輸入圖片說明

缺點:該圖缺少帶有標簽的第三個軸。 無法輸出高質量的繪圖。 雖然我已經能夠在 PNG 中查看和保存低質量的黑色軌跡,但我可以查看如上所示的彩色軌跡,但無法保存它,除了低質量的屏幕截圖:

在此處輸入圖片說明

相關線程: plot-3d-data-in-rploting-3d-graphics-with-r

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM