country heatmap

“+proj=bacon”

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="./data/countries.geojson"
json_str = read(path, String)
worldCountries = GeoJSON.read(json_str)
FeatureCollection with 255 Features

3. load csv

df=@pipe CSV.File("./data/drinkers-had-a-heavy-session-in-past-30-days.csv")|>DataFrame|>transform(_,"Indicator:Alcohol, heavy episodic drinking (15+), drinkers only, past 30 days (%) - Sex:Both sexes"=>"drink")|>select(_,Not("Indicator:Alcohol, heavy episodic drinking (15+), drinkers only, past 30 days (%) - Sex:Both sexes"))

#size(df) # (189,4);
ys=2016
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 drink
String String3 Int64 Float64
1 Afghanistan AFG 2016 2.0
2 Albania ALB 2016 44.7
3 Algeria DZA 2016 19.3
4 Andorra AND 2016 40.5
5 Angola AGO 2016 81.6

4. aggregate data

geo_df = @chain DataFrame(worldCountries) @select(ISO_A3)
df=@left_join(geo_df, df,"ISO_A3")
df.drink=@pipe df.drink|>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

source = "+proj=longlat +datum=WGS84"
dest = "+proj=natearth2"
function plot_map()
    fig = Figure(size = (200,200), fontsize = 16)

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

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

hm2= poly!(
    ax, worldCountries;
    color=df.drink,
    colormap = Reverse(:plasma),
    strokecolor = :black,
    strokewidth = 0.25
)
cb = Colorbar(fig[1,2]; colorrange = (1, n), colormap =(:plasma), label = "variable, color code", height = Relative(0.65))
fig
end
plot_map()