using Makie, CairoMakie, GeoMakie
import Downloads
using GeoMakie.GeoJSON
using GeometryBasics
using GeoMakie.GeoInterface
using CSV,DataFrames, Tidier,Pipe
using StatsBasecountry heatmap
“+proj=bacon”
1. load package
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()