3D интерактивный график поверхности с пространственными данными - PullRequest
0 голосов
/ 11 октября 2018

Я хотел бы создать интерактивный трехмерный поверхностный график глубин в озере, в идеале используя библиотеки plotly или rgl.Я извлек свои данные из SpatialLinesDataFrame контурных линий в Gauss-Krueger / EPSG: 31468 CRS, то есть в метрических единицах.Теперь каждая линия контура создает набор координат с одинаковым значением глубины.Результирующий фрейм данных довольно большой, но выглядит примерно так:

set.seed(41)
xx <- rnorm(100,4448929,100)
yy <- rnorm(100,5308097,100)
zz <- c(rep(-10,10),rep(-20,10),rep(-30,10),rep(-40,10),rep(-50,10),rep(-60,10),rep(-70,10),rep(-80,10),rep(-90,10),rep(-100,10))
df <- data.frame(xx,yy,zz)

Я попытался построить данные с помощью plotly, как в этом примере, и с rgl, как в этот пост.В обоих случаях я получаю сообщения об ошибках, связанных с тем, что мои данные не в матричном формате, то есть где значения x и y представлены в виде номеров строк и столбцов.

Что работает, использует *Команда 1015 * в plotly:

plot_ly() %>% add_trace(df,x = ~df$xx, y = ~df$yy, z = ~df$zz,type="mesh3d")

Однако в результирующем графике не только отсутствует причудливая цветовая легенда команды add_surface, но, что более важно, деформируются значения x и y по отношениюк Z-значениям.Значения z показаны слишком большими, хотя все они имеют одинаковую метрическую единицу.

Я также пытался преобразовать фрейм данных в матрицу, как в этом посте, но он либо нене работает, или дает мне матрицу, состоящую почти полностью из NA.Я могу только предположить, что число координат, к которым прикреплены значения глубины, очень мало по сравнению со всеми xy-комбинациями координат в этом диапазоне?

Любые предложения будут высоко оценены - спасибо!

1 Ответ

0 голосов
/ 18 октября 2018

Это случайно расположенные точки, поэтому rgl::persp3d не может обрабатывать их напрямую.Однако вы можете следовать примеру в ?rgl::persp3d.deldir, чтобы триангулировать их, а затем построить график.Например,

dxyz <- deldir::deldir(df$xx, df$yy, z = df$zz, suppressMsgs=TRUE)
persp3d(dxyz, col = "lightblue")

Это приводит к довольно уродливой картине, но при некоторой работе (например, исправление меток оси, использование реальных данных) вы должны получить что-то разумное.

...