(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_)

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 his blog: Recology - R.
R-bloggers.com offers daily e-mail updates about R news and tutorials on topics such as: visualization (ggplot2, Boxplots, maps, animation), programming (RStudio, Sweave, LaTeX, SQL, Eclipse, git, hadoop, Web Scraping) statistics (regression, PCA, time series, trading) and more...

Zero Inflated Models and Generalized Linear Mixed Models with R.
Zuur, Saveliev, Ieno (2012).