2016-04-04 4 views
2

У меня есть кадр данных из трех столбцов с широтной, долготой и подземными измерениями в качестве столбцов. Я пытаюсь выяснить, как интерполировать точки данных между точками, которые у меня есть (которые имеют неправильное пространство), а затем создать гладкий участок поверхности всей области. Я попытался использовать функцию «surface3d» в пакете «rgl», но мой результат выглядит как один гигантский шип. Мне удалось обработать данные с помощью «plot3d», но мне нужно сделать еще один шаг и заполнить пробелы интерполяцией. Любые идеи или предложения? Я также открыт для использования других пакетов, rgl просто казался лучшим в тот момент.3D-интерполяция поверхности

EDIT: Вот выдержка из моих данных (измерение глубины водоносного горизонта):

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 
+0

Вы можете использовать функцию 'loess.surf' в пакете' asbio'. Если бы вы могли предоставить свои данные, мы можем помочь вам лучше – adaien

+0

kriging (с пакетом gstat) будет казаться очевидной техникой, чтобы попробовать –

+0

Возможны различные интерпретации «3D-поверхности». Вы пытаетесь интерполировать между измеренными значениями 'lev' на основе' lat' и 'long'? (Я бы назвал это двухмерным многообразием, встроенным в 3 измерения. И если это так, то предложение лёсса (хотя и в пакете статистики) с двумя переменными на RHS кажется на месте и уже иллюстрированным ответом: http: // stackoverflow.com/questions/15019725/r-3d-surface-plot –

ответ

0

Вы можете использовать пакет deldir получить триангуляционную ваши точки, а затем преобразовать его в виде данных, необходимых по 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") 

enter image description here

EDITED добавить:

версии rgl на У R-forge теперь есть функция, чтобы сделать это легко. Теперь вы можете создать сюжет, похожий на тот, выше, с использованием

library(deldir) 
library(rgl) 
plot3d(deldir(x, y, z = z)) 

Существует также функция для построения mesh3d объектов из deldir() продукции.

2

Просто добавьте небольшое, но (возможно) важное примечание об интерполяции.

Использование очень хороший пакет «Аким» вы можете легко интерполировать ваши данные:

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, очень полезная вещь в некоторых случаях.

Смежные вопросы