This document explains plotting geospatial data using ggplot2 and {ggfortify}.

Plotting with {maps} package

{ggplot2} can load map data provided by {maps} and {mapdata} package via map_data function. Loaded data is automatically converted to data.frame, thus you can plot maps via ggplot as below.

library(mapdata)
library(ggplot2)

jp <- ggplot2::map_data('world2', 'japan')
class(jp)
## [1] "data.frame"
head(jp)
##       long      lat group order region     subregion
## 1 123.8887 24.28013     1     1  Japan Iriomote Jima
## 2 123.8256 24.26606     1     2  Japan Iriomote Jima
## 3 123.7498 24.28330     1     3  Japan Iriomote Jima
## 4 123.6807 24.28804     1     4  Japan Iriomote Jima
## 5 123.6798 24.31777     1     5  Japan Iriomote Jima
## 6 123.7523 24.34849     1     6  Japan Iriomote Jima
ggplot(jp, aes(x = long, y = lat, group = group)) +
  geom_polygon()

plot of chunk unnamed-chunk-1

{ggfortify} additionally allows to autoplot map instances as it is. You can specify geom and other options to controll the outlooks.

library(ggfortify)
jp <-  map('world2', 'japan', plot = FALSE, fill = TRUE)
class(jp)
## [1] "map"
autoplot(jp)

plot of chunk unnamed-chunk-2

p <- autoplot(jp, geom = 'polygon', fill = 'subregion') + 
  theme(legend.position="none")
p

plot of chunk unnamed-chunk-2

Also, maps package provides some geospatial data. Following example retrieves Japanese city locations from world's city locations. Then plot on the previous map.

cities <- get('world.cities')
cities <- cities[cities$country.etc == 'Japan', ]
head(cities)
##         name country.etc    pop   lat   long capital
## 189 Abashiri       Japan  42324 44.02 144.27       0
## 221    Abiko       Japan 132577 35.88 140.03       0
## 481     Ageo       Japan 220766 35.95 139.61       0
## 514      Ago       Japan  23876 34.33 136.82       0
## 571     Agui       Japan  24227 34.95 136.91       0
## 629   Aikawa       Japan  43599 35.55 139.29       0
p + geom_point(data = cities, aes(x = long, y = lat),
               colour = 'blue', size = 0.1)

plot of chunk unnamed-chunk-3

Because map plot created by {ggfortify} has a setting of aes(x = long, y = lat), you don't have to specify x and y aethetics in this case.

p + geom_point(data = cities, colour = 'blue', size = 0.1)

plot of chunk unnamed-chunk-4

Plotting with {sp} package

Also, {ggfortify} can supports geospatial instances defined in {sp} package. Actually some functions are defined in {ggplot2}. Following table shows where each function is defined.

class fortify autoplot
Line {ggplot2} {ggfortify}
Lines {ggplot2} {ggfortify}
Polygon {ggplot2} {ggfortify}
Polygons {ggplot2} {ggfortify}
SpatialLines {ggfortify} {ggfortify}
SpatialLinesDataFrame {ggplot2} {ggfortify}
SpatialPoints {ggfortify} {ggfortify}
SpatialPointsDataFrame {ggfortify} {ggfortify}
SpatialPolygons {ggplot2} {ggfortify}
SpatialPolygonsDataFrame {ggplot2} {ggfortify}

Following example creates SpatialPointsDataFrame of some Japanese city's populatios, then plot it via autoplot. Note that you geom is specified by the original {sp} class. SpatialPoints is plot using geom_point for example.

library(sp)
df <- data.frame(long = c(139.691704, 135.519711),
                 lat = c(35.689521, 34.686316),
                 label = c('Tokyo', 'Osaka'),
                 population = c(1335, 886))
coordinates(df) <- ~ long + lat
class(df)
## [1] "SpatialPointsDataFrame"
## attr(,"package")
## [1] "sp"
autoplot(df, p = p, colour = 'red', size = 10)

plot of chunk unnamed-chunk-5

Also, you can use other columns as aethetics.

autoplot(df, p = p, colour = 'red', size = 'population') +
  scale_size_area()

plot of chunk unnamed-chunk-6

Plotting with other packages

autoplot has p keyword to take existing ggplot instance. Below example plots SpatialPointsDataFrame on the ggmap.

library(ggmap)
bbox <- c(130.0, 30.0, 145.0, 45.0)
map <- get_openstreetmap(bbox = bbox, scale = 47500000)
p <- ggmap(map)
autoplot(df, p = p, colour = 'red', size = 'population') + 
  scale_size_area() +
  theme(legend.justification = c(1, 0), legend.position = c(1, 0))

ggmap_output