diff --git a/episodes/01-intro-to-r.Rmd b/episodes/01-intro-to-r.Rmd index 9593a135..cccdbb1d 100644 --- a/episodes/01-intro-to-r.Rmd +++ b/episodes/01-intro-to-r.Rmd @@ -148,8 +148,8 @@ Each of the modes o interactions has its advantages and drawbacks. | | Console | R script| |--------|---------|---------| -|**Pros**|Immediate results|Work lost once you close RStudio | -|**Cons**|Complete record of your work |Messy if you just want to print things out| +|**Pros**|Immediate results| Complete record of your work | +|**Cons**| Work lost once you close RStudio | Messy if you just want to print things out| @@ -312,7 +312,7 @@ In the script, we will write: ```{r download-files} # Download the data download.file('https://bit.ly/geospatial_data', - here('episodes', 'data','gapminder_data.csv')) + here('data','gapminder_data.csv')) ``` diff --git a/episodes/02-data-structures.Rmd b/episodes/02-data-structures.Rmd index bee71477..6071354e 100644 --- a/episodes/02-data-structures.Rmd +++ b/episodes/02-data-structures.Rmd @@ -65,13 +65,16 @@ You can create a vector with a `c()` function. ```{r vectors} -numeric_vector <- c(2, 6, 3) # vector of numbers - numeric data type. +# vector of numbers - numeric data type. +numeric_vector <- c(2, 6, 3) numeric_vector -character_vector <- c('banana', 'apple', 'orange') # vector of words - or strings of characters- character data type +# vector of words - or strings of characters- character data type +character_vector <- c('banana', 'apple', 'orange') character_vector -logical_vector <- c(TRUE, FALSE, TRUE) # vector of logical values (is something true or false?)- logical data type. +# vector of logical values (is something true or false?)- logical data type. +logical_vector <- c(TRUE, FALSE, TRUE) logical_vector ``` @@ -121,7 +124,9 @@ First, let's try to calculate mean for the values in this vector ```{r remove-na1} mean(with_na) # mean() function cannot interpret the missing values -mean(with_na, na.rm = T) # You can add the argument na.rm=TRUE to calculate the result while ignoring the missing values. +# You can add the argument na.rm=TRUE to calculate the result while +# ignoring the missing values. +mean(with_na, na.rm = T) ``` However, sometimes, you would like to have the `NA` @@ -130,9 +135,11 @@ For this you need to identify which elements of the vector hold missing values with `is.na()` function. ```{r remove-na2} -is.na(with_na) # This will produce a vector of logical values, stating if a statement 'This element of the vector is a missing value' is true or not +is.na(with_na) # This will produce a vector of logical values, +# stating if a statement 'This element of the vector is a missing value' +# is true or not -!is.na(with_na) # # The ! operator means negation ,i.e. not is.na(with_na) +!is.na(with_na) # The ! operator means negation, i.e. not is.na(with_na) ``` @@ -142,7 +149,8 @@ Sub-setting in `R` is done with square brackets`[ ]`. ```{r remove-na3} -without_na <- with_na[ !is.na(with_na) ] # this notation will return only the elements that have TRUE on their respective positions +without_na <- with_na[ !is.na(with_na) ] # this notation will return only +# the elements that have TRUE on their respective positions without_na @@ -170,7 +178,8 @@ known as levels. nordic_str <- c('Norway', 'Sweden', 'Norway', 'Denmark', 'Sweden') nordic_str # regular character vectors printed out -nordic_cat <- factor(nordic_str) # factor() function converts a vector to factor data type +# factor() function converts a vector to factor data type +nordic_cat <- factor(nordic_str) nordic_cat # With factors, R prints out additional information - 'Levels' ``` @@ -201,8 +210,14 @@ displayed in a plot or which category is taken as a baseline in a statistical mo You can reorder the categories using `factor()` function. This can be useful, for instance, to select a reference category (first level) in a regression model or for ordering legend items in a plot, rather than using the default category systematically (i.e. based on alphabetical order). ```{r factor-reorder1} -nordic_cat <- factor(nordic_cat, levels = c('Norway' , 'Denmark', 'Sweden')) # now Norway should be the first category, Denmark second and Sweden third - +nordic_cat <- factor( + nordic_cat, levels = c( + 'Norway', + 'Denmark', + 'Sweden' + )) + +# now Norway will be the first category, Denmark second and Sweden third nordic_cat ``` @@ -212,7 +227,15 @@ There is more than one way to reorder factors. Later in the lesson, we will use `fct_relevel()` function from `forcats` package to do the reordering. ```{r factor-reorder2} -# nordic_cat <- fct_relevel(nordic_cat, 'Norway' , 'Denmark', 'Sweden') # now Norway should be the first category, Denmark second and Sweden third +library(forcats) + +nordic_cat <- fct_relevel( + nordic_cat, + 'Norway' , + 'Denmark', + 'Sweden' + ) # With this, Norway will be first category, + # Denmark second and Sweden third nordic_cat ``` @@ -239,8 +262,14 @@ outside of this set, it will become an unknown/missing value detonated by ```{r factor-missing-level} nordic_str -nordic_cat2 <- factor(nordic_str, levels = c('Norway', 'Denmark')) -nordic_cat2 # since we have not included Sweden in the list of factor levels, it has become NA. +nordic_cat2 <- factor( + nordic_str, + levels = c('Norway', 'Denmark') + ) + +# because we did not include Sweden in the list of +# factor levels, it has become NA. +nordic_cat2 ``` :::::::::::::::::::::::::::::::::::::::::::::::::::: diff --git a/episodes/03-explore-data.Rmd b/episodes/03-explore-data.Rmd index 5fab2d56..489b0826 100644 --- a/episodes/03-explore-data.Rmd +++ b/episodes/03-explore-data.Rmd @@ -59,7 +59,7 @@ Because columns are vectors, each column must contain a **single type of data** For example, here is a figure depicting a data frame comprising a numeric, a character, and a logical vector. ![](fig/data-frame.svg) -
*Source*:[Data Carpentry R for Social Scientists ](https://datacarpentry.org/r-socialsci/02-starting-with-data/index.html#what-are-data-frames-and-tibbles) +
*Source*: [Data Carpentry R for Social Scientists ](https://datacarpentry.org/r-socialsci/02-starting-with-data/index.html#what-are-data-frames-and-tibbles) ## Reading data @@ -68,7 +68,7 @@ For example, here is a figure depicting a data frame comprising a numeric, a cha We're gonna read in the `gapminder` data set with information about countries' size, GDP and average life expectancy in different years. ```{r reading-data} -gapminder <- read_csv("data/gapminder_data.csv") +gapminder <- read.csv("data/gapminder_data.csv") ``` @@ -92,9 +92,11 @@ There are multiple ways to explore a data set. Here are just a few examples: ```{r} -head(gapminder) # see first 6 rows of the data set -summary(gapminder) # gives basic statistical information about each column. Information format differes by data type. +head(gapminder) # shows first 6 rows of the data set + +summary(gapminder) # basic statistical information about each column. +# Information format differes by data type. nrow(gapminder) # returns number of rows in a dataset @@ -108,7 +110,9 @@ When you're analyzing a data set, you often need to access its specific columns. One handy way to access a column is using it's name and a dollar sign `$`: ```{r subset-dollar-sign} -country_vec <- gapminder$country # Notation means: From dataset gapminder, give me column country. You can see that the column accessed in this way is just a vector of characters. +# This notation means: From dataset gapminder, give me column country. You can +# see that the column accessed in this way is just a vector of characters. +country_vec <- gapminder$country head(country_vec) @@ -157,8 +161,9 @@ We already know how to select only the needed columns. But now, we also want to In the `gapminder` data set, we want to see the results from outside of Europe for the 21st century. ```{r} year_country_gdp_euro <- gapminder %>% - filter(continent != "Europe" & year >= 2000) %>% # & operator (AND) - both conditions must be met + filter(continent != "Europe" & year >= 2000) %>% select(year, country, gdpPercap) +# '&' operator (AND) - both conditions must be met head(year_country_gdp_euro) ``` @@ -177,8 +182,9 @@ Write a single command (which can span multiple lines and includes pipes) that w ```{r ex5, class.source="bg-info"} year_country_gdp_eurasia <- gapminder %>% - filter(continent == "Europe" | continent == "Asia") %>% # | operator (OR) - one of the conditions must be met - select(year, country, gdpPercap) + filter(continent == "Europe" | continent == "Asia") %>% + select(year, country, gdpPercap) +# '|' operator (OR) - one of the conditions must be met nrow(year_country_gdp_eurasia) ``` @@ -191,7 +197,7 @@ So far, we have provided summary statistics on the whole dataset, selected colum ```{r dplyr-group} gapminder %>% # select the dataset group_by(continent) %>% # group by continent - summarize(avg_gdpPercap = mean(gdpPercap)) # summarize function creates statistics for the data set + summarize(avg_gdpPercap = mean(gdpPercap)) # create basic stats ``` @@ -211,7 +217,8 @@ Calculate the average life expectancy per country. Which country has the longest gapminder %>% group_by(country) %>% summarize(avg_lifeExp=mean(lifeExp)) %>% - filter(avg_lifeExp == min(avg_lifeExp) | avg_lifeExp == max(avg_lifeExp)) + filter(avg_lifeExp == min(avg_lifeExp) | + avg_lifeExp == max(avg_lifeExp) ) ``` ### Multiple groups and summary variables diff --git a/episodes/04-intro-to-visualisation.Rmd b/episodes/04-intro-to-visualisation.Rmd index 60f9b941..188b74ac 100644 --- a/episodes/04-intro-to-visualisation.Rmd +++ b/episodes/04-intro-to-visualisation.Rmd @@ -48,24 +48,30 @@ After completing this episode, participants should be able to… # [Introduction to Visualisation](https://datacarpentry.org/r-intro-geospatial/07-plot-ggplot2/index.html) -The package `ggplot2` is a powerful plotting system. We will start with an introduction of key -features of `ggplot2`. In the following parts of this workshop, you will -use this package to visualize geospatial data. `gg` stands for grammar -of graphics, the idea that three components are needed to create a graph: +The package `ggplot2` is a powerful plotting system. We will start with an introduction of key features of `ggplot2`. `gg` stands for grammar of graphics. The idea idea behind it is that the following three components are needed to create a graph: - data, - aesthetics - a coordinate system on which we map the data (what is represented on x axis, what on y axis), and - geometries - visual representation of the data (points, bars, etc.) -Fun part about `ggplot2` is that you can add layers to -the plot to provide more information and to make it more beautiful. +A fun part about `ggplot2` is that you can add layers to the plot to provide more information and to make it more beautiful. -First, lets plot the distribution of life expectancy in the `gapminder` dataset: +In the following parts of this workshop, you will use this package to visualize geospatial data. First, make sure that you have the following packages loaded. + +```{r load-pkgs, eval=FALSE} +library(tidyverse) +library(terra) +``` + +Now, lets plot the distribution of life expectancy in the `gapminder` dataset: ```{r ggplot} - ggplot(data = gapminder, aes(x = lifeExp) ) + # aesthetics layer - geom_histogram() # geometry layer + +ggplot(data = gapminder, # data + aes(x = lifeExp) # aesthetics layer + ) + +geom_histogram() # geometry layer ``` @@ -78,10 +84,9 @@ Let's create another plot, this time only on a subset of observations: ```{r ggplot-col} gapminder %>% # we select a data set - filter(year == 2007 & - continent == 'Americas') %>% # and filter it to keep only one year and one continent + filter(year == 2007 & continent == 'Americas') %>% # filter to keep one year and one continent ggplot(aes(x = country, y = gdpPercap)) + # the x and y axes represent values of columns - geom_col() # we select a column graph as a geometry + geom_col() # we select a column graph as a geometry ``` Now, you can iteratively improve how the plot looks like. For example, @@ -92,7 +97,7 @@ gapminder %>% filter(year == 2007, continent == 'Americas') %>% ggplot(aes(x = country, y = gdpPercap)) + - geom_col()+ + geom_col() + coord_flip() # flip axes ``` @@ -123,11 +128,14 @@ gapminder %>% filter(year == 2007, continent == 'Americas') %>% mutate(country = fct_reorder(country, gdpPercap )) %>% - ggplot(aes(x = country, y = gdpPercap, fill = lifeExp )) + # fill argument for colouring surfaces, colour for points and lines - geom_col()+ + ggplot(aes( + x = country, + y = gdpPercap, + fill = lifeExp # use 'fill' for surfaces; 'colour' for points and lines + )) + + geom_col() + coord_flip() - ``` We can also adapt the colour scale. Common choice that is used for its @@ -138,11 +146,11 @@ readability and colorblind-proofness are the palettes available in the gapminder %>% filter(year == 2007, continent == 'Americas') %>% - mutate(country = fct_reorder(country, gdpPercap )) %>% - ggplot(aes(x = country, y = gdpPercap, fill = lifeExp )) + - geom_col()+ - coord_flip()+ - scale_fill_viridis_c() # _c stands for continuous scale + mutate(country = fct_reorder(country, gdpPercap)) %>% + ggplot(aes(x = country, y = gdpPercap, fill = lifeExp)) + + geom_col() + + coord_flip() + + scale_fill_viridis_c() # _c stands for continuous scale ``` @@ -154,16 +162,23 @@ p <- # this time let's save the plot in an object gapminder %>% filter(year == 2007 & continent == 'Americas') %>% - mutate(country = fct_reorder(country, gdpPercap ), - lifeExpCat = if_else(lifeExp >= mean(lifeExp), 'high', 'low')) %>% + mutate(country = fct_reorder(country, gdpPercap), + lifeExpCat = if_else( + lifeExp >= mean(lifeExp), + 'high', + 'low')) %>% ggplot(aes(x = country, y = gdpPercap, fill = lifeExpCat)) + - geom_col()+ - coord_flip()+ - scale_fill_manual(values = c('light blue', 'orange')) # customize the colours of the fill aesthetic + geom_col() + + coord_flip() + + scale_fill_manual(values = c( + 'light blue', + 'orange' + ) # customize the colors + ) ``` -Since we saved a plot as an object, nothing has been printed out. Just +Since we saved a plot as an object `p`, nothing has been printed out. Just like with any other object in `R`, if you want to see it, you need to call it. @@ -177,12 +192,12 @@ Now we can make use of the saved object and add things to it. Let's also give it a title and name the axes: ```{r ggplot-titles} -p <- - p + +p <- p + ggtitle('GDP per capita in Americas', subtitle = 'Year 2007') + xlab('Country')+ ylab('GDP per capita') +# show plot p ``` @@ -193,9 +208,12 @@ p Once we are happy with our plot we can save it in a format of our choice. Remember to save it in the dedicated folder. -```{r save-plot} +```{r save-plot, eval=FALSE} ggsave(plot = p, - filename = here('fig_output','plot_americas_2007.pdf')) # By default, ggsave() saves the last displayed plot, but you can also explicitly name the plot you want to save + filename = here('fig_output','plot_americas_2007.pdf') + ) +# By default, ggsave() saves the last displayed plot, but +# you can also explicitly name the plot you want to save ``` @@ -220,13 +238,17 @@ Another output of your work you want to save is a cleaned data set. In your analysis, you can then load directly that data set. Let's say we want to save the data only for Americas: -```{r writing-data} +```{r writing-data, eval=FALSE} gapminder_amr_2007 <- gapminder %>% filter(year == 2007 & continent == 'Americas') %>% - mutate(country_reordered = fct_reorder(country, gdpPercap ), - lifeExpCat = if_else(lifeExp >= mean(lifeExp), 'high', 'low')) - -write.csv(gapminder_amr_2007, here('data_output', 'gapminder_americas_2007.csv'), row.names=FALSE) + mutate(country_reordered = fct_reorder(country, gdpPercap), + lifeExpCat = if_else(lifeExp >= mean(lifeExp), 'high', 'low') + ) + +write.csv(gapminder_amr_2007, + here('data_output', 'gapminder_americas_2007.csv'), + row.names=FALSE + ) ``` ::::::::::::::::::::::::::::::::::::: keypoints diff --git a/episodes/09-open-and-plot-vector-layers.Rmd b/episodes/09-open-and-plot-vector-layers.Rmd index 3b8bcc40..22e97d18 100644 --- a/episodes/09-open-and-plot-vector-layers.Rmd +++ b/episodes/09-open-and-plot-vector-layers.Rmd @@ -141,7 +141,7 @@ Now, let's plot this shapefile. You are already familiar with the `ggplot2` pack ggplot(data = boundary_Delft) + geom_sf(size = 3, color = "black", fill = "cyan1") + labs(title = "Delft Administrative Boundary") + - coord_sf(datum = st_crs(28992)) # this is needed to display the axes in meters + coord_sf(datum = st_crs(28992)) # displays the axes in meters ``` ::::::::::::::::::::::::::::::::::::: challenge diff --git a/episodes/10-explore-and-plot-by-vector-layer-attributes.Rmd b/episodes/10-explore-and-plot-by-vector-layer-attributes.Rmd index ca18aa96..bf947df7 100644 --- a/episodes/10-explore-and-plot-by-vector-layer-attributes.Rmd +++ b/episodes/10-explore-and-plot-by-vector-layer-attributes.Rmd @@ -128,8 +128,8 @@ head(point_Delft) We can increase the number of rows with the n argument (e.g., `head(n = 10)` to show 10 rows) until we see at least three distinct values in the leisure column. Note that printing an `sf` object will also display the first 10 rows. ```{r} -head(point_Delft, 10) # you might be lucky to see three distinct values -# point_Delft +head(point_Delft, 10) +# you might be lucky to see three distinct values ``` We have our answer (`sports_centre` is the third value), but in general this is not a good approach as the first rows might still have many `NA`s and three distinct values might still not be present in the first `n` rows of the data frame. To remove `NA`s, we can use the function `na.omit()` on the leisure column to remove `NA`s completely. Note that we use the `$` operator to examine the content of a single variable. @@ -141,7 +141,8 @@ head(na.omit(point_Delft$leisure)) # this is better To show only unique values, we can use the `levels()` function on a factor to only see the first occurrence of each distinct value. Note `NA`s are dropped in this case and that we get the first three of the unique alphabetically ordered values. ```{r} -head(levels(factor(point_Delft$leisure)), n = 3) # this is even better +head(levels(factor(point_Delft$leisure)), n = 3) +# this is even better ``` 3. To see a list of all attribute names, we can use the `names()` function. @@ -186,7 +187,9 @@ Now we can plot only the cycleways. ```{r fig.cap="Map of cycleways in Delft."} ggplot(data = cycleway_Delft) + geom_sf() + - labs(title = "Slow mobility network in Delft", subtitle = "Cycleways") + + labs(title = "Slow mobility network in Delft", + subtitle = "Cycleways" + ) + coord_sf(datum = st_crs(28992)) ``` @@ -237,7 +240,9 @@ nrow(motorway_Delft) ```{r} ggplot(data = motorway_Delft) + geom_sf(linewidth = 1.5) + - labs(title = "Fast mobility network", subtitle = "Motorways") + + labs(title = "Fast mobility network", + subtitle = "Motorways" + ) + coord_sf(datum = st_crs(28992)) ``` @@ -258,7 +263,9 @@ nrow(pedestrian_Delft) ```{r} ggplot() + geom_sf(data = pedestrian_Delft) + - labs(title = "Slow mobility network", subtitle = "Pedestrian") + + labs(title = "Slow mobility network", + subtitle = "Pedestrian" + ) + coord_sf(datum = st_crs(28992)) ``` @@ -350,7 +357,8 @@ ggplot(data = lines_Delft_selection) + geom_sf(aes(linewidth = highway)) + scale_linewidth_manual(values = line_width) + labs(title = "Mobility network of Delft", - subtitle = "Roads & Cycleways - Line width varies") + + subtitle = "Roads & Cycleways - Line width varies" + ) + coord_sf(datum = st_crs(28992)) ``` @@ -371,13 +379,17 @@ p1 <- ggplot(data = lines_Delft_selection) + labs(title = "Mobility network of Delft", subtitle = "Roads & Cycleways - Default Legend") + coord_sf(datum = st_crs(28992)) + +# show plot p1 ``` ```{r fig.cap="Map of the mobility network in Delft with large-font and border around the legend."} p2 <- p1 + theme(legend.text = element_text(size = 20), - legend.box.background = element_rect(size = 1)) + legend.box.background = element_rect(linewidth = 1)) + +# show plot p2 ``` @@ -399,16 +411,22 @@ levels(factor(lines_Delft$highway)) ``` ```{r} -# First, create a data frame with only those roads where bicycles are allowed +# First, create a data frame with only roads where bicycles +# are allowed lines_Delft_bicycle <- lines_Delft %>% filter(highway == "cycleway") -# Next, visualise using ggplot +# Next, visualise it using ggplot ggplot(data = lines_Delft) + geom_sf() + - geom_sf(data = lines_Delft_bicycle, aes(color = highway), linewidth = 1) + + geom_sf(data = lines_Delft_bicycle, + aes(color = highway), + linewidth = 1 + ) + scale_color_manual(values = "magenta") + - labs(title = "Mobility network in Delft", subtitle = "Roads dedicated to Bikes") + + labs(title = "Mobility network in Delft", + subtitle = "Roads dedicated to Bikes" + ) + coord_sf(datum = st_crs(28992)) ``` diff --git a/episodes/11-plot-multiple-shape-files.Rmd b/episodes/11-plot-multiple-shape-files.Rmd index 06496fa0..7acb16bf 100644 --- a/episodes/11-plot-multiple-shape-files.Rmd +++ b/episodes/11-plot-multiple-shape-files.Rmd @@ -57,8 +57,14 @@ To begin, we will create a plot with the site boundary as the first layer. Then ```{r} ggplot() + - geom_sf(data = boundary_Delft, fill = "lightgrey", color = "lightgrey") + - geom_sf(data = lines_Delft_selection, aes(color = highway), size = 1) + + geom_sf(data = boundary_Delft, + fill = "lightgrey", + color = "lightgrey" + ) + + geom_sf(data = lines_Delft_selection, + aes(color = highway), + size = 1 + ) + geom_sf(data = point_Delft) + labs(title = "Mobility network of Delft") + coord_sf(datum = st_crs(28992)) @@ -69,23 +75,49 @@ Next, let’s build a custom legend using the functions `scale_color_manual()` a ```{r} leisure_colors <- rainbow(15) point_Delft$leisure <- factor(point_Delft$leisure) + ggplot() + - geom_sf(data = boundary_Delft, fill = "lightgrey", color = "lightgrey") + - geom_sf(data = lines_Delft_selection, aes(color = highway), size = 1) + - geom_sf(data = point_Delft, aes(fill = leisure), shape = 21) + - scale_color_manual(values = road_colors, name = "Road Type") + - scale_fill_manual(values = leisure_colors, name = "Lesiure Location") + + geom_sf(data = boundary_Delft, + fill = "lightgrey", + color = "lightgrey" + ) + + geom_sf(data = lines_Delft_selection, + aes(color = highway), + size = 1 + ) + + geom_sf(data = point_Delft, + aes(fill = leisure), + shape = 21) + + scale_color_manual(values = road_colors, + name = "Road Type" + ) + + scale_fill_manual(values = leisure_colors, + name = "Lesiure Location" + ) + labs(title = "Mobility network and leisure in Delft") + coord_sf(datum = st_crs(28992)) ``` ```{r} ggplot() + - geom_sf(data = boundary_Delft, fill = "lightgrey", color = "lightgrey") + - geom_sf(data = lines_Delft_selection, aes(color = highway), size = 1) + - geom_sf(data = point_Delft, aes(fill = leisure), shape = 22) + - scale_color_manual(values = road_colors, name = "Line Type") + - scale_fill_manual(values = leisure_colors, name = "Leisure Location") + + geom_sf(data = boundary_Delft, + fill = "lightgrey", + color = "lightgrey" + ) + + geom_sf(data = lines_Delft_selection, + aes(color = highway), + size = 1 + ) + + geom_sf(data = point_Delft, + aes(fill = leisure), + shape = 22 + ) + + scale_color_manual(values = road_colors, + name = "Line Type" + ) + + scale_fill_manual(values = leisure_colors, + name = "Leisure Location" + ) + labs(title = "Mobility network and leisure in Delft") + coord_sf(datum = st_crs(28992)) ``` @@ -118,26 +150,56 @@ blue_orange <- c("cornflowerblue", "darkorange") ```{r} ggplot() + - geom_sf(data = lines_Delft_selection, aes(color = highway)) + - geom_sf(data = leisure_locations_selection, aes(fill = leisure), - shape = 21) + - scale_color_manual(name = "Line Type", values = road_colors, - guide = guide_legend(override.aes = list(linetype = "solid", shape = NA))) + - scale_fill_manual(name = "Soil Type", values = blue_orange, - guide = guide_legend(override.aes = list(linetype = "blank", shape = 21, colour = NA))) + + geom_sf(data = lines_Delft_selection, + aes(color = highway) + ) + + geom_sf(data = leisure_locations_selection, + aes(fill = leisure), + shape = 21 + ) + + scale_color_manual(name = "Line Type", + values = road_colors, + guide = guide_legend(override.aes = list( + linetype = "solid", + shape = NA + )) + ) + + scale_fill_manual(name = "Soil Type", + values = blue_orange, + guide = guide_legend(override.aes = list( + linetype = "blank", + shape = 21, + colour = NA + )) + ) + labs(title = "Traffic and leisure") + coord_sf(datum = st_crs(28992)) ``` ```{r} ggplot() + - geom_sf(data = lines_Delft_selection, aes(color = highway), size = 1) + - geom_sf(data = leisure_locations_selection, aes(fill = leisure, shape = leisure), size = 2) + - scale_shape_manual(name = "Leisure Type", values = c(21, 22)) + - scale_color_manual(name = "Line Type", values = road_colors) + - scale_fill_manual(name = "Leisure Type", values = rainbow(15), - guide = guide_legend(override.aes = list(linetype = "blank", shape = c(21, 22), - color = "black"))) + + geom_sf(data = lines_Delft_selection, + aes(color = highway), + size = 1 + ) + + geom_sf(data = leisure_locations_selection, + aes(fill = leisure, shape = leisure), + size = 2 + ) + + scale_shape_manual(name = "Leisure Type", + values = c(21, 22) + ) + + scale_color_manual(name = "Line Type", + values = road_colors + ) + + scale_fill_manual(name = "Leisure Type", + values = rainbow(15), + guide = guide_legend(override.aes = list( + linetype = "blank", + shape = c(21, 22), + color = "black" + )) + ) + labs(title = "Road network and leisure") + coord_sf(datum = st_crs(28992)) ``` diff --git a/episodes/12-handling-spatial-projection-and-crs.Rmd b/episodes/12-handling-spatial-projection-and-crs.Rmd index 24811951..ff0d77b0 100644 --- a/episodes/12-handling-spatial-projection-and-crs.Rmd +++ b/episodes/12-handling-spatial-projection-and-crs.Rmd @@ -50,8 +50,13 @@ country_boundary_NL <- st_read("data/nl-boundary.shp") ```{r} ggplot() + - geom_sf(data = country_boundary_NL, color = "gray18", linewidth = 2) + - geom_sf(data = municipal_boundary_NL, color = "gray40") + + geom_sf(data = country_boundary_NL, + color = "gray18", + linewidth = 2 + ) + + geom_sf(data = municipal_boundary_NL, + color = "gray40" + ) + labs(title = "Map of Contiguous NL Municipal Boundaries") + coord_sf(datum = st_crs(28992)) ``` @@ -76,9 +81,17 @@ boundary_Delft <- st_transform(boundary_Delft, 28992) ```{r} ggplot() + - geom_sf(data = country_boundary_NL, linewidth = 2, color = "gray18") + - geom_sf(data = municipal_boundary_NL, color = "gray40") + - geom_sf(data = boundary_Delft, color = "purple", fill = "purple") + + geom_sf(data = country_boundary_NL, + linewidth = 2, + color = "gray18" + ) + + geom_sf(data = municipal_boundary_NL, + color = "gray40" + ) + + geom_sf(data = boundary_Delft, + color = "purple", + fill = "purple" + ) + labs(title = "Map of Contiguous NL Municipal Boundaries") + coord_sf(datum = st_crs(28992)) ``` @@ -105,10 +118,23 @@ boundary_ZH <- municipal_boundary_NL %>% ```{r} ggplot() + - geom_sf(data = boundary_ZH, aes(color ="color"), show.legend = "line") + - scale_color_manual(name = "", labels = "Municipal Boundaries in South Holland", values = c("color" = "gray18")) + - geom_sf(data = boundary_Delft, aes(shape = "shape"), color = "purple", fill = "purple") + - scale_shape_manual(name = "", labels = "Municipality of Delft", values = c("shape" = 19)) + + geom_sf(data = boundary_ZH, + aes(color ="color"), + show.legend = "line" + ) + + scale_color_manual(name = "", + labels = "Municipal Boundaries in South Holland", + values = c("color" = "gray18") + ) + + geom_sf(data = boundary_Delft, + aes(shape = "shape"), + color = "purple", + fill = "purple" + ) + + scale_shape_manual(name = "", + labels = "Municipality of Delft", + values = c("shape" = 19) + ) + labs(title = "Delft location") + theme(legend.background = element_rect(color = NA)) + coord_sf(datum = st_crs(28992)) @@ -126,7 +152,9 @@ To save a file, use the `st_write()` function from the `sf` package. Although `s ```{r, eval=FALSE} st_write(leisure_locations_selection, - "data/leisure_locations_selection.shp", driver = "ESRI Shapefile") + "data/leisure_locations_selection.shp", + driver = "ESRI Shapefile" + ) ```