[This article was first published on Recology - R, and kindly contributed to R-bloggers]. (You can report issue about the content on this page here)
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.
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 their blog: Recology - R.
R-bloggers.com offers daily e-mail updates about R news and tutorials about learning R and many other topics. Click here if you're looking to post or find an R/data-science job.
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.