使用persp3D轴问题在R中绘制3D图

使用persp3D轴问题在R中绘制3D图,r,matrix,3d,rgl,R,Matrix,3d,Rgl,我有一个矩阵(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,

我有一个矩阵(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曲面图使用的是整个矩阵,而不仅仅是标题,为了简洁起见,我在这里仅将标题作为dput包含在内

persp3D(z = m[,3:26], col = "lightgrey", shade = 0.5, ticktype = "detailed", axes=T)

让我们从轴本身开始:从X0到X23的轴应该是矩阵的X轴(列名),但这里它被视为Y轴。Y轴(此处视为X轴)的范围为0到22016,以86的256个间隔

在过去的几个小时里,我一直在互联网上搜寻有关如何更改axis标签的答案,但没有成功。据我所知,如果我在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
)

这就是你要找的吗

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
)

你的y值来自哪里?它写在你的矩阵里了吗?(
freq.min
freq.max
大于21586)。第1行是0,第2行是86?(但是
21586/86
is 251)@dww,谢谢你的建议——我以后会记住这一点,以免显得太粗鲁。@cartlefish44,我的y值对应256行。我打错了,谢谢你接过来。最上面一行的freq.max为22016,除以86个宽度间隔,为256,y值来自哪里?它写在你的矩阵里了吗?(
freq.min
freq.max
大于21586)。第1行是0,第2行是86?(但是
21586/86
is 251)@dww,谢谢你的建议——我以后会记住这一点,以免显得太粗鲁。@cartlefish44,我的y值对应256行。我打错了,谢谢你接过来。最上面一行的freq.max为22016,除以86个宽度间隔,是256谢谢您的帮助,但我真的希望使用persp3D功能,因为它允许我以标准方式在图形设备上直接打印多个曲面图。我该如何将这段代码修改为persp3d函数?或者,在另一个想法@nevrome中,你能建议一种方法,通过定义par(mfrow=c(3,1)将多个图打印在一起吗使用plot3d和surface3d函数?在这种情况下,persp3d和surface3d是可互换的。如果用persp3d替换surface3d,我的代码会产生相同的结果。我不确定是否可以在同一个rgl窗口中显示不同的3D绘图。但您确实可以一次显示多个曲面。也许示例对您有所帮助。太好了——效果很好!我刚刚接受了您的回答。谢谢。您可以在一个窗口中放置多个绘图。请参见
?mfrow3d
。谢谢您的帮助,但我确实希望使用persp3D功能,因为它允许我以标准方式在图形设备上直接打印多个曲面绘图。我可以如何将此代码改编为persp3D功能?或者,在其他情况下她的想法@nevrome,你能建议一种通过定义par(mfrow=c(3,1)将多个情节打印在一起的方法吗使用plot3d和surface3d函数?在这种情况下,persp3d和surface3d是可互换的。如果用persp3d替换surface3d,我的代码会产生相同的结果。我不确定是否可以在同一个rgl窗口中显示不同的3D绘图。但您确实可以一次显示多个曲面。也许示例对您有所帮助。太好了——效果很好!我刚刚接受您的回答。谢谢。您可以在一个窗口中放置多个绘图。请参见
?mfrow3d