Contours and Networks with epimap and rleafmap
In February, I participated in a hackaton organized by Thibaut Jombart at Imperial College, London, to work on visualization tools for outbreak data. This was a great time spent with great people! Thanks again, Thibaut, for organizing. I took part in the development of epimap
, an R package for statistical mapping. The aim of epimap is to provide tools to quickly and efficiently visualize spatial data. There is a set of functions designed to do that and you can check out the Github page for a demo.
This package also provides two functions to coerce complex objects to Spatial classes so that they can be easily included in a map.
- The
contour2sp
function takes a SpatialGrid object and returns contour lines as a SpatialLinesDataFrame. - The
graph2sp
function takes a graph (fromigraph
package) with geolocated vertices and returns a list of Spatial objects (points and lines).
Following this post of Arthur Charpentier (who nicely plays with rleafmap
!), I decided to include the John Snow’s Cholera dataset in epimap
so it can be simply used for tests.
In this post I want to show how epimap
and rleafmap
can be combined to create fully customizable interactive maps with complex objects. The cholera dataset gives the locations of cholera deaths and the locations of water pumps in London. The maps will show the location of cholera deaths with points, the local density of deaths with colored contour lines and the location of water pumps with icons. Moreover, the pumps will be represented within a network where two pumps are connected if there are close enough.
library(rleafmap) library(epimap) data(cholera) # Create a network of pumps pump.adj <- as.matrix(dist(sp::coordinates(cholera$pumps))) pump.graph <- graph.adjacency(pump.adj < 0.003, diag = FALSE) V(pump.graph)$lat <- coordinates(cholera$pumps)[, 2] V(pump.graph)$lon <- coordinates(cholera$pumps)[, 1] # Convert death density SpatialGrid to contour SpatialLines death.cont <- contour2sp(cholera$deaths.den, nlevels = 10) # Basemap layer cdbdark.bm <- basemap("cartodb.darkmatter.nolab") # Data layers death.points <- spLayer(cholera$deaths, size = 1, fill.col = "white", fill.alpha = 0.5, stroke = FALSE) death.contour <- spLayer(death.cont, stroke.col = heat.colors(12)[cut(death.cont$level, 12)], stroke.lwd = 1.5, stroke.alpha = 1) pumps.points <- spLayer(graph2sp(pump.graph)[[1]], png = "/home/francois/water.png", png.width=31 , png.height=31) pumps.links <- spLayer(graph2sp(pump.graph)[[2]], stroke.lwd = 3, stroke.col = "white") my.ui <- ui(layers = "topright") writeMap(cdbdark.bm, death.points, death.contour, pumps.links, pumps.points, interface = my.ui)
And here is the map we get: