import geopandas as gpd
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from mpl_ornaments.titles import set_title_and_subtitle

fig, ax = plt.subplots(nrows=1, ncols=1)

#1
cmap = 'YlGn'

#2
turnout = pd.read_csv(f'data/uk-election-turnout-2019.csv', comment='#')
turnout['turnout'] = 100*turnout['turnout']

#3
boundaries = gpd.read_file(f'data/uk-parliamentary-constituencies-hexagon-cartogram/GB_Hex_Cartogram_Const.shp')
boundaries = boundaries.to_crs("ESRI:53004") 

#4
merged_df = pd.merge(left=boundaries, right=turnout, 
                     left_on='CODE', right_on='constituency_id')

#5
merged_df.plot(ax=ax, edgecolor='black', linewidth=0.3,
               column='turnout', cmap=cmap)

#6
lbound, ubound = turnout['turnout'].agg(['min', 'max'])

#7
norm = mpl.colors.Normalize(vmin=lbound, vmax=ubound) 
sm = plt.cm.ScalarMappable(cmap=cmap, norm=norm)

#8
ticks=np.linspace(start=45, stop=80, num=8)
ticklabels = [f'{tick:.0f}%' for tick in ticks]

#9
cbar = fig.colorbar(mappable=sm, ticks=ticks, ax=ax, shrink=0.7)
cbar.set_ticklabels(ticklabels = ticklabels)

ax.axis('off')

title = 'UK general election 2019: Turnout'
subtitle = f'By constituency. Source: House of Commons Library'
set_title_and_subtitle(fig=fig, title=title, subtitle=subtitle,
                       alignment='left', h_offset=100)
fig.savefig('charts/hexgrid_map.png', bbox_inches='tight', dpi=300)