使用 persp3D 在 R 中绘制 3D 图 - 轴问题
3D plot in R using persp3D - Axis issues
我有一个矩阵 (m),我正在尝试绘制该矩阵的 3D 表示。
> dput(head(m))
structure(c(21930, 21844, 21758, 21672, 21586, 21500, 22016,
21930, 21844, 21758, 21672, 21586, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0), .Dim = c(6L, 26L), .Dimnames = list(
NULL, c("freq.min", "freq.max", "X0", "X1", "X2", "X3", "X4",
"X5", "X6", "X7", "X8", "X9", "X10", "X11", "X12", "X13",
"X14", "X15", "X16", "X17", "X18", "X19", "X20", "X21", "X22",
"X23")))
我设法绘制了 3D 曲面图,但轴和轴标签都不正确。请注意,下面的 3D 曲面图使用了整个矩阵,而不仅仅是 header,为了简洁起见,我在此处仅将其作为 dput 包括在内。
persp3D(z = m[,3:26], col = "lightgrey", shade = 0.5, ticktype = "detailed", axes=T)
让我们从坐标轴本身说起:从X0到X23的坐标轴应该是矩阵的X轴(列名),但在这里它被视为Y轴。 Y轴,这里看做X轴,范围是0到22016,256个区间,86.
我花了最后几个小时在互联网上搜索有关如何更改轴标签的答案,但没有成功。据我了解,如果我关闭 persp3D (axes=F) 中的轴参数,我就可以在后续行中自定义轴,如下所示:
axis3d(edge= 'y+-', at =seq(0,23,by=1) ,
labels = seq(0,23,by=1))
但是,弹出一个 RGL 设备,只绘制轴而没有实际绘图本身,这在 built-in R 图形设备中保持不变。
如何成功更改坐标轴?
这是您要找的吗?
clab <- 0:23
rlab <- seq(0, 21586, 86)
cnum <- length(clab)
rnum <- length(rlab)
m <- matrix(
c(runif(0.5*cnum*rnum)-1, runif(0.5*cnum*rnum)+1),
rnum, cnum,
dimnames = list(rlab, clab))
library(rgl)
plot3d(
clab, rlab, t(m),
type="n",
aspect = c(100, 200, 20),
xlab = "x", ylab = "y", zlab = "z",
sub = "Grab me and rotate me!"
)
surface3d(
clab, rlab, t(m),
color = c("black", "white"),
alpha = 0.5,
add = TRUE
)
要更改轴,您可以交换 x 和 y 并将 z 转置为 t()
。
附带说明:我编写了两个函数来将 3D 点云数据从高格式转换为宽格式,反之亦然:recexcavAAR::spatialwide
和 recexcavAAR::spatiallong
。我发现它们在绘图和分析之间来回切换非常有用。也许它们对你有用。
编辑:
一次调用 persp3d
的替代解决方案
clab <- 0:23
rlab <- seq(0, 21586, 86)
cnum <- length(clab)
rnum <- length(rlab)
m <- matrix(
c(runif(0.5*cnum*rnum)-1, runif(0.5*cnum*rnum)+1),
rnum, cnum,
dimnames = list(rlab, clab))
library(rgl)
persp3d(
clab, rlab, t(m),
color = c("black", "white"),
alpha = 0.5,
aspect = c(100, 200, 20),
xlab = "x", ylab = "y", zlab = "z",
sub = "Grab me and rotate me!"
)
我有一个矩阵 (m),我正在尝试绘制该矩阵的 3D 表示。
> dput(head(m))
structure(c(21930, 21844, 21758, 21672, 21586, 21500, 22016,
21930, 21844, 21758, 21672, 21586, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0), .Dim = c(6L, 26L), .Dimnames = list(
NULL, c("freq.min", "freq.max", "X0", "X1", "X2", "X3", "X4",
"X5", "X6", "X7", "X8", "X9", "X10", "X11", "X12", "X13",
"X14", "X15", "X16", "X17", "X18", "X19", "X20", "X21", "X22",
"X23")))
我设法绘制了 3D 曲面图,但轴和轴标签都不正确。请注意,下面的 3D 曲面图使用了整个矩阵,而不仅仅是 header,为了简洁起见,我在此处仅将其作为 dput 包括在内。
persp3D(z = m[,3:26], col = "lightgrey", shade = 0.5, ticktype = "detailed", axes=T)
让我们从坐标轴本身说起:从X0到X23的坐标轴应该是矩阵的X轴(列名),但在这里它被视为Y轴。 Y轴,这里看做X轴,范围是0到22016,256个区间,86.
我花了最后几个小时在互联网上搜索有关如何更改轴标签的答案,但没有成功。据我了解,如果我关闭 persp3D (axes=F) 中的轴参数,我就可以在后续行中自定义轴,如下所示:
axis3d(edge= 'y+-', at =seq(0,23,by=1) ,
labels = seq(0,23,by=1))
但是,弹出一个 RGL 设备,只绘制轴而没有实际绘图本身,这在 built-in R 图形设备中保持不变。
如何成功更改坐标轴?
这是您要找的吗?
clab <- 0:23
rlab <- seq(0, 21586, 86)
cnum <- length(clab)
rnum <- length(rlab)
m <- matrix(
c(runif(0.5*cnum*rnum)-1, runif(0.5*cnum*rnum)+1),
rnum, cnum,
dimnames = list(rlab, clab))
library(rgl)
plot3d(
clab, rlab, t(m),
type="n",
aspect = c(100, 200, 20),
xlab = "x", ylab = "y", zlab = "z",
sub = "Grab me and rotate me!"
)
surface3d(
clab, rlab, t(m),
color = c("black", "white"),
alpha = 0.5,
add = TRUE
)
要更改轴,您可以交换 x 和 y 并将 z 转置为 t()
。
附带说明:我编写了两个函数来将 3D 点云数据从高格式转换为宽格式,反之亦然:recexcavAAR::spatialwide
和 recexcavAAR::spatiallong
。我发现它们在绘图和分析之间来回切换非常有用。也许它们对你有用。
编辑: 一次调用 persp3d
的替代解决方案clab <- 0:23
rlab <- seq(0, 21586, 86)
cnum <- length(clab)
rnum <- length(rlab)
m <- matrix(
c(runif(0.5*cnum*rnum)-1, runif(0.5*cnum*rnum)+1),
rnum, cnum,
dimnames = list(rlab, clab))
library(rgl)
persp3d(
clab, rlab, t(m),
color = c("black", "white"),
alpha = 0.5,
aspect = c(100, 200, 20),
xlab = "x", ylab = "y", zlab = "z",
sub = "Grab me and rotate me!"
)