发布于 2018-08-12 18:08:32
既然您用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图形渲染。
发布于 2018-08-12 16:50:51
一种可能的解决方案是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的选项。例如,在openGL中绘制带有其扩展名plot3Drgl的优秀plot3D包。
发布于 2021-04-08 07:41:59
在您的问题中,您提到了plotly包和ggplot2包。plots和ggplot2都是很棒的软件包: plots擅长创建用户可以交互的动态绘图,而ggplot2擅长创建静态绘图,用于极端自定义和科学出版。也可以将ggplot2输出发送到plotly。不幸的是,在撰写本文时(2021年4月),ggplot2本身并不支持3d绘图。但是,还有其他软件包可以用来生成3d绘图,以及一些非常接近ggplot2质量的方法。下面我将回顾几个选项。这些建议绝不是详尽的。
请在此帖子中查看onlyphantom的答案。
在这个帖子中可以看到Marco Stamazza的回答,也可以在下面看到我的努力。
请在相关帖子中查看Seth的答案。
请在相关帖子中查看Backlin的答案。
请参阅维基指南中的此overview。
查看这个包的奇妙功能的overview。
请参见data-imaginist使用trans3d将立方体获取到ggplot2中。
请参阅这篇又酷又有用的coolbutuseless介绍。
现在让我回顾一下我使用Lorenz吸引子轨迹所做的一些工作。虽然定制仍然有限,但我已经用gg3D获得了最好的输出效果。我还提供了一个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:

缺点:仍然是有限的定制。但对于我的特定需求,目前是最好的选择。
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()

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

缺点:图中缺少带标签的第三个轴。无法输出高质量的绘图。虽然我可以在PNG中查看和保存低质量的黑色轨迹,但我可以查看类似上面的彩色轨迹,但无法保存它,除非使用低质量的屏幕截图:

https://stackoverflow.com/questions/45052188
复制相似问题