2015-08-05 2 views
3

У меня есть некоторые пространственные данные, и я использую приведенный ниже код, чтобы создать тепловую карту и извлечь созданные уровни в виде полигонов. Мой вопрос заключается в том, как ограничить количество создаваемых уровней? Моя цель состоит в том, чтобы иметь, например, 5 различных уровней плотности?Как ограничить количество уровней, созданных графиком плотности и?

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

Вот мой код до сих пор:

#Load packages 
library(ggplot2) 
library(sp) 

#create spatial data 
lon<-rnorm(10000,mean = 15,sd=1) 
lat<-rnorm(10000,mean=45,sd=1) 
data <-cbind.data.frame(lon,lat) 

#create the heatmap 
heatmap <- ggplot(data,aes(x=lon,y=lat))+ stat_density2d(data=data, 
             aes(x=lon, y=lat, fill=..level.., 
             alpha=..level..), geom="polygon") 

# build the heatmap without plotting it 
gb_heat <- ggplot_build(heatmap) 


# extract the polygon specifications 
gb_heat_dat <- gb_heat$data[[1]] 

# make some polygons! 
SpatialPolygons(lapply(unique(gb_heat_dat$group), function(x) { 
pts <- gb_heat_dat[gb_heat_dat$group == x,] 
Polygons(list(Polygon(as.matrix(data.frame(x=pts$x, y=pts$y)))), as.character(x)) 
})) -> polys 



# plot them 
plot(polys) 

Edit: Спасибо @ ответ pHroc, я могу контролировать количество уровней, и я также узнал, как извлечь многоугольники с тем же уровнем. Но теперь я столкнулся с проблемой, что некоторые созданные области очень маленькие. Есть ли способ контролировать минимальный размер области или количество точек, каждая из которых должна содержать по крайней мере одну область?

ответ

3

Чтобы получить первую часть вашего вопроса, вы можете добавить аргумент bins = 5 в stat_density2d().

heatmap <- ggplot(data,aes(x=lon,y=lat))+ stat_density2d(data=data, 
        aes(x=lon, y=lat, fill=..level.., alpha=..level..), 
        bins = 5, geom="polygon") 
+0

Спасибо! Это был хороший намек. Существует ли также возможность определить минимальную площадь для каждого уровня или назвать минимальное количество точек на каждом уровне? – user2988757

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