ggplot2/gis Plotting inside polygon area

前端 未结 1 1908
独厮守ぢ
独厮守ぢ 2021-01-19 09:31

For reproduction purposes, consider the following data:

library(rgdal)
library(ggplot2)
library(rgeos)

download.file(\"http://spatialanalysis.co.uk/wp-conte         


        
相关标签:
1条回答
  • 2021-01-19 09:57

    I found the answer by getting the polygon that is the difference between London's bounding box and London itself (using gDifference) and plotting it in white above everything. The downsides I can think for this approach are: 1) you have to manually increase the size of the polygon if some squares still appear behind it. 2) you can't use a plotting theme with complex background. So I'll leave the question open for a while if anyone has a better answer.

    Here's the code:

    library(rgdal)
    library(ggplot2)
    library(rgeos)
    
    projection="+proj=merc"
    
    #London boroughs polygons
    download.file("http://spatialanalysis.co.uk/wp-content/uploads/2010/09/London_Sport.zip", destfile = "London_Sport.zip")
    unzip("London_Sport.zip")
    london = readOGR("./", layer="london_sport")
    london = spTransform(london, CRS(projection))
    
    # Generate random points
    set.seed(1)
    points = data.frame(long=rnorm(10000, mean=-0.1, sd=0.1), lat=rnorm(10000, mean=51.5, sd=0.1))
    points = SpatialPoints(points, proj4string=CRS("+proj=latlon"))
    points = spTransform(points, CRS(projection))
    
    # Keep only points inside London
    intersection = gIntersects(points, london, byid = TRUE)
    inside = apply(intersection == TRUE, MARGIN = 2, any)
    points = points[which(inside), ]
    
    # Create a bounding box 10% bigger than the bounding box of London
    x_excess = (london@bbox['x','max'] - london@bbox['x','min'])*0.1
    y_excess = (london@bbox['y','max'] - london@bbox['y','min'])*0.1
    x_min = london@bbox['x','min'] - x_excess
    x_max = london@bbox['x','max'] + x_excess
    y_min = london@bbox['y','min'] - y_excess
    y_max = london@bbox['y','max'] + y_excess
    bbox = matrix(c(x_min,x_max,x_max,x_min,x_min,
                    y_min,y_min,y_max,y_max,y_min),
                  nrow = 5, ncol =2)
    bbox = Polygon(bbox, hole=FALSE)
    bbox = Polygons(list(bbox), "bbox")
    bbox = SpatialPolygons(Srl=list(bbox), pO=1:1, proj4string=london@proj4string)
    
    # Get the Polygon that is the difference between the bounding box and London
    outside = gDifference(bbox,london)
    
    # Blank theme
    new_theme_empty <- theme_bw()
    new_theme_empty$line <- element_blank()
    new_theme_empty$rect <- element_blank()
    new_theme_empty$strip.text <- element_blank()
    new_theme_empty$axis.text <- element_blank()
    new_theme_empty$plot.title <- element_blank()
    new_theme_empty$axis.title <- element_blank()
    new_theme_empty$plot.margin <- structure(c(0, 0, -1, -1), unit = "lines", valid.unit = 3L, class = "unit")
    
    # Prepare data for ggplot
    london = fortify(london)
    points = as.data.frame(points)
    outside = fortify(outside)
    
    # Plot!
    ggplot() + 
      geom_polygon(data=london, aes(x=long,y=lat,group=group), fill="black") +
      stat_bin2d(data=points, aes(x=long,y=lat), bins=40) +
      geom_path(data=london, aes(x=long,y=lat,group=id), colour='white') +
      geom_polygon(data=outside, aes(x=long,y=lat), fill='white') +
      coord_equal() +
      new_theme_empty
    

    Plot

    0 讨论(0)
提交回复
热议问题