R - 如何在特定轮廓内找到点

标签 r ggplot2 kde

我正在使用 kde2d (MASS) 在纬度和经度数据上创建密度图。我想知道原始数据中的哪些点在特定轮廓内。

我使用两种方法创建了 90% 和 50% 的轮廓。我想知道哪些点在 90% 的轮廓内,哪些点在 50% 的轮廓内。 90% 等高线中的点将包含 50% 等高线内的所有点。最后一步是在 90% 轮廓内找到不在 50% 轮廓内的点(我不一定需要这一步的帮助)。

# 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)

这是第 2 版 - 使用 ggplot2。理想情况下,我想使用此版本来查找 90% 和 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")

我创建了绘制了所有经纬度点以及 90% 和 50% 等高线的图。我只是想知道如何提取 90% 和 50% 轮廓内的确切点。

我试图找到与每一行 lat 和 lon 值相关联的 z 值(来自 kde2d 的密度图的高程),但没有运气。我还想我可以在数据中添加一个 ID 列来标记每一行,然后在使用 melt() 后以某种方式将其转移。 .然后我可以简单地对具有与我想要的每个轮廓匹配的 z 值的数据进行子集化,并查看它们与基于 ID 列的原始 BW 数据进行比较的纬度和经度。

这是我正在谈论的图片:

enter image description here

我想知道哪些红点在 50% 轮廓(蓝色)内,哪些在 90% 轮廓(红色)内。

注意:此代码大部分来自其他问题。向所有做出贡献的人致敬!

谢谢!

最佳答案

您可以使用 point.in.polygon来自 sp

## Interactively check points
plot(bw)
identify(bw$lon, bw$lat, labels=paste("(", round(bw$lon,2), ",", round(bw$lat,2), ")"))

## Points within polygons
library(sp)
dens <- kde2d(x, y, n=200, lims=c(c(-73, -70), c(-13, -12)))  # don't clip the contour
ls <- contourLines(dens, level=levels)
inner <- point.in.polygon(bw$lon, bw$lat, ls[[2]]$x, ls[[2]]$y)
out <- point.in.polygon(bw$lon, bw$lat, ls[[1]]$x, ls[[1]]$y)

## Plot
bw$region <- factor(inner + out)
plot(lat ~ lon, col=region, data=bw, pch=15)
contour(dens, levels=levels, labels=prob, add=T)

enter image description here

关于R - 如何在特定轮廓内找到点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30517160/

相关文章:

javascript - 让 Dygraph.WEEKLY 标签使用星期一作为 R 中的刻度

R ggplot : Move y axis to grid lines on polar plot (Polar_Coord)

r - 分组条形图,一个数值变量与三个因子变量

r - R 中的条件计算

r - Shiny 的交互式 ggplot 缺少误差线

linux - 良好的Gnome/kde/主题开发主题/环境?

fedora - 在fedora 20 kde中更改默认文本编辑器

linux - 无法在 ubuntu 15.10 上卸载 kde-desktop

r - 基于字符串列表的子集使用 grepl()?

r - 使用摘要而不是原始数据的箱线图