我有一个三列数据框,其中包含纬度,经度和地下测量值。我试图弄清楚如何在我拥有的点(不规则空间)之间插入数据点,然后创建整个区域的平滑表面图。我试过使用' surface3d'功能在' rgl'包但我的结果看起来像一个巨大的尖峰。我已经能够使用' plot3d'来绘制数据。但我需要更进一步,用插值填充空格。任何想法或建议?我也愿意使用其他软件包,当时rgl似乎是最合适的。
编辑:这是我的数据摘录(含水层深度的测量):
var fillArray = function(num, len, list) {
list.push(num);
if (list.length === len) {
return list;
} else {
return fillArray(num, len, list);
}
}
var num = 3;
var len = 3;
var list = [];
console.log(fillArray(num, len, list));
答案 0 :(得分:4)
只是添加关于插值的小但(可能)重要的注释。
使用非常好的软件包“akima”,您可以轻松插入数据:
library(akima)
library(rgl)
# library(deldir)
# Create some fake data
x <- rnorm(100)
y <- rnorm(100)
z <- x^2 + y^2
# # Triangulate it in x and y
# del <- deldir(x, y, z = z)
# triangs <- do.call(rbind, triang.list(del))
#
# # Plot the resulting surface
# plot3d(x, y, z, type = "n")
# triangles3d(triangs[, c("x", "y", "z")], col = "gray")
n_interpolation <- 200
spline_interpolated <- interp(x, y, z,
xo=seq(min(x), max(x), length = n_interpolation),
yo=seq(min(y), max(y), length = n_interpolation),
linear = FALSE, extrap = TRUE)
x.si <- spline_interpolated$x
y.si <- spline_interpolated$y
z.si <- spline_interpolated$z
persp3d(x.si, y.si, z.si, col = "gray")
Spline - interpolated picture (200 steps)
使用此软件包,您可以轻松更改插值的步数等。您需要至少10个(越多越好)点才能使用此软件包进行合理的样条插值。无论点数多少,线性版都能很好地工作。
P.S。感谢用户2554330 - 不知道deldir,在某些情况下确实很有用。
答案 1 :(得分:1)
你可以使用deldir包来获得你的点的Delaunay三角剖分,然后将其转换为triangles3d
绘图所需的数据形式。我不知道这对于一个非常大的数据集有多么有效,但它似乎在100分上有效:
library(deldir)
library(rgl)
# Create some fake data
x <- rnorm(100)
y <- rnorm(100)
z <- x^2 + y^2
# Triangulate it in x and y
del <- deldir(x, y, z = z)
triangs <- do.call(rbind, triang.list(del))
# Plot the resulting surface
plot3d(x, y, z, type = "n")
triangles3d(triangs[, c("x", "y", "z")], col = "gray")
编辑添加:
R-forge上的rgl
版本现在具有使这一过程变得简单的功能。您现在可以使用
library(deldir)
library(rgl)
plot3d(deldir(x, y, z = z))
还有一个函数可以从mesh3d
输出构建deldir()
个对象。