如何使用R绘制一个三维矩阵的三维表面。

4

我有一个由浮点数组成的三维矩阵,希望使用R生成一个平滑的三维表面。欢迎提供任何建议。谢谢。

目前我正在使用scatterplot3d函数…但是这个函数没有生成平滑的表面。

x<-read.table("/Users/me/Desktop/data.txt")
scatterplot3d(x$V1, x$V2, x$V3, highlight.3d = TRUE, angle = 30, col.axis = "blue", col.grid = "lightblue", cex.axis = 1.3, cex.lab = 1.1, pch = 20)

1
输出部分数据将大大增加您获得帮助的机会。您可以将 dput(head(x)) 的输出粘贴到上面的问题中。谢谢。 - Simon O'Hanlon
dput(head(x))的翻译如下: 结构(list(V1 = c(0.01, 0.013971025, 0.019832054, 0.021035526, 0.023956488, 0.027962379), V2 = c(0.01, 0.011738323, 0.011925891, 0.011990806, 0.013416452, 0.014304923), V3 = c(8.21e-19, 3.47e-17, 1.77e-15, 3.64e-15, 1.39e-14, 5.46e-14)), .Names = c("V1", "V2", "V3"), row.names = c(NA, 6L), class = "data.frame") - Mohamed Bouguessa
请在问题中放置dput dump!这里的想法是改进问题和答案。 - mdsumner
3个回答

2
如果您能创建一个值为z轴值的2D矩阵(x,y),则可以使用以下方法:
persp

这里有一个来自R Graph Gallery的例子。 透视图示例


2
require(misc3d)

a <- 2/5

wsqr <-  1 - a^2
w <- sqrt(wsqr)
denom <- function(a,w,u,v) a*((w*cosh(a*u))^2 + (a*sin(w*v))^2)

fx <- function(u,v) -u + (2*wsqr*cosh(a*u)*sinh(a*u)/denom(a,w,u,v))
fy <- function(u,v) 2*w*cosh(a*u)*(-(w*cos(v)*cos(w*v)) - (sin(v)*sin(w*v)))/denom(a,w,u,v)
fz = function(u,v) 2*w*cosh(a*u)*(-(w*sin(v)*cos(w*v)) + (cos(v)*sin(w*v)))/denom(a,w,u,v)


parametric3d(fx = fx, fy = fy, fz = fz, 
             umin = -17, 
             umax = 17, 
             vmin = -77, 
             vmax = 77, 
             n = 100,
             color = c("grey17","grey21","red4","darkred","red4","grey21","grey17"),
             engine = "rgl")

enter image description here


2

我认为来自MBA包的mba.surf是平滑处理的不错选择,正如上面的larrydag建议的那样,persp也可以用于将其可视化。下面的代码来自mba.surf函数的帮助页面(将LIDAR换成你的三列数据框):

data(LIDAR)
mba.int <- mba.surf(LIDAR, 300, 300, extend=TRUE)$xyz.est
# Two ways of imaging....
image(mba.int, xaxs="r", yaxs="r")
persp(mba.int, theta = 135, phi = 30, col = "green3", scale = FALSE,
  ltheta = -120, shade = 0.75, expand = 10, border = NA, box = FALSE)

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接