3D 表面插值
3D Surface Interpolation
我有一个以纬度、经度和地下测量值作为列的三列数据框。我想弄清楚如何在我拥有的点(不规则 space)之间插入数据点,然后创建整个区域的平滑曲面图。我尝试使用 'rgl' 包中的 'surface3d' 函数,但我的结果看起来像一个巨大的尖峰。我已经能够用 'plot3d' 绘制数据,但我需要更进一步并用插值法填充空白 spaces。有什么想法或建议吗?我也愿意使用其他软件包,当时 rgl 似乎是最合适的。
编辑:这是我的数据(含水层深度的测量值)的摘录:
lat_dd_NAD83 long_dd_NAD83 lev_va_ft
1 37.01030 -101.5006 288.49
2 37.03977 -101.6633 191.68
3 37.05201 -100.4994 159.34
4 37.06567 -101.3292 174.07
5 37.06947 -101.4561 285.08
6 37.10098 -102.0134 128.94
您可以使用 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))
还有一个函数可以从 deldir()
输出构造 mesh3d
对象。
只是添加关于插值的小但(也许)重要的注释。
使用非常好的包 "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,在某些情况下非常有用。
我有一个以纬度、经度和地下测量值作为列的三列数据框。我想弄清楚如何在我拥有的点(不规则 space)之间插入数据点,然后创建整个区域的平滑曲面图。我尝试使用 'rgl' 包中的 'surface3d' 函数,但我的结果看起来像一个巨大的尖峰。我已经能够用 'plot3d' 绘制数据,但我需要更进一步并用插值法填充空白 spaces。有什么想法或建议吗?我也愿意使用其他软件包,当时 rgl 似乎是最合适的。
编辑:这是我的数据(含水层深度的测量值)的摘录:
lat_dd_NAD83 long_dd_NAD83 lev_va_ft
1 37.01030 -101.5006 288.49
2 37.03977 -101.6633 191.68
3 37.05201 -100.4994 159.34
4 37.06567 -101.3292 174.07
5 37.06947 -101.4561 285.08
6 37.10098 -102.0134 128.94
您可以使用 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))
还有一个函数可以从 deldir()
输出构造 mesh3d
对象。
只是添加关于插值的小但(也许)重要的注释。
使用非常好的包 "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,在某些情况下非常有用。