Вот способ сделать это с помощью базовых функций построения графиков, но с использованием spDistsN1()
из библиотеки sp
, которая должна работать быстро для очень большого количества точек.
edit : я удалил зависимость от plotrix
библиотеки для рисования кругов, которая давала неверный результат.
draw_neighbors <- function(dat, focal_pt_index, n) {
require(sp)
# Calculate distances to focal point.
dists <- spDistsN1(pts = dat, pt = dat[focal_pt_index,])
# Sort points by distance.
dat <- cbind(dat, dist = dists)
dat <- dat[order(dat[,'dist']), ]
# Plot points
plot(dat[,1], dat[,2], pch=4 , col=ifelse(dat[,'dist'] == 0, "red", "black"), asp = 1)
# Draw a line to each neighbor
neighbors <- dat[2:(n+1), ]
for (i in 1:nrow(neighbors)) {
lines(x = c(dat[1,1], neighbors[i,1]), y = c(dat[1,2], neighbors[i,2]), col = 'red')
}
# Draw a circle at the radius equal to the largest distance within the n nearest neighbors.
radius <- dat[n+1, 'dist']
angles <- seq(0,2*pi,length=1000)
coords <- cbind(dat[1,1] + sin(angles) * radius, dat[1,2] + cos(angles)* radius)
points(coords, type = 'l', lty = 2, col = 'red')
}
Вот что вы получаете, используя свои данныедля n = 10
.
Звоните:
draw_neighbors(dat = cbind(feature1, feature2), focal_pt_index = which(feature1 > 2.6 & feature1 < 2.7), n = 10)
![enter image description here](https://i.stack.imgur.com/wYSxS.png)