Population of the Czech Republic as per the latest census in 2011, per district (okres).
library(RCzechia)
library(dplyr)
library(readxl)
library(httr)
library(tmap)
library(sf)
GET("https://raw.githubusercontent.com/jlacko/RCzechia/master/data-raw/zvcr034.xls",
write_disk(tf <- tempfile(fileext = ".xls")))
## Response [https://raw.githubusercontent.com/jlacko/RCzechia/master/data-raw/zvcr034.xls]
## Date: 2019-01-03 21:14
## Status: 200
## Content-Type: application/octet-stream
## Size: 44.5 kB
## <ON DISK> /tmp/Rtmp7QWxv8/file322b22dec355.xls
src <- read_excel(tf, range = "Data!B5:C97") # read in with original column names
colnames(src) <- c('NAZ_LAU1', 'obyvatel') # meaningful names instead of the original ones
src <- src %>%
mutate(obyvatel = as.double(obyvatel)) %>%
# convert from text to number
mutate(NAZ_LAU1 = ifelse(NAZ_LAU1 == "Hlavní město Praha", "Praha", NAZ_LAU1))
# rename Prague (from The Capital to a regular city)
okresni_data <- okresy("low") %>% # data shapefile
inner_join(src, by = "NAZ_LAU1")
# key for data connection - note the use of inner (i.e. filtering) join
vystup <- tm_shape(okresni_data) + tm_fill(col = "obyvatel", title = "Population",
palette = "Blues", style = "quantile", n = 5) +
tm_shape(okresni_data) + tm_borders("grey40", lwd = 0.5) + # thin edges of districts
tm_shape(republika("low")) + tm_borders("grey30", lwd = 1.5) + # thick national borders
tm_layout(frame = F) # clean does it
print(vystup)
Drawing a map: three semi-random landmarks on map, with rivers shown for better orientation.
To get the geocoded data frame you may consider using geocode()
function from ggmap
package, which implies consent with Google terms of use.
library(RCzechia)
library(dplyr)
library(tmap)
library(sf)
rivers <- reky()
rivers <- rivers %>%
filter(Major == T)
mista <- data.frame(misto = c('kramarova vila', 'arcibiskupske zahrady v kromerizi', 'becov nad teplou'),
lon = c(14.41030, 17.39353, 12.83833),
lat = c(50.09380, 49.30048, 50.08346))
# to geocode a list of locations consider ggmap::geocode()
POI <- mista %>% # or geocode using ggmap
st_as_sf(coords = c("lon", "lat"), crs = 4326) # convert plain data to spatial CRS = WGS84, used by Google
tm_plot <- tm_shape(republika("low")) + tm_borders("grey30", lwd = 1) +
tm_shape(POI) + tm_symbols(col = "firebrick3", shape = 20, size = 0.5) +
tm_shape(rivers) + tm_lines(col = 'steelblue', lwd = 1.5, alpha = 0.5) +
tm_legend(title = "Very Special Places") + # ... or whatever :)
tm_layout(frame = F)
print(tm_plot)
A visualization problem: unemployment in the Czech Republic is in general low, but not uniformly low.
What are the hotspots?
library(dplyr)
library(RCzechia)
library(tmap)
library(sf)
src <- read.csv(url("https://raw.githubusercontent.com/jlacko/RCzechia/master/data-raw/unempl.csv"), stringsAsFactors = F)
# open data on unemployment from Czech Statistical Office - https://www.czso.cz/csu/czso/otevrena_data
# lightly edited for size (rows filtered)
src <- src %>%
mutate(KOD_OBEC = as.character(uzemi_kod)) # keys in RCzechia are of type character
podklad <- obce_polygony() %>% # obce_polygony = municipalities in RCzechia package
inner_join(src, by = "KOD_OBEC") # linking by key
vystup <- tm_shape(republika()) + tm_borders(col = "grey40") +
tm_shape(podklad) + tm_fill(col = "hodnota", title = "Unemployment", palette = "YlOrRd") +
tm_legend(legend.format = list(fun = function(x) paste0(formatC(x, digits = 0, format = "f"), " %"))) +
tm_layout(frame = F)
print(vystup)
Calculate distance between two spatial objects; the sf
package supports (via gdal) point to point, point to polygon and polygon to polygon distances.
Calculating distance from Prague (#1 Czech city) to Brno (#2 Czech city).
library(dplyr)
library(RCzechia)
library(sf)
library(units)
obce <- obce_polygony()
praha <- obce[obce$NAZ_OBEC == "Praha", ]
brno <- obce[obce$NAZ_OBEC == "Brno", ]
vzdalenost <- st_distance(praha, brno) %>%
set_units("kilometers") # easier to interpret than meters, miles or decimal degrees..
print(vzdalenost)
## Units: [kilometers]
## [,1]
## [1,] 152.8073
Interactive maps are powerful tools for data vizualization. They are easy to produce with the tmap
package.
I found the stamen toner basemap a good company for interactive chloropleths - it gives enough context without distracting from the story of your data.
A map of the whole Czech Republic in original resolution (the accuracy is about 1 meter) would be rather sizeable, and I found it better policy to either:
st_simplify()
to the shapefile. Note that RCzechia uses EPSG:4326 projection, with decimal degrees as unit. To simplify to given tolerance in meters you need to first st_transform()
it to a different projection, e.g. EPSG:5513 (ing. Křovák).library(dplyr)
library(RCzechia)
library(tmap)
library(sf)
src <- read.csv(url("https://raw.githubusercontent.com/jlacko/RCzechia/master/data-raw/unempl.csv"), stringsAsFactors = F)
# open data on unemployment from Czech Statistical Office - https://www.czso.cz/csu/czso/otevrena_data
# lightly edited for size (rows filtered)
src <- src %>%
mutate(KOD_OBEC = as.character(uzemi_kod)) # keys in RCzechia are of type character
podklad <- obce_polygony() %>% # obce_polygony = municipalities in RCzechia package
inner_join(src, by = "KOD_OBEC") %>% # linking by key
filter(KOD_CZNUTS3 == "CZ071") # Olomoucký kraj
tmap_mode("view")
vystup <- tm_shape(podklad) + tm_fill(col = "hodnota", title = "Unemployment", palette = "YlOrRd", id = "NAZ_OBEC") +
tm_legend(legend.format = list(fun = function(x) paste0(formatC(x, digits = 0, format = "f"), " %"))) +
tm_view(basemaps = "Stamen.Toner")
print(vystup)
sf
PolygonsCreating custom polygons by aggregating administrative units is a common use case in sales reporting and analysis. Function union_sf()
makes this task easier by dissolving polygons accoring to a value of a data column.
In this demonstration the Czech LAU1 units are grouped into two categories: those with odd lettered names, and those with even letters. They are then dissolved into two multipolygons.
library(RCzechia)
library(dplyr)
library(sf)
poly <- okresy("low") %>% # Czech LAU1 regions as sf data frame
mutate(oddeven = ifelse(nchar(NAZ_LAU1) %% 2 == 1, "odd", "even" )) %>% # odd or even?
union_sf("oddeven") # ... et facta est lux
plot(poly, key.pos = 1)