Я делаю функцию, которая получает три вектора, интерполирует их с помощью akima и строит их с помощью plot_ly ().Хотя общий код работает, у меня возникают проблемы с масштабированием z-матрицы, которые выводит interp () .
Позвольте привести пример:
- x - это число не-NA, содержащее некоторые повторяющиеся значения.
- y - это число не-NA, содержащее несколько повторяющихся значений.
- z - непрерывный вектор не-NA
Немного сводной статистики:
> unique(x)
[1] 60 48 36 32 18 24 30 15 12 28 21 19 54 20 16 27 10 39 14 17 9 6 50 8 13
> range(x)
[1] 6 60
> unique(y)
[1] 10.00 10.50 13.50 12.50 14.00 12.00 11.00 9.00 11.50 9.25 13.00 10.25 6.50 6.75 8.25 9.50
[17] 8.00 8.85 9.75 7.90 7.00 8.60 8.75 7.50 8.90 8.50 7.49 7.40 5.50 7.60 7.25 8.35
[33] 6.00 5.00 7.75 7.35 6.30 4.50 5.75 8.40 5.60 5.90 7.74 9.90 6.20 5.80
> range(y)
[1] 4.5 14.0
> head(z)
[1] 2.877272 3.267328 3.175478 3.843326 4.809792 2.827825
> range(z)
[1] 2.316529 28.147808
Я реализую базовую функцию ниже:
labs = list(x = 'x', y = 'y', z = 'z')
mat = interp(x, y, z, duplicate = 'mean', extrap = T, xo = sort(unique(x)))
plot_ly(x = mat$x, y = mat$y, z = mat$z, type = 'surface') %>%
layout(title = title,
scene = list(xaxis = list(title = labs$x),
yaxis = list(title = labs$y),
zaxis = list(title = labs$z)))
Когда я запускаю это, вывод будет следующим:
Проблема в том, что часть данных не представлена на этом рисунке.Например, существует значительная часть данных около x> 50, y <11, которая пропускается интерполяцией (и, следовательно, не отображается). </p>
length(x[x > 50])
[1] 304
> length(y[x > 50 & y < 11])
[1] 290
> length(z[x > 50 & y < 11])
[1] 290
Я подозревал, что это связано с дубликатом xценности.Следовательно, я настроил аргумент xo в interp () так, чтобы:
mat = interp(x, y, z, duplicate = 'mean', xo = sort(unique(x)), decreasing = T)
В этом случае ранее пропущенная область частично отображается.Это выглядит следующим образом:
Тем не менее, оси x и y по-прежнему не соответствуют соответствующим диапазонам данных (несмотря на доступность данных).Итог: как настроить функцию так, чтобы поверхность всегда расширяла весь диапазон x и y?
Best