I want to facet_wrap a map plot by a data variable in ggplot2 - e.g. 'pets' in the example below. Does this require complete duplication of fortified map data for each variable category? That would strike me as a bit silly. Is there an alternative method?
require(ggplot2)
(nz_dat = data.frame(island = rep(c('North.Island ','South.Island '), 3),
pets = c('cats','cats','dogs','dogs','birds','birds'),
n = c(13, 26, 48, 74, 24, 17)))
island pets n
1 North.Island cats 13
2 South.Island cats 26
3 North.Island dogs 48
4 South.Island dogs 74
5 North.Island birds 24
6 South.Island birds 17
nz = map_data("nz")
nz = subset(nz, nz$region %in% c('North.Island ','South.Island ')) # 2 main islands
# simple plot
ggplot(nz, aes(long, lat, group=group, fill=factor(region))) +
geom_polygon() + coord_quickmap()
facet_wrap() makes a long ribbon of panels (generated by any number of variables) and wraps it into 2d. This is useful if you have a single variable with many levels and want to arrange the plots in a more space efficient manner.
The facet_grid() function will produce a grid of plots for each combination of variables that you specify, even if some plots are empty. The facet_wrap() function will only produce plots for the combinations of variables that have values, which means it won't produce any empty plots.
You can tweak the aesthetics a bit:
library(ggthemes) # for theme_map
gg <- ggplot()
# lay down a base map (no borders or fills)
# geom_map is a great way to do map layers like you would in any GIS
gg <- gg + geom_map(data=nz, map=nz,
aes(x=long, y=lat, map_id=region),
color="#00000000", fill="#0000000", size=0.5)
# since "island" equates to the "nz" map id of "region" use that
# to "map" (in the data operation sense) the value in "n" to the
# named polygon
gg <- gg + geom_map(data=nz_dat, map=nz,
aes(fill=n, map_id=island, color=n))
# it's highly unlikely these values needed a continuous scale
# so use a shortcut to colorbrewer with scale_*_distiller, scaling
# both the color & fill so there are no black borders
gg <- gg + scale_fill_distiller()
gg <- gg + scale_color_distiller()
# the OP did good here since it's better than Mercator for
# NZ and NZMG coord system is not avail with coord_map()
gg <- gg + coord_quickmap()
# ggplot will make many maps!
gg <- gg + facet_wrap(~pets)
# ggplot will make clean maps!
gg <- gg + theme_map()
# put the legend wherever you want
gg <- gg + theme(legend.position="right")
gg
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With