::p_load(sf, tmap, tidyverse) pacman
In Class Exercise 3: Analytical Mapping
1 Installing and loading packages
<- read_rds("data/rds/NGA_wp.rds") NGA_wp
2 Basic Choropleth Mapping
2.1 Visualising distribution of non-functional Water Point
<- tm_shape(NGA_wp) +
p1 tm_fill("wp_functional",
n= 10,
style = "equal",
palette ="Blues") +
tm_borders(lwd = 0.1,
alpha = 1) +
tm_layout(main.title = "Distribution of functional water",
legend.outside = FALSE)
# n = 10 indicates 10 range of colors
# style = equal indicates the distribution of data, in this case, equal refers to equal difference per range as per seen in the plot
<- tm_shape(NGA_wp) +
p2 tm_fill("total_wp",
n= 10,
style = "equal",
palette ="Blues") +
tm_borders(lwd = 0.1,
alpha = 1) +
tm_layout(main.title = "Distribution of total water point",
legend.outside = FALSE)
Arrange both maps into 1 visualisation
tmap_arrange(p2, p1, nrow = 1)
3 Choropleth Map for Rates
3.1 Deriving Proportion of Functional Water Points and Non-Functional WaterPoints
<- NGA_wp %>%
NGA_wp mutate(pct_functional = wp_functional/total_wp) %>%
mutate(pct_non_functional = wp_nonfunctional/total_wp)
<- tm_shape(NGA_wp) +
p3 tm_fill("pct_functional",
n = 10,
style = "equal",
palette = "Blues") +
tm_borders(lwd= 0.1,
alpha = 1) +
tm_layout(main.title = "Distribution of Proportion of\nFunctional WaterPoints",
legend.outside = FALSE)
<- tm_shape(NGA_wp) +
p4 tm_fill("pct_non_functional",
n = 10,
style = "equal",
palette = "Blues") +
tm_borders(lwd= 0.1,
alpha = 1) +
tm_layout(main.title = "Distribution of Proportion of\nNon_Functional WaterPoints",
legend.outside = FALSE)
tmap_arrange(p4, p3, nrow = 1)
4 Extreme Value maps
4.1 Percentile Map
Step 1: Exclude records with NA
<- NGA_wp %>%
NGA_wp drop_na()
Step 2: Creating customised classification
<- c(0,.01,.1,.5,.9,.99,1)
percent <- NGA_wp["pct_functional"] %>%
var st_set_geometry(NULL)
quantile(var[,1], percent)
0% 1% 10% 50% 90% 99% 100%
0.00000000 0.01818182 0.18181818 0.41666667 0.76086957 1.00000000 1.00000000
# NULL forces NGA_wp["pct_functional"] into var (dataframe)
<- function(vname, df) {
get.var <- df[vname] %>%
v st_set_geometry(NULL)
<- unname(v[,1])
v return(v)
}
<- function(vnam, df, legtitle=NA, mtitle = "Percentile Map"){
percentmap <- c(0,.01,.1,.5,.9,.99,1)
percent <- get.var(vnam, df)
var <- quantile(var, percent)
bperc tm_shape(df) +
tm_polygons() +
tm_shape(df) +
tm_fill(vnam,
title = legtitle,
breaks=bperc,
palette="Blues",
labels = c("< 1%","1% - 10%", "10% - 50%", "50% - 90%", "90% - 99%", ">99%")) +
tm_borders() +
tm_layout(main.title = mtitle,
title.position = c("right", "bottom"))
}
percentmap("pct_functional", NGA_wp,)
4.2 Box map
4.2.1 Using ggplot
ggplot(data = NGA_wp,
aes(x = "",
y = wp_nonfunctional)) +
geom_boxplot()
4.2.2 Creating boxbreaks
<- function(v,mult=1.5) {
boxbreaks <- unname(quantile(v))
qv <- qv[4] - qv[2]
iqr <- qv[4] + mult * iqr
upfence <- qv[2] - mult * iqr
lofence # initialize break points vector
<- vector(mode="numeric",length=7)
bb # logic for lower and upper fences
if (lofence < qv[1]) { # no lower outliers
1] <- lofence
bb[2] <- floor(qv[1])
bb[else {
} 2] <- lofence
bb[1] <- qv[1]
bb[
}if (upfence > qv[5]) { # no upper outliers
7] <- upfence
bb[6] <- ceiling(qv[5])
bb[else {
} 6] <- upfence
bb[7] <- qv[5]
bb[
}3:5] <- qv[2:4]
bb[return(bb)
}
4.2.3 Creating get.var function
To retrieve a variable as a vector from an sf dataframe
<- function(vname, df) {
get.var <- df[vname] %>%
v st_set_geometry(NULL)
<- unname(v[,1])
v return(v)
}
4.2.4 Test newly created function
<- get.var("wp_nonfunctional", NGA_wp)
var boxbreaks(var)
[1] -53.5 0.0 14.0 34.0 59.0 126.5 252.0
4.2.5 Boxmap function
<- function(vnam, df,
boxmap legtitle=NA,
mtitle="Box Map",
mult=1.5){
<- get.var(vnam,df)
var <- boxbreaks(var)
bb tm_shape(df) +
tm_polygons() +
tm_shape(df) +
tm_fill(vnam,title=legtitle,
breaks=bb,
palette="Blues",
labels = c("lower outlier",
"< 25%",
"25% - 50%",
"50% - 75%",
"> 75%",
"upper outlier")) +
tm_borders() +
tm_layout(main.title = mtitle,
title.position = c("left",
"top"))
}
tmap_mode("plot")
boxmap("wp_nonfunctional", NGA_wp)
4.2.6 Recode zero
This is used to recode LGAs with zero total water point into NA
<- NGA_wp %>%
NGA_wp mutate(wp_functional = na_if(
< 0)) total_wp, total_wp