Sto creando grafici di densità con kde2d (MASS) su dati lat e lon. Vorrei sapere quali punti dei dati originali si trovano all'interno di un contorno specifico.R - Come trovare punti all'interno di Contour specifico
Creo i contorni del 90% e 50% utilizzando due approcci. Voglio sapere quali sono i punti all'interno del contorno del 90% e quali sono all'interno del contorno del 50%. I punti nel contorno del 90% conterranno tutti quelli all'interno del contorno del 50%. Il passo finale è trovare i punti all'interno del contorno del 90% che non si trovano all'interno del contorno del 50% (non ho necessariamente bisogno di aiuto con questo passaggio).
# bw = data of 2 cols (lat and lon) and 363 rows
# two versions to do this:
# would ideally like to use the second version (with ggplot2)
# version 1 (without ggplot2)
library(MASS)
x <- bw$lon
y <- bw$lat
dens <- kde2d(x, y, n=200)
# the contours to plot
prob <- c(0.9, 0.5)
dx <- diff(dens$x[1:2])
dy <- diff(dens$y[1:2])
sz <- sort(dens$z)
c1 <- cumsum(sz) * dx * dy
levels <- sapply(prob, function(x) {
approx(c1, sz, xout = 1 - x)$y
})
plot(x,y)
contour(dens, levels=levels, labels=prob, add=T)
E qui è la versione 2 - utilizzando ggplot2. Preferirei utilizzare questa versione per trovare i punti all'interno dei contorni del 90% e 50%.
# version 2 (with ggplot2)
getLevel <- function(x,y,prob) {
kk <- MASS::kde2d(x,y)
dx <- diff(kk$x[1:2])
dy <- diff(kk$y[1:2])
sz <- sort(kk$z)
c1 <- cumsum(sz) * dx * dy
approx(c1, sz, xout = 1 - prob)$y
}
# 90 and 50% contours
L90 <- getLevel(bw$lon, bw$lat, 0.9)
L50 <- getLevel(bw$lon, bw$lat, 0.5)
kk <- MASS::kde2d(bw$lon, bw$lat)
dimnames(kk$z) <- list(kk$x, kk$y)
dc <- melt(kk$z)
p <- ggplot(dc, aes(x=Var1, y=Var2)) + geom_tile(aes(fill=value))
+ geom_contour(aes(z=value), breaks=L90, colour="red")
+ geom_contour(aes(z=value), breaks=L50, color="yellow")
+ ggtitle("90 (red) and 50 (yellow) contours of BW")
creo le trame con tutti i punti lat e lon tracciati e il 90% e il 50% contorni. Voglio semplicemente sapere come estrarre i punti esatti all'interno dei contorni del 90% e 50%.
Ho provato a trovare i valori z (l'elevazione dei grafici di densità da kde2d) associati a ciascuna riga di valori lat e lon ma non ha avuto fortuna. Stavo anche pensando di aggiungere una colonna ID ai dati per etichettare ciascuna riga e poi trasferirla in qualche modo dopo aver usato melt()
. Quindi potrei semplicemente impostare sottoinsieme i dati che hanno valori di z che corrispondono a ciascun contorno che voglio e vedere quale lat e lon sono confrontati con i dati BW originali basati sulla colonna ID.
Ecco una foto di quello di cui sto parlando:
Voglio sapere che i punti rossi sono all'interno del 50% di contorno (blu) e quali sono all'interno del contorno del 90% (rosso).
Nota: gran parte di questo codice proviene da altre domande. Grande grido a tutti quelli che hanno contribuito!
Grazie!
Quando si dice " all'interno dei contorni del 90% e 50% "vuoi dire che vuoi sapere il lat/lon di tutti i punti per i quali z-val ue è maggiore del 90% o 50% di tutti i valori z? – eipi10
Modificato in questione - Voglio trovare i punti rossi che si trovano all'interno dei 2 cerchi del contorno. – squishy