I just want to try GeoMakie.jl
package
follow this page:
csv :economic-growth
map:geojson
gdp.csv file include 173 countries and region , but geojson include 255 feature
how to alignment data ? how to fill color?
#import package ....
path="./vis/data/countries.geojson"
json_str = read(path, String)
worldCountries = GeoJSON.read(json_str)
#n = length(worldCountries)
df=@pipe CSV.File("./vis/data/gdp-per-capita-penn-worldtable.csv")|>DataFrame
ys=2019
df=@chain df begin
@clean_names
@filter(year== !!ys)
end
lons = -180:180
lats = -90:90
field = [exp(cosd(l)) + 3(y/90) for l in lons, y in lats]
fig = Figure(size = (1200,800), fontsize = 22)
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= ?,
colormap = Reverse(:plasma),
strokecolor = :black,
strokewidth = 0.25
)
#fig
finally solved this problem,
actually it’s data problem , not plot problem
briefly routine is :
- load geosjon and data
- transform geojson to dataframe ,and just select column
ISO_A3
- cause geojso has 255 rows , and data just 178 rows, so we
@left_join(geo_df, df,"ISO_A3")
- fill missing gdp with zero :
@pipe df.gdp|>coalesce.(_, 0)
- plot map
## 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
path="./vis/plots-gallery-data/countries.geojson"
json_str = read(path, String)
worldCountries = GeoJSON.read(json_str)
n = length(worldCountries)
geo_df = @chain DataFrame(worldCountries) @select(ISO_A3)
## 3. load gdp data
df=@pipe CSV.File("./vis/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)
end
## 4. join dataframes by "ISO_A3"
df=@left_join(geo_df, df,"ISO_A3")
df.gdp=@pipe df.gdp|>coalesce.(_, 0)
## 5. plot map
lons = -180:180
lats = -90:90
field = [exp(cosd(l)) + 3(y/90) for l in lons, y in lats]
n,_=size(df)
function plot_map()
fig = Figure(size = (1200,800), fontsize = 22)
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()