[英]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表面图使用了整个矩阵,而不是仅使用标头,在此我仅将其作为简短的说明。
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)中的axis参数,则可以在下一行中自定义轴,如下所示:
axis3d(edge= 'y+-', at =seq(0,23,by=1) ,
labels = seq(0,23,by=1))
但是,会弹出一个RGL设备,并且只绘制轴而没有实际的图本身,这在内置的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!"
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.