Choropleths are a nice tool for the visualization of geographic data and with R and Python, their creation can be pretty effortless, especially when clean data is readily available. Fortunately, a lot of economic datasets can be loaded from the World Bank Open Data platform. Nevertheless, making the visualization look nice can be a bit cumbersome. For this reason, I have created a small, integrated function that is handling the data download, adjustment, and visualization all in one. The output can easily be exported as high-quality vector-graphic using ggsave.
To replicate the example, simply follow these three steps.
1) Install all required packages
install.packages("rnaturalearth") install.packages("rnaturalearthdata") install.packages("WDI") install.packages("lubridate") install.packages("dplyr") install.packages("ggplot2") install.packages("RColorBrewer") install.packages("ggplot2")
2) Load the function
#Download and visualization function get_and_plot_wb_data<-function(sel_indicator="NY.GDP.PCAP.KD", log="Yes", midpoint="Mean", color_scheme="Straight", start_yr = year(Sys.Date())-2, end_yr = year(Sys.Date()), legend_pos="Bottom", charttitle="GDP per Capita in US$", scale_factor=1) { #Load required packages library(rnaturalearth) library(rnaturalearthdata) library(WDI) library(lubridate) library(dplyr) library(ggplot2) library(RColorBrewer) library(ggplot2) #Create color scheme cols_gr<-c("#632523", "#953735", "#C3D69B","#77933C", "#4F6228") cols_gr = colorRampPalette(cols_gr)(5) #Get all countries and countrycodes world <- ne_countries(scale = "medium", returnclass = "sf") class(world) #Load data using the worldbank API gdp<-WDI( country = "all", indicator = sel_indicator, start = start_yr, end = end_yr, extra = FALSE, cache = NULL, latest = NULL, language = "en" ) names(gdp)[1]<-"iso_a2" names(gdp)[names(gdp)==sel_indicator]<-"ret" gdp<-gdp[order(gdp$country,gdp$year),] print(max(gdp$year)) gdp% group_by(iso_a2) %>% do(tail(., n=1)) world<-merge(world,gdp,by="iso_a2",all=F) #Remove some unnecssary elements plain <- theme( panel.background = element_rect(fill = "white"), ) world$ret<-round(world$ret/scale_factor,2) #Choose appropriate breakpoint if(midpoint=="Median") { midpoint<-median((world$ret),na.rm=T) }else{ if(midpoint=="Mean") { midpoint<-mean((world$ret),na.rm=T) }else{ midpoint<-midpoint } } #Red to green or green to red if(color_scheme=="Inverted") { col_low<-"#276419" col_high<-"#8E0152" }else{ col_low<-"#8E0152" col_high<-"#276419" } #Plot map with ggplot p9<- ggplot(data = world) + geom_sf(aes(fill = (ret))) + ggtitle(charttitle) + #theme(legend.position = legend_pos,legend.margin=margin(-10,-10,-10,-10),legend.box.margin=margin(-100,800,-50,-50))+ plain #Use log scale for skewed data if(log=="Yes") { p9<-p9+ scale_fill_gradient2( trans = "log", low = col_low, mid = "white", high = col_high, midpoint = log(midpoint), space = "Lab", na.value = "grey50", guide = "colourbar", aesthetics = "fill", name="" ) }else{ p9<-p9+ scale_fill_gradient2( low = col_low, mid = "white", high = col_high, midpoint = midpoint, space = "Lab", na.value = "grey50", guide = "colourbar", aesthetics = "fill", name="" ) } res_list<-list("dataset"=world,"visualization"=p9) return(res_list) }
3) Run the function and save the plot
#Run the function res_list<-get_and_plot_wb_data(sel_indicator="NY.GDP.PCAP.KD",midpoint="Median",log="Yes",legend_pos="bottom",charttitle="GDP per Capita in US$",scale_factor=1) res_list$visualization #Export the result target_folder<-"C:/your_path/" ggsave(file=paste0(target_folder,"gdp_per_capita.svg"), plot=res_list$visualization, width=14, height=7)