Интерполяция и построение поверхности - PullRequest
0 голосов
/ 30 мая 2019

Я пытаюсь построить поверхность с помощью графического пакета, используя три вектора (x, y, z) в качестве входных данных.

x, y - векторы факторов и определяют систему координат в плоскости xy, а z - числовой вектор, определяющий высоту точек поверхности.

x_hm <- sel_mat$xlogbin ## a vector of factors
y_hm <- sel_mat$ylogbin ## a vector of factors
z_hm <- as.numeric(sel_mat$logbin_log_avg) ## a numeric vector

Вы можете посмотреть форму данных в

> head(x_hm,10)
 [1] (4.59e+05,5.78e+05] (1.83e+05,2.3e+05]  (1.15e+05,1.45e+05] (2.9e+05,3.65e+05]  (3.65e+05,4.59e+05]
 [6] (3.65e+05,4.59e+05] (9.16e+04,1.15e+05] (2.9e+05,3.65e+05]  (7.28e+04,9.16e+04] (7.28e+04,9.16e+04]
50 Levels: (57.8,72.8] (72.8,91.6] (91.6,115] (115,145] (145,183] (183,230] (230,290] (290,365] ... (4.59e+06,5.78e+06]

> head(y_hm,10)
 [1] (4.76e+04,6e+04]    (3.01e+04,3.78e+04] (9.5e+03,1.2e+04]   (3.01e+04,3.78e+04] (3.78e+04,4.76e+04]
 [6] (3.01e+04,3.78e+04] (7.55e+03,9.5e+03]  (3.78e+04,4.76e+04] (9.5e+03,1.2e+04]   (7.55e+03,9.5e+03] 
32 Levels: (600,755] (755,950] (950,1.2e+03] (1.2e+03,1.51e+03] (1.51e+03,1.9e+03] ... (7.55e+05,9.5e+05]

> head(z_hm,10)
 [1] 10.552476 10.653927  9.830332 10.427928 10.494196 10.692581  9.612432 10.226068  9.725735  9.505427

и по своим размерам

> length(x_hm)
[1] 484
> length(y_hm)
[1] 484
> length(z_hm)
[1] 484

Я могу построить тепловую карту с помощью команды

p <- plot_ly(x=x_hm,y=y_hm,z=z_hm,type = "heatmap")
p

график тепловых карт

Но когда я пытаюсь применить тип "поверхность", с помощью команды

p <- plot_ly(x=x_hm,y=y_hm,z=z_hm,type = "surface")
p

Я получаю пустой участок.

пустой участок

Я искал в Интернете решения, и, видимо, огромное количество NA делает невозможным построение поверхности. По этой ссылке (https://community.plot.ly/t/need-help-with-3d-surface-plot-in-r-using-plotly/2964) есть решение той же проблемы. По сути, вы создаете информационный кадр z измерения (длина (x), длина (y)), интерполируя отсутствующее значение с помощью функции interp из akima. Вот код, который я использую:

surf <- akima::interp(1:length(x_hm), 1:length(y_hm),xo=1:length(x_hm),yo=1:length(y_hm), z_hm, duplicate = "mean")
surf$z

но surf $ z - это матрица всех NA.

    [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15] [,16] [,17]
  [1,]   NA   NA   NA   NA   NA   NA   NA   NA   NA    NA    NA    NA    NA    NA    NA    NA    NA
  [2,]   NA   NA   NA   NA   NA   NA   NA   NA   NA    NA    NA    NA    NA    NA    NA    NA    NA
  [3,]   NA   NA   NA   NA   NA   NA   NA   NA   NA    NA    NA    NA    NA    NA    NA    NA    NA
  [4,]   NA   NA   NA   NA   NA   NA   NA   NA   NA    NA    NA    NA    NA    NA    NA    NA    NA
  [5,]   NA   NA   NA   NA   NA   NA   NA   NA   NA    NA    NA    NA    NA    NA    NA    NA    NA
  [6,]   NA   NA   NA   NA   NA   NA   NA   NA   NA    NA    NA    NA    NA    NA    NA    NA    NA
  [7,]   NA   NA   NA   NA   NA   NA   NA   NA   NA    NA    NA    NA    NA    NA    NA    NA    NA
  [8,]   NA   NA   NA   NA   NA   NA   NA   NA   NA    NA    NA    NA    NA    NA    NA    NA    NA
  [9,]   NA   NA   NA   NA   NA   NA   NA   NA   NA    NA    NA    NA    NA    NA    NA    NA    NA
 [10,]   NA   NA   NA   NA   NA   NA   NA   NA   NA    NA    NA    NA    NA    NA    NA    NA    NA

Может ли кто-нибудь помочь мне разобраться с общей проблемой построения поверхности или дать мне какой-нибудь совет по части интерполяции?

Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...