I have been trawling around for a while now trying to find a simple and understandable way of representing geospatial data in R, whilst retaining the ability to manipulate the visualisation in ggplot. After much searching I came across some articles which got me to a working product only after a lot of ball ache. All the coding is done in R, so if you don’t know what it is click here. I keep the code simple, mainly because I don’t need it to be more complex for my purposes, but it also helps newbies like me learn the syntax faster.
1.0 Fetching a Map
Maps may be brought into R from a number of sources, the two main ones are GoogleMaps and OpenStreetMap. The code needed to fetch the map is slightly different depending on where you want the data from. Below are some examples:
libary (ggmap) ggmap( get_googlemap( center=c(-3.17486, 55.92284), #Long/lat of centre, or "Edinburgh" zoom=14, maptype='satellite', #also hybrid/terrain/roadmap scale = 2), #resolution scaling, 1 (low) or 2 (high) size = c(600, 600), #size of the image to grab extent='device', #can also be "normal" etc darken = 0) #you can dim the map when plotting on top ggsave ("/Users/s0679701/Desktop/map.png", dpi = 200) #this saves the output to a file
This outputs the following files:
We can also obtain a map from OpenStreetMap:
libary (ggmap) ggmap( get_openstreetmap ( bbox = c(-3.16518, 55.91899, -3.18473, 55.92716), format = "png" ), ggsave ("/Users/s0679701/Desktop/map.png", dpi = 200) #this saves the output to a file
You may receive the following error:
Error: map grabbing failed - see details in ?get_openstreetmap. In addition: Warning message: In download.file(url, destfile = destfile, quiet = !messaging, mode = "wb") : cannot open: HTTP status was '503 Service Unavailable'
This is because the OpenMapServer has issues, and so you just need to be lucky! Hence why there is no OpenStreetMap for this example…. yet.
2.0 Plotting on a Map
You can plot any [x,y, +/- z] information you’d like on top of a ggmap, so long as x and y correspond to longitudes and latitudes within the bounds of the map you have fetched. To plot on top of the map you must first make your map a variable and add a geom layer to it. Here is an example:
libary (ggmap) #Generate some data long = c(-3.17904, -3.17765, -3.17486, -3.17183) lat = c(55.92432, 55.92353, 55.92284, 55.92174) who = c("Darren", "Rachel", "Johannes", "Romesh") data = data.frame (long, lat, who) map = ggmap( get_googlemap( center=c(-3.17486, 55.92284), zoom=16, maptype='hybrid', scale = 2), size = c(600, 600), extent='normal', darken = 0) map + geom_point ( data = data, aes ( x = long, y = lat, fill = factor (who) ), pch = 21, colour = "white", size = 6 ) + scale_fill_brewer (palette = "Set1", name = "Homies") + #for more info on these type ?theme() theme ( legend.position = c(0.05, 0.05), # put the legend INSIDE the plot area legend.justification = c(0, 0), legend.background = element_rect(colour = F, fill = "white"), legend.key = element_rect (fill = F, colour = F), panel.grid.major = element_blank (), # remove major grid panel.grid.minor = element_blank (), # remove minor grid axis.text = element_blank (), axis.title = element_blank (), axis.ticks = element_blank () ) ggsave ("/Users/s0679701/Desktop/map.png", dpi = 200)
This simple code should be enough to get you going making your own plots. If you have any questions about this code or your own, then please don’t hesitate with getting in touch via the comments below.