Интерполяция пути / кривой в R

В R я хочу интерполировать произвольный путь с постоянным расстоянием между интерполированными точками.

Тестовые данные выглядят так:

require("rgdal", quietly = TRUE)
require("ggplot2", quietly = TRUE)
r <- readOGR(".", "line", verbose = FALSE)
coords <- as.data.frame(r@lines[[1]]@Lines[[1]]@coords)
names(coords) <- c("x", "y")
print(coords)

x         y
-0.44409  0.551159
-1.06217  0.563326
-1.09867  0.310255
-1.09623 -0.273754
-0.67283 -0.392990
-0.03772 -0.273754
 0.63633 -0.015817
 0.86506  0.473291
 1.31037  0.998899
 1.43934  0.933198
 1.46854  0.461124
 1.39311  0.006083
 1.40284 -0.278621
 1.54397 -0.271321

p.orig <- ggplot(coords, aes(x = x, y = y)) + geom_path(colour = "red") + 
    geom_point(colour = "yellow")
print(p.orig)

http://i.imgur.com/0tusA.png

Я пробовал разные методы, ни один из них не дал особого удовлетворения:

  • aspline (акима-пакет)
  • approx
  • bezierCurve
  • с tourr-пакетом я не мог начать

aspline

aspline из пакета akima делает некоторые странные вещи при работе с произвольными путями:

plotInt <- function(coords) print(p.orig + geom_path(aes(x = x, y = y), 
    data = coords) + geom_point(aes(x = x, y = y), data = coords))
N <- 50        # 50 points to interpolate

require("akima", quietly = TRUE)
xy.int.ak <- as.data.frame(with(coords, aspline(x = x, y = y, n = N)))
plotInt(xy.int.ak)

http://i.imgur.com/GVoES.png

approx

xy.int.ax <- as.data.frame(with(coords, list(x = approx(x, n = N)$y, 
    y = approx(y, n = N)$y)))
plotInt(xy.int.ax)

http://i.imgur.com/pqvTy.png

На первый взгляд approx выглядит неплохо; однако тестирование с реальными данными дает мне проблемы с расстояниями между интерполированными точками. Также неплохо было бы сделать плавную кубическую интерполяцию.

bezier

Другой подход - использовать bezier-curves; Я использовал следующую реализацию

source("bez.R")
xy.int.bz <- as.data.frame(with(coords, bezierCurve(x, y, N)))
plotInt(xy.int.bz)

http://i.imgur.com/aCFPG.png


person michelk    schedule 06.07.2012    source источник


Ответы (2)


Как насчет обычных шлицев, используя тот же метод, который вы использовали для approx? Будет ли это работать с большими данными?

Сплайн-график

xy.int.sp <- as.data.frame(with(coords, list(x = spline(x)$y, 
                                             y = spline(y)$y)))
person sebastian-c    schedule 06.07.2012
comment
Спасибо @ sebastian-c, это в основном то, что я искал. Теперь мне нужно найти способы отфильтровать очень близкие точки и добавить точки к длинным сегментам, спасибо. - person michelk; 06.07.2012
comment
Для чего это в конце концов? В R есть несколько инструментов для отслеживания данных, и, похоже, они вам могут пригодиться. - person mdsumner; 06.07.2012
comment
@mdsummer, мне нужно интерполировать реку - person michelk; 13.07.2012

Рассмотрите возможность использования xspline или grid.xspline (первый для базовой графики, второй для сетки):

plot(x,y, type='b', col='red')
xspline(x,y, shape=1)

введите описание изображения здесь

Вы можете настроить параметр формы, чтобы изменить кривую, в этом примере просто отображается сплайн x, но вы также можете получить функцию, возвращающую набор координат xy, которые вы построили бы самостоятельно.

person Greg Snow    schedule 06.07.2012