Интерполяция (акима) опускает часть данных, когда х / у содержит повторяющиеся элементы - PullRequest
0 голосов
/ 21 марта 2019

Я делаю функцию, которая получает три вектора, интерполирует их с помощью 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)))

Когда я запускаю это, вывод будет следующим:

Plot 1

Проблема в том, что часть данных не представлена ​​на этом рисунке.Например, существует значительная часть данных около 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)

В этом случае ранее пропущенная область частично отображается.Это выглядит следующим образом:

fig2

Тем не менее, оси x и y по-прежнему не соответствуют соответствующим диапазонам данных (несмотря на доступность данных).Итог: как настроить функцию так, чтобы поверхность всегда расширяла весь диапазон x и y?

Best

1 Ответ

0 голосов
/ 21 марта 2019

Оказывается, ошибка возникла из plot_ly () . По-видимому, z-матрица не может быть пропущена напрямую от interp () до plot_ly () , поскольку ось ошибочно передается на график. Следовательно, интерполированная z-матрица должна быть преобразована.

Если вы используете эти две функции в комбинации, убедитесь, что вы выполняете преобразование z, как показано ниже:

mat = interp(x,y,z, duplicate = 'mean')

x = mat$x
y = mat$y
z = matrix(mat$z, nrow = length(mat$y), byrow = TRUE)

plot_ly(x, y ,z, type = 'surface')
...