From a83523668b26009e48f4a529a7ed14193b140c6f Mon Sep 17 00:00:00 2001 From: Robin Lovelace Date: Wed, 22 Mar 2017 02:44:17 +0000 Subject: [PATCH] Finish refactoring tutorial --- data/lnd84.Rds | Bin 14700 -> 14728 bytes intro-spatial.Rmd | 320 +++++++++++++-------------------------- vignettes/references.bib | 10 ++ 3 files changed, 118 insertions(+), 212 deletions(-) diff --git a/data/lnd84.Rds b/data/lnd84.Rds index 81c7bfb1a88b39f8c8eb2259c3f4b8579a2ff093..d51249f0aa9f59ed613f621d94224de8755f7256 100644 GIT binary patch literal 14728 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 WG*HNN!6HM>{{I3tcI8~Gi2wj*#$`JI literal 14700 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 diff --git a/intro-spatial.Rmd b/intro-spatial.Rmd index ac02eb7..b55d97e 100644 --- a/intro-spatial.Rmd +++ b/intro-spatial.Rmd @@ -666,7 +666,6 @@ to aggregate the crimes at the borough level, ready to join to our spatial crime_data <- read.csv("data/mps-recordedcrime-borough.csv", stringsAsFactors = FALSE) -head(crime_data, 3) # display first 3 lines head(crime_data$CrimeType) # information about crime type # Extract "Theft & Handling" crimes and save @@ -718,35 +717,14 @@ could equally be used. Note that when we ask for help for a function that is not loaded, nothing happens, indicating we need to load it: ```{r, results='hide', eval=FALSE} -?left_join # error flagged -??left_join -library(dplyr) # load the powerful dplyr package (use plyr if unavailable) -?left_join # should now be loaded (use join if unavailable) -``` - -The above code demonstrates how to search for functions that are not currently -loaded in R, using the `??` notation (short for `help.search` in the same way -that `?` is short for `help`). Note, you will need to have the **dplyr** package, -which provides fast and intuitive functions for processing data, installed for -this to work. After **dplyr** is loaded, a single question mark is sufficient to -load the associated help. - -The documentation for the `left_join` function -will be displayed if the plyr package is available (if not, -use `install.packages()` to install it). +library(dplyr) # load dplyr +``` + We use `left_join` because we want the length of the data frame to remain unchanged, with variables from new data appended in -new columns. Or, in R's rather terse documentation: -"return all rows from x, and all columns from x and y." -The `*join` commands (including `inner_join` and `anti_join`) are more -concise when joining variables have the -same name across both datasets. If they do not, there are two options: -1) rename one of them to match the other; -2) specify the association within the `*join` function. -Renaming is not always convinient, sometimes it is better not to change the -original data set. If you want to rename one of the variables, **dplyr** is -also helpful here as it contains a useful function `rename` (see `?rename`). -Here we will specify teh association between variables in the two data sets: +new columns (see `?left_join`). +The `*join` commands (including `inner_join` and `anti_join`) assume, by default, that matching variables have the same name. +Here we will specify the association between variables in the two data sets: ```{r, echo=FALSE, message=FALSE} # Load dplyr package @@ -760,10 +738,6 @@ head(crime_ag$Borough) # the variables to join # head(left_join(lnd@data, crime_ag)) # test it works lnd@data <- left_join(lnd@data, crime_ag, by = c('name' = 'Borough')) - -# the renaming option (uncomment to try it out) -# crime_ag <- rename(crime_ag, name = Borough) # rename the 'Borough' heading to 'name' -# lnd@data <- left_join(lnd@data, crime_ag) ``` Take a look at the new `lnd@data` object. You should @@ -797,50 +771,46 @@ grid.raster(readPNG("figure/lnd-crime.png")) > **Optional challenge:** create a map of additional variables in London With the attribute joining skills you have learned in this section, -you should now be able to take datasets from many sources and -join them to your geographical data. To test your skills, try to -join additional borough-level variables to the `lnd` object. -An excellent dataset on this can be found on the the -[data.london.gov.uk](http://data.london.gov.uk/dataset/london-borough-profiles) -website. - -Using this dataset and the methods developed above, Figure 8 was -created: the proportion of council seats won by the Conservatives -in the 2014 local elections. The **challenge** is to create -a similar map of a different variable (you may need to skip to -Part IV to plot continuous variables).^[Hint: the solution relies on the -**rgeos** function `gCentroid()`. To -see how this map was created, see the code -in intro-spatial.Rmd at [github.com/Robinlovelace/Creating-maps-in-R/blob/master/intro-spatial.Rmd](https://github.com/Robinlovelace/Creating-maps-in-R/blob/master/intro-spatial.Rmd).] - -```{r, echo=FALSE, results='hide', message=FALSE, warning=FALSE, fig.cap="Proportion of council seats won by Conservatives in the 2014 local elections using data from data.london.gov and joined using the methods presented in this section", , out.width="48%", fig.align="center"} -# install.packages("ggmap") -library(maptools) -library(ggmap) -borough_dat <- read.csv("data/london-borough-profiles-2014.csv") -names(borough_dat) -borough_dat <- dplyr::rename(borough_dat, conservative = Proportion.of.seats.won.by.Conservatives.in.2014.election) -borough_dat$conservative <- as.numeric(as.character(borough_dat$conservative)) -summary(borough_dat$conservative) -head(lnd$ons_label) -head(borough_dat$Code) -# check the joining variables work -summary(borough_dat$Code %in% lnd$ons_label) -# select the data to join -to_join <- select(borough_dat, Code, conservative) -lnd@data <- left_join(lnd@data, to_join, by = c('ons_label' = 'Code')) - -lnd_f <- fortify(lnd, region = "ons_label") -lnd_f <- left_join(lnd_f, to_join, by = c('id' = 'Code')) - -map <- ggplot(lnd_f, aes(long, lat, group = group, fill = conservative)) + - geom_polygon() + - coord_equal() + - labs(x = "Easting (m)", y = "Northing (m)", fill = "% Tory") + - scale_fill_continuous(low = "grey", high = "blue") + - theme_nothing(legend = T) -map -``` +you should now be able to take datasets from many sources, e.g. [data.london.gov.uk](http://data.london.gov.uk/dataset/london-borough-profiles), and +join them to your geographical data. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ## Clipping and spatial joins @@ -870,7 +840,7 @@ we will convert the 'stations' object to this: ```{r fig.cap="Sampling and plotting stations"} # Create reprojected stations object stations <- spTransform(stations, CRSobj = CRS(proj4string(lnd))) -plot(lnd) # plot London for context (see Figure 9) +plot(lnd) # plot London points(stations) # overlay the station points ``` @@ -885,7 +855,7 @@ so that only those falling within London boroughs are retained we can use ```{r fig.cap="The clipped stations dataset"} stations <- stations[lnd, ] -plot(stations) # test the clip succeeded (see Figure 10) +plot(stations) # test the clip succeeded ``` ```{r, echo=F,eval=FALSE} @@ -1099,7 +1069,7 @@ tm_facets("name", free.coords = TRUE, drop.units = TRUE) To create a basemap with tmap, you can use the `read_osm` function, from the [**tmaptools** package](https://github.com/mtennekes/tmaptools) as follows. Note that you must first transform the data into a *geographical* CRS: -```{r, fig.cap="London's population in 2001."} +```{r, fig.cap="London's population in 2001.", fig.width=4} # Transform the coordinate reference system lnd_wgs = spTransform(lnd, CRS("+init=epsg:4326")) osm_tiles = tmaptools::read_osm(bbox(lnd_wgs)) # download images from OSM @@ -1132,6 +1102,7 @@ http://docs.ggplot2.org/current/ . As a first attempt with **ggplot2** we can create a scatter plot with the attribute data in the `lnd` object created previously: ```{r} +library(ggplot2) p <- ggplot(lnd@data, aes(Partic_Per, Pop_2001)) ``` @@ -1178,91 +1149,51 @@ For this to work, either the **maptools** or **rgeos** packages must be installe ```{r, warning=FALSE} library(rgeos) -lnd_f <- fortify(lnd) # you may need to load maptools +lnd_f <- fortify(lnd) ``` This step has lost the attribute information associated with the lnd object. We can add it back using the `left_join` -function (this performs a data join). To use this function, ensure you have the dplyr package installed and loaded. -To find out how it works look at -the output of typing `?left_join`. As usual the help documentation -is a little sparse here, so let's consider what it means in more -detail. The help document explains that `left_join` retains all rows from the -original dataset `x`, whereas `inner_join` only -retains rows in `x` which have a match in `y`. If there is no match in the -joining variable, `inner_join` simply adds `NA` values for the new -variables for the affect rows. +function from the **dplyr** package +(see `?left_join`). -```{r} +```{r, results='hide'} head(lnd_f, n = 2) # peak at the fortified data lnd$id <- row.names(lnd) # allocate an id variable to the sp data head(lnd@data, n = 2) # final check before join (requires shared variable name) lnd_f <- left_join(lnd_f, lnd@data) # join the data ``` -Take a look at the `lnd_f` object to see its contents (which stands for "London, fortified"). You should see a large data frame containing the coordinates (Easting and Northing points as the data are in British National Grid format) alongside the attribute information associated with each London Borough. If you type `print(lnd_f)` you will see just how many coordinate pairs are required! -To keep the output to a minimum, take a peek at the first 2 lines of the object using just the `head` command: - -```{r} -lnd_f[1:2, 1:8] -``` - -It is now straightforward to produce a map using all the built-in tools -(such as setting the breaks in the data) that **ggplot2** has to offer. -`coord_equal()` is the equivalent of asp=T in regular plots with R: +The new`lnd_f` object contains coordinates alongside the attribute information associated with each London Borough. +It is now straightforward to produce a map with +**ggplot2**. +`coord_equal()` is the equivalent of `asp = T` in regular plots with R: ```{r fig.cap="Map of Lond Sports Participation"} map <- ggplot(lnd_f, aes(long, lat, group = group, fill = Partic_Per)) + - geom_polygon() + - coord_equal() + + geom_polygon() + coord_equal() + labs(x = "Easting (m)", y = "Northing (m)", fill = "% Sports\nParticipation") + ggtitle("London Sports Participation") ``` -Now, just typing `map` should result in your first ggplot-made map of London! -There is a lot going on in the code above, so think about it line by line: -what have each of the elements of code above been designed to do? -Also note how the `aes()` components can be combined into one set of brackets -after `ggplot`, that has relevance for all layers, rather than being -broken into separate parts as we did above. -The different plot functions still know what to do with these. -The `group=group` points ggplot to the group column added by -`fortify()` and it identifies the groups of coordinates that pertain -to individual polygons (in this case London Boroughs). - +Entering `map` should result in your first ggplot-made map of London. The default colours are really nice but we may wish to produce the map in black and white, -which should produce a map like the one shown below. Try changing the colours. +which should produce a map like the one shown below. Try changing the colours and saving plots with `ggsave()`. ```{r fig.cap="Greyscale map"} map + scale_fill_gradient(low = "white", high = "black") ``` -To save a plot image you just need to use `ggsave` after each plot, e.g. -`ggsave("my_map.pdf")` will save the map as a pdf, with default settings. For -a larger map, you could try the following: - -```{r, eval=FALSE} -ggsave("large_plot.png", scale = 3, dpi = 400) -``` - - - ## Creating interactive maps with **leaflet** -[Leaflet](http://leafletjs.com/) is probably the world's premier web +[Leaflet](http://leafletjs.com/) is the world's premier web mapping system, serving hundreds of thousands of maps worldwide each day. The JavaScript library actively developed at [github.com/Leaflet/Leaflet](https://github.com/Leaflet/Leaflet), has a strong user community. It is fast, powerful and easy to learn. -A recent package developed by RStudio, called -**leaflet**^[We also refer to this as **rstudio/leaflet**, after the -project's on-line home at -[github.com/rstudio/leaflet](https://github.com/rstudio/leaflet), -to avoid confusion with the JavaScript library.] -provides R bindings to Leaflet. -**rstudio/leaflet** -allows the creation and deployment of interactive web maps in few +The **leaflet** package +creates interactive web maps in few lines of code. One of the exciting things about the package is its tight integration with the R package for interactive on-line visualisation, **shiny**. @@ -1349,10 +1280,9 @@ Rename the date variable (use `?gsub` and Google 'regex' to find out more). lnd_f$date <- gsub(pattern = "Pop_", replacement = "", lnd_f$date) ``` -We can now use faceting to produce one map per year -(Fig. 19). +We can now use faceting to produce one map per year: -```{r fig.cap="Faceted plot of the distribution of London's population over time", fig.height=6, fig.width=6} +```{r fig.cap="Faceted plot of the distribution of London's population over time", fig.height=6, fig.width=5} ggplot(data = lnd_f, # the input data aes(x = long, y = lat, fill = pop/1000, group = group)) + # define variables geom_polygon() + # plot the boroughs @@ -1403,17 +1333,11 @@ the present tutorial. These can be found on the Other advanced tutorials include -- "Using spatial data" from the -[useR 2013 conference page](http://www.edii.uclm.es/~useR-2013//Tutorials/Bivand.html) -- "Geographically Weighted PCA", an in-depth and advanced tutorial by -[Chris Brunsdon](https://rpubs.com/chrisbrunsdon/99675) --"The Spatial Autoregression Regression Model and Correlation", another advanced -tutorial, also by [Chris Brunsdon](https://rpubs.com/chrisbrunsdon/sarcorr) -- "Using R as a GIS", a long and detailed online tutorial by [Francisco Rodriguez-Sanchez](https://pakillo.github.io/R-GIS-tutorial/). +- The Simple Features vignettes. - "solaR: Solar Radiation and Photovoltaic Systems with R", a [technical academic paper](http://www.jstatsoft.org/v50/i09/paper) on the solaR package which contains a number of spatial -function (. +functions. Such tutorials are worth doing as they will help you understand R's spatial 'ecosystem' as a cohesive whole @@ -1423,83 +1347,74 @@ the sum of its parts. The supportive on-line communities surrounding large open source programs such as R are one of their greatest assets, so we recommend you become an active -"[open source citizen](http://blog.cleverelephant.ca/2013/10/being-open-source-citizen.html)" rather than a passive consumer (Ramsey & Dubovsky, 2013). +"[open source citizen](http://blog.cleverelephant.ca/2013/10/being-open-source-citizen.html)" rather than a passive consumer. -This does not necessarily mean writing a new package or contributing -to R's 'Core Team' --- it can simply involve helping -others use R. We therefore conclude the tutorial with a list of resources -that will help you further sharpen you R skills, find help and contribute -to the growing on-line R community: +Good resources +that will help you further sharpen you R skills include: * R's homepage hosts a wealth of [official](http://cran.r-project.org/manuals.html) and [contributed](http://cran.r-project.org/other-docs.html) guides. http://cran.r-project.org * [StackOverflow](http://stackoverflow.com/search?q=[r]) and [GIS.StackExchange](http://gis.stackexchange.com/) groups (the "[R]" search term limits the results). If your question has not been answered yet, just ask, preferably with a reproducible example. * R's [mailing lists](http://www.r-project.org/mail.html), especially [R-sig-geo](https://stat.ethz.ch/pipermail/r-sig-geo/). See [r-project.org/mail.html](http://www.r-project.org/mail.html). -Books: despite the strength of R's on-line community, nothing beats a physical book for concentrated learning. We recommend the following: - - * Everitt and Hothorn (updated 2015): This handbook of statistical analyses is - available online as an [R package](https://cran.r-project.org/web/packages/HSAUR/). * Dorman (2014): detailed exposition of spatial data in R, with a focus on raster data. A [free sample](https://www.packtpub.com/packtlib/book/Big%20Data%20&%20Business%20Intelligence/9781783984367/4) of this book is available online. - * Wickham (2009): 'ggplot2: elegant graphics for data analysis' * Bivand et al. (2013) : 'Applied spatial data analysis with R' - provides a dense and detailed overview of spatial data analysis. - * Kabacoff (2011): 'R in action' is a general R book with many fun worked examples. - \clearpage - -# R quick reference + + + -`#`: comments all text until line end + -`df <- data.frame(x = 1:9, y = (1:9)^2`: create new object of class `data.frame`, called df, and assign values + -`help(plot)`: ask R for basic help on function, the same as `?plot`. Replace `plot` with any function (e.g. `spTransform`). + -`library(ggplot2)`: load a package (replace **ggplot2** with your package name) + -`install.packages("ggplot2")`: install package --- note quotation marks + -`setwd("C:/Users/username/Desktop/")`: set R's *working directory* (set it to your project's folder) + -`nrow(df)`: count the number of rows in the object `df` + -`summary(df)`: summary statistics of the object `df` + -`head(df)`: display first 6 lines of object `df` + -`plot(df)`: plot object `df` + -`save(df, "C:/Users/username/Desktop/" )`: save df object to specified location + -`rm(df)`: remove the `df` object + -`proj4string(df)`: query coordinate reference system of `df` object + -`spTransform(df, CRS("+init=epsg:4326")`: reproject `df` object to WGS84 + -# Further information + -An up-to-date version of this tutorial is maintained at -[https://github.com/Robinlovelace/Creating-maps-in-R](https://github.com/Robinlovelace/Creating-maps-in-R/blob/master/intro-spatial-rl.pdf). The source files used to create this tutorial, including -the input data can be downloaded as a -[zip file](https://github.com/Robinlovelace/Creating-maps-in-R/archive/master.zip), -as described below. The entire tutorial was written in -[RMarkdown](http://rmarkdown.rstudio.com/), which -allows R code to run as the document compiles, ensuring reproducibility. + + + + + + + -Any suggested improvements or new -[vignettes](https://github.com/Robinlovelace/Creating-maps-in-R/tree/master/vignettes) are welcome, via email -to Robin or by [forking](https://help.github.com/articles/fork-a-repo) -the [master version](https://github.com/Robinlovelace/Creating-maps-in-R/blob/master/intro-spatial.Rmd) of this document. + + + + -The colourful syntax highlighting in this document is thanks to -[RMarkdown](http://rmarkdown.rstudio.com/). -We try to follow best practice in terms of style, roughly following -Google's style guide, an in-depth guide written by -[Johnson (2013)](http://cran.r-project.org/web/packages/rockchalk/vignettes/Rstyle.pdf) -and a [chapter](http://adv-r.had.co.nz/Style.html) from -[*Advanced R*](http://adv-r.had.co.nz/) (Wickham, in press). + + + + + + + # Acknowledgements @@ -1513,12 +1428,10 @@ and encouraged feedback from participants. The final thanks is to all users and developers of open source software for making powerful tools such as R accessible and enjoyable to use. -If you have found this tutorial useful in your work, please cite it: +If you have found this tutorial useful in your work, please [cite](https://raw.githubusercontent.com/Robinlovelace/Creating-maps-in-R/master/citation.bib) it: Lovelace, R., & Cheshire, J. (2014). Introduction to visualising spatial data in R. National Centre for Research Methods Working Papers, 14(03). Retrieved from https://github.com/Robinlovelace/Creating-maps-in-R -The bibtex entry for this item can be downloaded from https://raw.githubusercontent.com/Robinlovelace/Creating-maps-in-R/master/citation.bib or [here](https://raw.githubusercontent.com/Robinlovelace/Creating-maps-in-R/master/citation.bib). - # References Bivand, R. S., Pebesma, E. J., & Rubio, V. G. (2013). Applied spatial data analysis with R. Springer. 2nd ed. @@ -1528,29 +1441,12 @@ https://www.researchgate.net/publication/274697165_Spatial_data_visualisation_wi Dorman, M. (2014). Learning R for Geospatial Analysis. Packt Publishing Ltd. -Everitt, B. S., & Hothorn, T. (2015). HSAUR: A Handbook of Statistical Analyses Using R. Retrieved from http://cran.r-project.org/package=HSAUR - Gillespie, Colin, and Robin Lovelace. 2016. Efficient R Programming: A Practical Guide to Smarter Programming. O’Reilly Media. https://csgillespie.github.io/efficientR/. - -Harris, R. (2012). A Short Introduction to R. -[social-statistics.org](http://www.social-statistics.org/). - -Johnson, P. E. (2013). R Style. An Rchaeological Commentary. The Comprehensive R Archive Network. - Kabacoff, R. (2011). R in Action. Manning Publications Co. Lamigueiro, O. P. (2012). solaR: Solar Radiation and Photovoltaic Systems with R. Journal of Statistical Software, 50(9), 1–32. Retrieved from http://www.jstatsoft.org/v50/i09 -Ramsey, P., & Dubovsky, D. (2013). Geospatial Software's Open Future. -GeoInformatics, 16(4). - -Torfs and Brauer (2012). A (very) short Introduction to R. The Comprehensive R Archive Network. - -Wickham, H. (2009). ggplot2: elegant graphics for data analysis. Springer. - -Wickham, H. (in press). [Advanced R](http://adv-r.had.co.nz/). CRC Press. - Wickham, H. (2014). Tidy data. The Journal of Statistical Software, 14(5), Retrieved from http://www.jstatsoft.org/v59/i10 Wilkinson, L. (2005). The grammar of graphics. Springer. diff --git a/vignettes/references.bib b/vignettes/references.bib index 0f975b6..06d542b 100644 --- a/vignettes/references.bib +++ b/vignettes/references.bib @@ -491,4 +491,14 @@ @book{kabacoff_r_2011 publisher = {Manning Publications Co.}, author = {Kabacoff, Robert}, year = {2011} +} + + +@book{gillespie_efficient_2016, + title = {Efficient {R} {Programming}: {A} {Practical} {Guide} to {Smarter} {Programming}}, + isbn = {978-1-4919-5078-4}, + url = {https://csgillespie.github.io/efficientR/}, + publisher = {O'Reilly Media}, + author = {Gillespie, Colin and Lovelace, Robin}, + year = {2016} } \ No newline at end of file