如何使用ggplot绘制三维散点图?

M A*_*jun 15 r data-visualization ggplot2 plotly scatter3d

我试图使用"情节"功能,但它根本不适用于我的情况."ggplot"工作在2D的情况下,但是在添加一个轴时会出错.如何解决这个问题?

ggplot(data,aes(x=D1,y=D2,z=D3,color=Sample))+geom_point()
Run Code Online (Sandbox Code Playgroud)

如何添加一个轴并获得3D图?谢谢.

onl*_*tom 24

既然您已经标记了您的问题,plotly并且说您已尝试使用它,那么我认为为您提供以下工作代码解决方案会很有帮助plotly:

创建一些数据以绘制:

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

使用plotly的scatter3d类型绘制3d散点图:

plot_ly(x=temp, y=pressure, z=dtime, type="scatter3d", mode="markers", color=temp)
Run Code Online (Sandbox Code Playgroud)

呈现以下内容: 在此输入图像描述

ggplot 正如其他人所说,它本身并不支持3D图形渲染.

  • @Ben,是的,有可能。请参阅[此](https://aws1.discourse-cdn.com/business7/uploads/plot/optimized/2X/7/7d0944698d85fb17a9b831f292c9ca0742a03534_2_1210x1000.png)和[此](https://aws1.discourse-cdn.com/ Business7/上传/绘图/优化/2X/2/2d10a246842bb183edf80f7f5e948e3a39eb87f0_2_1146x1000.png)。 (2认同)
  • @Ben为了快速参考,请参阅[此线程](https://community.plot.ly/t/3d-scatter-3d-regression-line/4149),但如果这不能解决您想要的问题,请发布问题在 StackOverflow 上 - 很乐意在那里帮助解答 (2认同)

Pat*_*ckT 23

在您的问题中,您引用了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 中。

格格格

请参阅这个很酷且有用的酷但无用的介绍。


现在让我回顾一下我在洛伦兹吸引子轨迹方面所做的一些努力。虽然自定义仍然有限,但我使用 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")
Run Code Online (Sandbox Code Playgroud)

优点:输出高质量的 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()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

优点:绘图可以以类似于绘图的方式旋转。可以对基本情节进行“主题化”:

在此输入图像描述

缺点:该图缺少带有标签的第三个轴。无法输出高质量的绘图。虽然我能够以 PNG 格式查看和保存低质量的黑色轨迹,但我可以查看像上面这样的彩色轨迹,但无法保存它,除非使用低质量的屏幕截图:

在此输入图像描述

相关主题: plot-3d-data-in-rploting-3d-graphics-with-r


Mar*_*zza 13

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()
Run Code Online (Sandbox Code Playgroud)

空的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()
Run Code Online (Sandbox Code Playgroud)

虹膜数据

还有其他不涉及ggplot的选项。例如,优秀的plot3D软件包及其扩展plot3Drgl可以在openGL中进行绘图。

  • 该软件必须从GitHub安装。devtools :: install_github(“ AckerDWM / gg3D”) (3认同)