country heatmap

1. load package

using Makie, CairoMakie, GeoMakie
import Downloads
using GeoMakie.GeoJSON
using GeometryBasics
using GeoMakie.GeoInterface
using CSV,DataFrames, Tidier,Pipe
using StatsBase

2. load geojson data

path="./plots-gallery-data/countries.geojson"
json_str = read(path, String)
worldCountries = GeoJSON.read(json_str)
FeatureCollection with 255 Features

3. load csv

df=@pipe CSV.File("./plots-gallery-data/gdp-per-capita-penn-world-table.csv")|>DataFrame|>transform(_,"GDP per capita (output, multiple price benchmarks)"=>"gdp")|>select(_,Not("GDP per capita (output, multiple price benchmarks)"))
ys=2019
df=@chain df begin
   @clean_names
   @filter(year== !!ys)
   @rename(ISO_A3=code)
   #@mutate(gdp=zscore([gdp...]))
end
first(df,5)
5×4 DataFrame
Row entity ISO_A3 year gdp
String String3 Int64 Float64
1 Albania ALB 2019 12531.8
2 Algeria DZA 2019 11787.5
3 Angola AGO 2019 7159.58
4 Anguilla AIA 2019 15177.9
5 Argentina ARG 2019 21826.8

4. aggregate data

geo_df = @chain DataFrame(worldCountries) @select(ISO_A3)
df=@left_join(geo_df, df,"ISO_A3")
df.gdp=@pipe df.gdp|>coalesce.(_, 0)
lons = -180:180
lats = -90:90
field = [exp(cosd(l)) + 3(y/90) for l in lons, y in lats]
n,_=size(df)
(255, 4)

5. plot map

function plot_map()
    fig = Figure(size = (200,200), fontsize = 16)

ax = GeoAxis(
    fig[1,1];
    dest="+proj=wintri",
    title = "World GDP",
    tellheight = true,
)

hm1 = surface!(ax, lons, lats, field)
translate!(hm1, 0, 0, -10)

hm2 = poly!(
    ax, worldCountries;
    color=df.gdp,
    colormap = Reverse(:plasma),
    strokecolor = :black,
    strokewidth = 0.25
)
cb = Colorbar(fig[1,2]; colorrange = (1, n), colormap = Reverse(:plasma), label = "variable, color code", height = Relative(0.65))
fig
end
plot_map()
┌ Warning: Could not find font regular, using TeX Gyre Heros Makie
└ @ Makie ~/.julia/packages/Makie/RgxaV/src/conversions.jl:1119