GeoJSON Version of CBC Quebec Ridings Hex Cartograms with Example Usage in R
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.
The CBC covered the recent (as of the original post-time on this blog entry) Quebec elections and used a well-crafted hex grid map to display results:
They have a great ‘splainer on why they use this type of map.
Thinking that it may be useful for others, I used a browser Developer Tools inspector to yank out the javascript-created SVG and wrangled out the hexes using svg2geojson
and put them into a GeoJSON file along with some metadata that I extracted from the minified javascript from the CBC’s site and turned into a data frame using the V8
package. Since most of the aforementioned work was mouse clicking and ~8 (disjointed) lines of accompanying super-basic R code, there’s not really much to show wrangling-wise1, but I can show an example of using the new GeoJSON file in R and the sf
package:
library(sf) library(ggplot2) # get the GeoJSON file from: https://gitlab.com/hrbrmstr/quebec-hex-ridings or https://github.com/hrbrmstr/quebec-hex-ridings sf::st_read("quebec-ridings.geojson", quiet = TRUE, stringsAsFactors = FALSE) %>% ggplot() + geom_sf(aes(fill = regionname)) + coord_sf(datum = NA) + ggthemes::scale_fill_tableau(name = NULL, "Tableau 20") + ggthemes::theme_map() + theme(legend.position = "bottom")
And, with a little more ggplot2-tweaking and some magick
, we can even put it in the CBC-styled border:
library(sf) library(magick) library(ggplot2) plt <- image_graph(1488, 1191, bg = "white") sf::st_read("quebec-ridings.geojson", quiet=TRUE, stringsAsFactors=FALSE) %>% ggplot() + geom_sf(aes(fill=regionname)) + coord_sf(datum=NA) + scale_x_continuous(expand=c(0,2)) + scale_y_continuous(expand=c(0,0)) + ggthemes::theme_map() + theme(plot.margin = margin(t=150)) + theme(legend.position = "none") dev.off() # get this bkgrnd img from the repo image_composite(plt, image_read("imgs/background.png")) %>% image_write("imgs/composite-map.png")
You can tweak the border color with magick
as needed and there’s a background2.png
in the imgs
directory in the repo that has the white inset that you can further composite as needed.
With a teensy bit of work you should be able adjust the stroke color via aes()
to separate things as the CBC did.
FIN
It’s important to re-state that the CBC made the original polygons for the hexes (well, they made a set of grid points and open source software turned it into a set of SVG paths) and the background images. All I did was some extra bit of wrangling and conversionating2.
1 I can toss a screencast if there’s sufficient interest.
2 Totally not a word.
R-bloggers.com offers daily e-mail updates about R news and tutorials about learning R and many other topics. Click here if you're looking to post or find an R/data-science job.
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.