Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.
We’re doing some interesting studies (cybersecurity-wise, not finance-wise) on digital currency networks at work-work and — while I’m loathe to create a geo-map from IPv4 geolocation data — we:
- do get (often, woefully inaccurate) latitude & longitude data from our geolocation service (I won’t name-and-shame here); and,
- there are definite geo-aspects to the prevalence of mining nodes — especially Bitcoin; and,
- I have been itching to play with the nascent nord palette
in a cartographical context…
so I went on a small diversion to create a bubble plot of geographical Bitcoin node-prevalence.
I tweeted out said image and someone asked if there was code, hence this post.
You’ll be able to read about the methodology we used to capture the Bitcoin node data that underpins the map below later this year. For now, all I can say is that wasn’t garnered from joining the network-proper.
I’m including the geo-data in the gist
I’m using swatches
nord
package
I’ve blathered a bit about nord, so let’s start with that (and include the various other packages we’ll use later on):
library(swatches) library(ggalt) # devtools::install_github("hrbrmstr/ggalt") library(hrbrthemes) # devtools::install_github("hrbrmstr/hrbrthemes") library(tidyverse) nord <- read_palette("nord.ase") show_palette(nord)
It may not be a perfect palette (accounting for all forms of vision issues and other technical details) but it was designed very well (IMO).
The rest is pretty straightforward:
- read in the bitcoin geo-data
- count up by lat/lng
- figure out which colors to use (that took a bit of trial-and-error)
- tweak the rest of the ggplot2 canvas styling (that took a wee bit longer)
I’m using development versions of two packages due to their added functionality not being on CRAN (yet). If you’d rather not use a dev-version of hrbrthemes
just use a different ipsum
theme vs the new theme_ipsum_tw()
.
read_csv("bitc.csv") %>% count(lng, lat, sort = TRUE) -> bubbles_df world <- map_data("world") world <- world[world$region != "Antarctica", ] ggplot() + geom_cartogram( data = world, map = world, aes(x = long, y = lat, map_id = region), color = nord["nord3"], fill = nord["nord0"], size = 0.125 ) + geom_point( data = bubbles_df, aes(lng, lat, size = n), fill = nord["nord13"], shape = 21, alpha = 2/3, stroke = 0.25, color = "#2b2b2b" ) + coord_proj("+proj=wintri") + scale_size_area(name = "Node count", max_size = 20, labels = scales::comma) + labs( x = NULL, y = NULL, title = "Bitcoin Network Geographic Distribution (all node types)", subtitle = "(Using bubbles seemed appropriate for some, odd reason)", caption = "Source: Rapid7 Project Sonar" ) + theme_ipsum_tw(plot_title_size = 24, subtitle_size = 12) + theme(plot.title = element_text(color = nord["nord14"], hjust = 0.5)) + theme(plot.subtitle = element_text(color = nord["nord14"], hjust = 0.5)) + theme(panel.grid = element_blank()) + theme(plot.background = element_rect(fill = nord["nord3"], color = nord["nord3"])) + theme(panel.background = element_rect(fill = nord["nord3"], color = nord["nord3"])) + theme(legend.position = c(0.5, 0.05)) + theme(axis.text = element_blank()) + theme(legend.title = element_text(color = "white")) + theme(legend.text = element_text(color = "white")) + theme(legend.key = element_rect(fill = nord["nord3"], color = nord["nord3"])) + theme(legend.background = element_rect(fill = nord["nord3"], color = nord["nord3"])) + theme(legend.direction = "horizontal")
As noted, the RStudio project associated with this post in in this gist
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.