Я пытаюсь построить поверхность с помощью графического пакета, используя три вектора (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
Может ли кто-нибудь помочь мне разобраться с общей проблемой построения поверхности или дать мне какой-нибудь совет по части интерполяции?
Спасибо.