ggmap: plot polygon from shapefile

as.data.frame() does not work for SpatialPolgons in geom_polygon, because the geometry gets lost. You have to use ggplot2::fortify (may be deprecated in the future, see ?fortify). The recommended way is now to use broom::tidy:

R> library("broom")
R> head(tidy(kommune))
Regions defined for each Polygons
   long   lat order  hole piece group  id
1 10.29 59.72     1 FALSE     1 153.1 153
2 10.32 59.70     2 FALSE     1 153.1 153
3 10.32 59.69     3 FALSE     1 153.1 153
4 10.31 59.68     4 FALSE     1 153.1 153
5 10.30 59.67     5 FALSE     1 153.1 153
6 10.28 59.67     6 FALSE     1 153.1 153

But another problem arises with your example. Since the polygon is larger than the map extent, ggmap does not correctly clip the polygon. ggmap sets the limits on the scale, this will throw away all data that's not inside these limits.

Here is a modified version of your code:

p <- ggmap(map, extent = "normal", maprange = FALSE) +
     geom_point(data = as.data.frame(subscr),
                aes(x = lon, y = lat, size=pop),
                colour = "darkgreen") +
     geom_polygon(data = fortify(kommune),
                  aes(long, lat, group = group),
                  fill = "orange", colour = "red", alpha = 0.2) +
     theme_bw() +
     coord_map(projection="mercator",
               xlim=c(attr(map, "bb")$ll.lon, attr(map, "bb")$ur.lon),
               ylim=c(attr(map, "bb")$ll.lat, attr(map, "bb")$ur.lat))

print(p)

ggmap


To add to the answer above: For those following their excellent tutorial/answer and wondering how to solve the next problem about the polygon clipping (as I was!)

Here's the answer, courtesy of the user 'streamlinedmethod' at https://stackoverflow.com/questions/13982773/crop-for-spatialpolygonsdataframe

library(maptools)
library(raster)   ## To convert an "Extent" object to a "SpatialPolygons" object.
library(raster)   ## To convert an "Extent" object to a "SpatialPolygons" object.
library(rgeos)
data(wrld_simpl)

# Create the clipping polygon
CP <- as(extent(130, 180, 40, 70), "SpatialPolygons")
proj4string(CP) <- CRS(proj4string(wrld_simpl))

# Clip the map
out <- gIntersection(wrld_simpl, CP, byid=TRUE)

then when you plot out, you won't have the weird clipping issue.

Tags:

R

Shapefile

Ggmap