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