ggplot2 maps with insets

August 22, 2012
By

(This article was first published on Recology - R, and kindly contributed to R-bloggers)

Here’s a quick demo of creating a map with an inset within it using ggplot. The inset is achieved using the gridExtra package.

Install libraries, set directory, read file

setwd("/Users/ScottMac/Dropbox/CANPOLIN_networks_ms/data")  # change to your directory
library(ggplot2)
library(maps)
library(maptools)
library(gridExtra)
library(rgeos)
dat <- read.csv("siteinfo_blog.csv")
head(dat)
  ecosystem   lat    lon
1  oak sav. 48.81 -123.6
2  oak sav. 48.79 -123.6
3  oak sav. 48.82 -124.1
4  oak sav. 48.82 -124.1
5  oak sav. 48.78 -123.9
6  oak sav. 48.78 -123.9

Get maps

# Get a map of Canada
canadamap <- data.frame(map("world", "Canada", plot = FALSE)[c("x", "y")])

# Get a map of smaller extent
canadamapsmall <- canadamap[canadamap$x < -90 & canadamap$y < 54, ]

Make the maps

# The inset map, all of Canada
a <- ggplot(canadamap) + 
    theme_bw(base_size = 22) +
    geom_path(data = canadamap, aes(x, y), colour = "black", fill = "white") +
    scale_size(guide="none") +
    opts(panel.border = theme_rect(colour = 'black', size = 1, linetype=1),
             panel.grid.major = theme_blank(), panel.grid.minor=theme_blank(),
             panel.background = theme_rect( fill = 'white'),
             legend.position = c(0.15,0.80), legend.key = theme_blank(),
             axis.ticks = theme_blank(), axis.text.x=theme_blank(),
             axis.text.y=theme_blank()) +
    labs(x = '', y = '')

# The larger map, zoomed in, with the data
b <- ggplot(dat, aes(lon, lat, colour=ecosystem)) +
    theme_bw(base_size = 22) +
    geom_jitter(size=4, alpha=0.6) +
    geom_path(data = canadamapsmall, aes(x, y), colour = "black", fill = "white") +
    scale_size(guide="none") +
    opts(panel.border = theme_rect(colour = 'black', size = 1, linetype=1),
             panel.grid.major = theme_blank(), panel.grid.minor=theme_blank(),
             panel.background = theme_rect( fill = 'white'),
             legend.position = c(0.1,0.20), legend.text=theme_text(size=12, face='bold'), 
             legend.title=theme_text(size=12, face='bold'), legend.key = theme_blank(),
             axis.ticks = theme_segment(size = 2)) +
    labs(x = '', y = '')

Print the two maps together, one an inset of the other

This approach uses the gridExtra package for flexible alignment, etc. of ggplot graphs

grid.newpage()
vpb_ <- viewport(width = 1, height = 1, x = 0.5, y = 0.5)  # the larger map
vpa_ <- viewport(width = 0.4, height = 0.4, x = 0.8, y = 0.8)  # the inset in upper right
print(b, vp = vpb_)
print(a, vp = vpa_)

center


Written in Markdown, with help from knitr, and nice knitr highlighting/etc. in in RStudio.

To leave a comment for the author, please follow the link and comment on their blog: Recology - R.

R-bloggers.com offers daily e-mail updates about R news and tutorials on topics such as: Data science, Big Data, R jobs, visualization (ggplot2, Boxplots, maps, animation), programming (RStudio, Sweave, LaTeX, SQL, Eclipse, git, hadoop, Web Scraping) statistics (regression, PCA, time series, trading) and more...



If you got this far, why not subscribe for updates from the site? Choose your flavor: e-mail, twitter, RSS, or facebook...

Comments are closed.

Sponsors

Mango solutions



RStudio homepage



Zero Inflated Models and Generalized Linear Mixed Models with R

Quantide: statistical consulting and training



http://www.eoda.de







ODSC

ODSC

CRC R books series











Contact us if you wish to help support R-bloggers, and place your banner here.

Never miss an update!
Subscribe to R-bloggers to receive
e-mails with the latest R posts.
(You will not see this message again.)

Click here to close (This popup will not appear again)