R:使用surface3d在矩阵文件中绘制3D绘图的帮助

时间:2016-12-14 19:42:09

标签: r

我想绘制一个类似于这个例子的数字(见打击)。

enter image description here

这是我的数据集示例。

  z <- data.frame(round(runif(977,500,600)))
  z_matrix <- t(matrix(z[0:(as.integer(length(z[,])/10) * 10),],as.integer(length(z[,])/10),10))

我可以使用ggplot,image2D,persp和persp3d生成其他一些2D或3D图,但是与上面的3D绘图示例相比,这些图看起来不太好。

我尝试过使用surface3d,但是我遇到了错误。我还尝试使用grid.to.xyz将矩阵格式转换为x.y.z格式,但似乎格式不正确。

此外,颜色梯度随各种数据集中的z范围而变化。我需要&#34;修复&#34;渐变的颜色模式,并将其应用于其他数据集,以便它们可以比较。

我的问题:

  1. 如何使用surface3d或plot3d?
  2. 在矩阵数据集中生成3D绘图
  3. 如何将颜色渐变图案固定到特定值范围?
  4. 感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

您可以尝试使用rgl surface3d绘制z_matrix:

library(rgl)

x <- 50*(1:nrow(z_matrix))
y <- 10*(1:ncol(z_matrix))

zlim <- range(z_matrix)
zlen <- zlim[2] - zlim[1] + 1

colorlut <- rainbow(zlen) # height color lookup table

col <- colorlut[ z_matrix - zlim[1] + 1 ] # assign colors to heights for each point

open3d()
surface3d(x, y, z_matrix, color = col, back = "lines")

enter image description here

使用网格线(并且不缩放x,y轴):

x <- 1:nrow(z_matrix)
y <- 1:ncol(z_matrix)

zlim <- range(z_matrix)
zlen <- zlim[2] - zlim[1] + 1

colorlut <- terrain.colors(zlen) #rainbow(zlen) # height color lookup table

col <- colorlut[ z_matrix - zlim[1] + 1 ] # assign colors to heights for each point

open3d()
persp3d(x, y, z_matrix, col = col)
grid3d(c("x", "y+", "z"))
surface3d(x, y, z_matrix, color = col, back = "lines")

enter image description here

答案 1 :(得分:0)

根据我自己的建议并使用火山数据集,这就是我认为与背景所需图像的最佳匹配:

libarary(plot3d)
persp3D(z = volcano, col = "lightblue", shade = 0.5,
 ticktype = "detailed", bty = "b2")

enter image description here

这将是最适合工作示例的着色方案,但我认为您可能想要搜索&#34;地形颜色&#34;如果您需要更精确地适合该图像:

PNG(); persp3D(z = volcano,clab = c(&#34; height&#34;,&#34; m&#34;), colkey = list(length = 0.5,shift = -0.1), ticktype =&#34;详细&#34;,bty =&#34; b2&#34;); dev.off()

enter image description here

该软件包正在使用基本图形,因此您需要通过阅读?persp和?persp3D帮助页面来查看轮换选项。这是另一个实验:

png(); persp3D(z = volcano, col=terrain.colors(100), clab = c("height", "m"), xlab="PPM" , ylab="Col", zlab="Height",
colkey=FALSE, theta=25, lighting="specular",
ticktype = "detailed", bty = "b2"); dev.off()

enter image description here