Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Maps with facet_wrap in ggplot2

Tags:

plot

r

ggplot2

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

enter image description here

like image 786
geotheory Avatar asked Aug 07 '15 11:08

geotheory


People also ask

What does Facet_wrap do in Ggplot?

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.

What is the difference between Facet_wrap and Facet_grid?

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.


1 Answers

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

enter image description here

like image 184
hrbrmstr Avatar answered Sep 24 '22 01:09

hrbrmstr