Skip to content

Instantly share code, notes, and snippets.

@rCarto

rCarto/popcircle.R

Created Apr 5, 2019
Embed
What would you like to do?
library(rnaturalearth)
library(sf)
library(wbstats)
library(popcircle)
library(cartography)
# Get countries
ctry <- ne_countries(scale = 50, returnclass = "sf")
ctry <- st_transform(ctry, 54030)
# Only keep the largest polygons of multipart polygons for a few countries
# (e.g. display only continental US)
frag_ctry <- c("US", "RU", "FR", "IN", "ES", "NL", "CL", "NZ", "ZA")
largest_ring = function(x) {
x$ids <- 1:nrow(x)
pols = st_cast(x, "POLYGON", warn = FALSE)
spl = split(x = pols, f = pols$ids)
do.call(rbind, (lapply(spl, function(y) y[which.max(st_area(y)),])))
}
st_geometry(ctry[ctry$iso_a2 %in% frag_ctry,]) <-
st_geometry(largest_ring(ctry[ctry$iso_a2 %in% frag_ctry,]))
# Get and merge data
data_co2 <- wb(indicator = "EN.ATM.CO2E.KT", startdate = 2014, enddate = 2014)
ctry_co2 <- merge(ctry[,"iso_a2"], data_co2, by.x = "iso_a2", by.y = "iso2c" )
data_pop <- wb(indicator = "SP.POP.TOTL", startdate = 2017, enddate = 2017)
ctry_pop <- merge(ctry[,"iso_a2"], data_pop, by.x = "iso_a2", by.y = "iso2c" )
# Computes circles and polygons
res_pop <- popcircle(x = ctry_pop, var = "value")
circles_pop <- res_pop$circles
shapes_pop <- res_pop$shapes
res_co2 <- popcircle(x = ctry_co2, var = "value")
circles_co2 <- res_co2$circles
shapes_co2 <- res_co2$shapes
# Create the figure
png("pop.png", width = 800, height = 750, res = 100)
par(mar = c(0,0,0,0))
## POPULATION
# display circles and polygons
plot(st_geometry(circles_pop), bg = "#e6ebe0",col = "#9bc1bc", border = "white")
plot(st_geometry(shapes_pop), col = "#ed6a5a95", border = "#ed6a5a",
add = TRUE, lwd = .3)
# labels
circles_pop$lab <- paste0(circles_pop$country, '\n',
round(circles_pop$value/1000000))
labelLayer(x = circles_pop[1:36,], txt = "lab", halo = TRUE, overlap = FALSE,
pos = 3, cex = seq(1,0.4, length.out = 36), col = "#5d576b", r=.15)
# title
bb <- st_bbox(circles_pop)
text(x = bb[1], bb[4], labels = "Population", adj=c(0,1),
col = "grey50", cex = 2)
text(x = bb[3], bb[4], labels = "Million Inhabitants", adj=c(1,1),
col = "grey50", cex = 1.2, font = 3)
mtext(text = "T. Giraud, 2019 - World Development Indicators, 2017 ",
side = 1, line = -1, adj = 1, cex = .8, font = 3, col = "grey50")
dev.off()
## CO2
# Create the figure
png("co2.png", width = 800, height = 750, res = 100)
par(mar = c(0,0,0,0))
# display circles and polygons
plot(st_geometry(circles_co2),bg = "#a2a79e", col = "#757083", border = "white")
plot(st_geometry(shapes_co2), col = "#88292f95", border = "#88292f",
add = TRUE, lwd = .3)
# labels
circles_co2$lab <- paste0(circles_co2$country, '\n',
round(circles_co2$value/1000))
labelLayer(x = circles_co2[1:36,], txt = "lab", halo = TRUE, overlap = FALSE,
pos = 3, cex = seq(.9,0.5, length.out = 36), col = "#2e1e0f", r=.15, show.lines = FALSE)
# title
bb <- st_bbox(circles_co2)
text(bb[1], bb[4], labels = "CO2 Emissions", adj=c(0,1),
col = "white", cex = 2)
text(x = bb[3], bb[4], labels = "Million Tons", adj=c(1,1),
col = "white", cex = 1.2, font = 3)
# sources
mtext(text = "T. Giraud, 2019 - World Development Indicators, 2014 ",
side = 1, line = -1, adj = 1, cex = .8, font = 3, col = "white")
dev.off()
@rCarto

This comment has been minimized.

Copy link
Owner Author

@rCarto rCarto commented Apr 5, 2019

init

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment