2017-01-24 3 views
3

Скажем, у меня есть набор координат, как это, например:Как создать минимальный ограничивающий прямоугольник над полным набором данных в R

m <- data.frame(replicate(2,sample(0:9,20,rep=TRUE))) 

И я хочу, чтобы нарисовать прямоугольник вокруг всех точек так, что он создает минимальный ограничивающий прямоугольник.

a <- bounding.box.xy(m) 
plot(m) 
par(new=T) 
plot(a, main="Minimum bounding rectangle") 

Но коробка не обошла все точки.

Я также заинтересован в том, чтобы нарисовать окружность/эллипс стандартного отклонения вокруг этих точек, но я не знаю функции для этого.

enter image description here

ответ

4

RECTANGLE

Вы можете получить значение минимального и максимального х и у, а затем сделать polygon, используя эти значения. Попробуйте это:

set.seed(42) 
m <- data.frame(replicate(2,sample(0:9,20,rep=TRUE))) 
lx = min(m$X1) 
ux = max(m$X1) 
ly = min(m$X2) 
uy = max(m$X2) 
plot(m) 
title(main = "Minimum bounding rectangle") 
polygon(x = c(lx, ux, ux, lx), y = c(ly, ly, uy, uy), lty = 2) 

enter image description here

многоугольник

Более обсуждение рисования кривой вокруг множества точек можно найти here. Один из способов - использовать команду chull для создания выпуклого корпуса.

Первый импорт следующая функция

plot_boundary <- function(x,y,offset = 0,lty = 1,lwd = 1,border = "black",col = NA){ 
# 'offset' defines how much the convex hull should be bumped out (or in if negative value) 
# relative to centroid of the points. Typically value of 0.1 works well 
BX = x + offset*(x-mean(x)) 
BY = y + offset*(y-mean(y)) 
k2 = chull(BX,BY) 
polygon(BX[k2],BY[k2],lty = lty,lwd = lwd,border = border,col = col) 
} 

Затем вы можете генерировать данные и границы участка вокруг него.

set.seed(242) 
m <- data.frame(replicate(2,sample(0:9,20,rep=TRUE))) 
plot(m, xlim = c(0,10), ylim = c(0,10)) 
title(main = "Minimum bounding rectangle") 
plot_boundary(x = m$X1, y = m$X2, lty = 2) 

enter image description here

ЭЛЛИПС

set.seed(42) 
A = data.frame(x = rnorm(20, 25, 4), y = rnorm(20, 11, 3)) 
B = data.frame(x = rnorm(20, 12, 5), y = rnorm(20, 5, 7)) 
plot(rbind(A,B), type = "n", ylim = c(-10,20), xlim = c(0,40), asp = 1) 
require(ellipse) 
red_eli = ellipse(cor(A$x,A$y), scale = c(sd(A$x), sd(A$y)), 
           centre = c(mean(A$x), mean(A$y))) 
blue_eli = ellipse(cor(B$x,B$y), scale = c(sd(B$x), sd(B$y)), 
           centre = c(mean(B$x), mean(B$y))) 
points(A, pch = 19, col = "red") 
points(B, pch = 18, col = "blue") 
lines(red_eli, col = "red") 
lines(blue_eli, col = "blue", lty = 2) 

enter image description here

Смежные вопросы