Australian elections under proportional representation #

  • Quotas and seats by year
  • Electorates seats vs. full PR seats by party by year
  • Graph of government by year under the two systems
  • Senates by year
  • Independents by year
  • Quirky description of each election
  • Lab and Coa seats by year in both setups

1972 #

Reality: Solid Labor victory (67-58), PM Whitlam.

Under PR: Narrow left-wing bloc majority (65-60), PM Whitlam.

Senate: Coalition + DLP majority.

  • Whitlam aims to unseat PM McMahon
  • DLP/Lab split (Senate implications?)
  • Whitlam needs Australia party

1974 #

Reality: Narrow Labor victory (66-61), PM Whitlam.

Under PR: Narrow left-wing bloc majority (67-60), PM Whitlam.

1975 #

Reality: Landslide Coalition victory (91-36), PM Fraser.

Under PR: Coalition victory (67-54 + 2 DLP, 1 AUS, 1 IND, 1 DEM). PM Fraser.

1977 #

Reality: Landslide Coalition victory (86-38), PM Fraser.

Under PR: Narrow left-wing bloc majority (63-61), PM Whitlam.

1980 #

Reality: Solid Coalition victory (74-51), PM Fraser.

Under PR: Narrow left-wing bloc majority (66-59), PM Hayden.

  • Workers/Prog communisits aggregated into one seat. Maybe out of Coalition.

1983 #

Reality: Solid Labor victory (75-50), PM Hawke.

Under PR: Solid left-wing bloc majority (69-55), PM Hawke.

1984 #

Reality: Solid Labor victory (82-66), PM Hawke.

Under PR: Narrow left-wing bloc majority (78-70), PM Hawke.

1987 #

Reality: Solid Labor victory (86-62), PM Hawke.

Under PR: Narrow left-wing bloc majority (77-71), PM Hawke.

1990 #

Reality: Narrow Labor victory (78-69 + 1 IND), PM Hawke.

Under PR: Narrow left-wing bloc majority (78-70), PM Hawke.

1993 #

Reality: Solid Labor victory (80-65 + 2 INDs), PM Keating.

Under PR: Narrow left-wing bloc majority (77-70), PM Keating.

1996 #

Reality: Solid Coalition victory (94-59 + 5 INDs), PM Howard.

Under PR: Narrow right-wing bloc majority (75-73), PM Howard.

Senate: Tied.

John Howard had just come back from the precipice, regaining the Liberal leadership despite reckoning just a few years earlier that the odds of it happening were like “Lazarus with a triple bypass”. And election night 1996 in our alternative reality was tense, unlike the landslide, clear-on-the-night result in reality: the left-wing bloc had 72 seats (Labor 57, Democrats 10, Greens 4 and the Natural Law 1), and the right-wing bloc had 72 as well (Liberals 57, Country Party 13, Christian Democrats 1, Against Further Immigration 1).

In the 148-seat parliament then, the kingmakers were the four independents elected (in reality there were five): Pauline Hanson, Paul Filing, Graeme Campbell and Peter Andren (Allan Rocher, the fifth independent in the real 38th Parliament, had the fewest first preference votes so doesn’t get a quota). Three of these indepedents could reliably be called upon to vote with the right-wing bloc (Hanson, Filing, Campbell), bringing them to their majority of 75. Independent Peter Andren remained a wild card, not officially siding with either bloc, and ensuring the Howard government remained a by-election from no confidence throughout its entire first term.

1998 #

Reality: Coalition victory (80-67 + 1 IND), PM Howard.

Under PR: Narrow right-wing bloc majority (75-73), PM Howard.

2001 #

Reality: Coalition victory (82-65 + 3 INDs), PM Howard.

Under PR: Narrow left-wing bloc majority (76-74), PM Beazley.

2004 #

Reality: Solid Coalition victory (87-60 + 3 INDs), PM Howard.

Under PR: Narrow right-wing bloc majority (77-73), PM Howard.

2007 #

Reality: Solid Labor victory (83-65 + 3 INDs), PM Rudd.

Under PR: Narrow left-wing bloc majority (78-72), PM Rudd.

2010 #

Reality: Narrow left-wing bloc majority (76-74), PM Gillard.

Under PR: Narrow left-wing bloc majority (78-72), PM Gillard.

2013 #

Reality: Solid Coalition victory (90-55 + 3 INDs, 1 GRN, 1 PUP), PM Abbott.

Under PR: Solid right-wing bloc majority (82-68), PM Abbott.

2016 #

Reality: Narrow Coalition victory (76-69 + 3 INDs, 1 GRN, 1 NXT), PM Turnbull.

Under PR: Narrow left-wing bloc majority (76-76), PM Shorten.

2019 #

Reality: Narrow Coalition victory (77-68 + 4INDs, 1 GRN, 1 NXT), PM Morrison.

Under PR: Narrow right-ring bloc majority (77-73), PM Morrison.

Plots #

Seats and quotas by year #

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.ticker as mtick

df = pd.read_csv('~/dev/elections/aus_pr/seats.csv').reset_index()
df['quota'] = df['total_votes'] / df['seats'].astype(float)
plt.rcParams["figure.figsize"] = (15,7)
fig, ax1 = plt.subplots()
csfont = {'fontname':'PT Serif'}
fig.suptitle('Seats and quotas by year', **csfont, fontsize=36)
plt.rcParams['savefig.facecolor']='#E3E2DF'

ax2 = ax1.twinx()
ax1.set_xlabel('Year', fontsize=32, **csfont)
ax1.set_ylabel('Seats', color='xkcd:royal blue', fontsize=32,**csfont)
ax2.set_ylabel('PR quota', color='xkcd:salmon', fontsize=32,**csfont)
#ax2.set_ylim(0.5,1)
ax1.set_ylim(0, 160)
ax1.set_xlim(-1, 19)
#plt.xticks(df['year'])
#ax1.set_xticklabels(df['year'], fontsize=16, **csfont)
ax1.tick_params(axis='x', labelsize=24)
ax1.tick_params(axis='y', labelsize=24)
ax2.tick_params(axis='y', labelsize=24)
for tick in ax1.get_xticklabels():#, ax1.get_yticklabels(), ax2.get_yticklabels()]:
    tick.set_fontname("PT Serif")
for tick in ax2.get_yticklabels():#, ax1.get_yticklabels(), ax2.get_yticklabels()]:
    tick.set_fontname("PT Serif")
for tick in ax1.get_yticklabels():#, ax1.get_yticklabels(), ax2.get_yticklabels()]:
    tick.set_fontname("PT Serif")
#for tick in [ax1.xaxis.get_major_ticks(), ax1.get_yticklabels(), ax2.get_yticklabels()]:
#    tick.set_fontsize(5)
df.loc[-2, 'year'] = 1968
df.loc[-1, 'year'] = 1970
df.loc[19, 'year'] = 2020
df.loc[20, 'year'] = 2023
ax1.bar(df.index, df['seats'], color='xkcd:royal blue', width=0.8)
print([df.loc[int(x), 'year'] for x in range(0, 19)])
ax1.get_xaxis().set_major_formatter(lambda x, p: int(df.loc[int(x), 'year']))
ax2.get_yaxis().set_major_formatter(lambda x, p: format(int(x), ','))
ax2.plot(df.index, df['quota'], color='xkcd:salmon', linewidth=6)
#secax_y2 = ax.secondary_yaxis(
#    1.2, functions=(celsius_to_anomaly, anomaly_to_celsius))
fig.tight_layout()
fname = '/Users/clinton/roam/img/seats_and_quotas.png'
plt.savefig(fname)
fname

Real and imagined results by year #

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.ticker as mtick

actual_df = pd.read_csv('~/dev/elections/aus_pr/actual.csv').reset_index()
actual_df.loc[-2, 'Year'] = 1968
actual_df.loc[-1, 'Year'] = 1970
actual_df.loc[19, 'Year'] = 2020
actual_df.loc[20, 'Year'] = 2023

pr_df = pd.read_csv('~/dev/elections/aus_pr/pr.csv').reset_index()
pr_df.loc[-2, 'Year'] = 1968
pr_df.loc[-1, 'Year'] = 1970
pr_df.loc[19, 'Year'] = 2020
pr_df.loc[20, 'Year'] = 2023
pr_df['miscR'] = pr_df['miscR'] + pr_df['CEC'] + pr_df['AF'] + pr_df['U'] + pr_df['AFA']

colors_df = pd.read_csv('~/dev/elections/aus_pr/party_colors.csv').reset_index()
colors_map = {}
for i, row in colors_df.iterrows():
    colors_map[row['party']] = '#' + str(row['color'])

plt.rcParams["figure.figsize"] = (15,15)
fig, (ax1, ax2) = plt.subplots(2, 1, sharex=True)

csfont = {'fontname':'PT Serif'}
plt.suptitle('Real and imagined results', fontsize=36, **csfont)
plt.rcParams['savefig.facecolor']='#E3E2DF'
ax2.set_xlim(-1, 19)
ax1.set_xlim(-1, 19)
ax2.set_xlabel('Year', fontsize=32, **csfont)
ax2.get_xaxis().set_major_formatter(lambda x, p: int(actual_df.loc[int(x), 'Year']))
ax1.set_ylabel('Seats (real)', fontsize=32,**csfont)
ax2.set_ylabel('Seats (imagined)', fontsize=32,**csfont)
ax1.bar(actual_df.index, actual_df['Lab'], color='xkcd:red', width=0.8, label='ALP')
ax1.bar(actual_df.index, actual_df['GRN'], color='xkcd:green', width=0.8, label='GRN', bottom=actual_df['Lab'])
ax1.bar(actual_df.index, actual_df['NXT'], color='xkcd:orange', width=0.8, label='NXT', bottom=actual_df['Lab'] + actual_df['GRN'])

ax1.bar(actual_df.index, actual_df['Ind'], color='xkcd:grey', width=0.8, label='IND', bottom=actual_df['Lab'] + actual_df['GRN'] + actual_df['NXT'])

ax1.bar(actual_df.index, actual_df['PUP'], color='xkcd:yellow', width=0.8, bottom=actual_df['Lab'] + actual_df['GRN'] + actual_df['NXT'] +  actual_df['Ind'], label='LIB')

ax1.bar(actual_df.index,
	actual_df['KAP'],
	color=colors_map['KAP'],
	width=0.8,
	bottom=actual_df['Lab'] + actual_df['GRN'] + actual_df['NXT'] + actual_df['Ind'] + actual_df['PUP'],
	label='KAP')

ax1.bar(actual_df.index,
	actual_df['CP'],
	color=colors_map['CP'],
	width=0.8,
	bottom=actual_df['Lab'] + actual_df['GRN'] + actual_df['NXT'] + actual_df['Ind'] + actual_df['PUP'] + actual_df['KAP'],
	label='CP')

ax1.bar(actual_df.index,
	actual_df['LIB'],
	color=colors_map['LIB'],
	width=0.8,
	bottom=actual_df['Lab'] + actual_df['GRN'] + actual_df['NXT'] + actual_df['Ind'] + actual_df['PUP'] + actual_df['KAP'] + actual_df['CP'],
	label='LIB')

ax2.bar(pr_df.index,
	pr_df['Lab'],
	color=colors_map['ALP'],
	width=0.8,
	label='ALP')

ax2.bar(pr_df.index,
	pr_df['Aus'],
	color=colors_map['Aus'],
	width=0.8,
	bottom=pr_df['Lab'],
	label='Australia')

ax2.bar(pr_df.index,
	pr_df['WP'],
	color=colors_map['WP'],
	width=0.8,
	bottom=pr_df['Lab'] + pr_df['Aus'],
	label='Workers / Progress')

ax2.bar(pr_df.index,
	pr_df['Dem'],
	color=colors_map['DEM'],
	width=0.8,
	bottom=pr_df['Lab'] + pr_df['Aus'] + pr_df['WP'],
	label='Australian Democrats')

ax2.bar(pr_df.index,
	pr_df['GRN'],
	color=colors_map['GRN'],
	width=0.8,
	bottom=pr_df['Lab'] + pr_df['Aus'] + pr_df['WP'] + pr_df['Dem'],
	label='Greens')

ax2.bar(pr_df.index,
	pr_df['SEX'],
	color=colors_map['SEX'],
	width=0.8,
	bottom=pr_df['Lab'] + pr_df['Aus'] + pr_df['WP'] + pr_df['Dem'] + pr_df['GRN'],
	label='Sex Party')

ax2.bar(pr_df.index,
	pr_df['NXT'],
	color=colors_map['NXT'],
	width=0.8,
	bottom=pr_df['Lab'] + pr_df['Aus'] + pr_df['WP'] + pr_df['Dem'] + pr_df['GRN'] + pr_df['SEX'],
	label='Center Alliance')

ax2.bar(pr_df.index,
	pr_df['AJ'],
	color=colors_map['AJ'],
	width=0.8,
	bottom=pr_df['Lab'] + pr_df['Aus'] + pr_df['WP'] + pr_df['Dem'] + pr_df['GRN'] + pr_df['SEX'] + pr_df['NXT'],
	label='Animal Justice')

ax2.bar(pr_df.index,
	pr_df['miscL'],
	color=colors_map['miscL'],
	width=0.8,
	bottom=pr_df['Lab'] + pr_df['Aus'] + pr_df['WP'] + pr_df['Dem'] + pr_df['GRN'] + pr_df['SEX'] + pr_df['NXT'] + pr_df['AJ'],
	label='Misc. left')

ax2.bar(pr_df.index,
	pr_df['Ind'],
	color=colors_map['IND'],
	width=0.8,
	bottom=pr_df['Lab'] + pr_df['Aus'] + pr_df['WP'] + pr_df['Dem'] + pr_df['GRN'] + pr_df['SEX'] + pr_df['NXT'] + pr_df['AJ'] + pr_df['miscL'],
	label='Independents')

ax2.bar(pr_df.index,
	pr_df['miscR'],
	color=colors_map['miscR'],
	width=0.8,
	bottom=pr_df['Lab'] + pr_df['Aus'] + pr_df['WP'] + pr_df['Dem'] + pr_df['GRN'] + pr_df['SEX'] + pr_df['NXT'] + pr_df['AJ'] + pr_df['miscL'] + pr_df['Ind'],
	label='Misc. right')

ax2.bar(pr_df.index,
	pr_df['Ann'],
	color=colors_map['Ann'],
	width=0.8,
	bottom=pr_df['Lab'] + pr_df['Aus'] + pr_df['WP'] + pr_df['Dem'] + pr_df['GRN'] + pr_df['SEX'] + pr_df['NXT'] + pr_df['AJ'] + pr_df['miscL'] + pr_df['Ind'] + pr_df['miscR'],
	label='Fraser Anning')

ax2.bar(pr_df.index,
	pr_df['RUA'],
	color=colors_map['RUA'],
	width=0.8,
	bottom=pr_df['Lab'] + pr_df['Aus'] + pr_df['WP'] + pr_df['Dem'] + pr_df['GRN'] + pr_df['SEX'] + pr_df['NXT'] + pr_df['AJ'] + pr_df['miscL'] + pr_df['Ind'] + pr_df['miscR'] + pr_df['Ann'],
	label='Rise Up Australia')

ax2.bar(pr_df.index,
	pr_df['KAP'],
	color=colors_map['KAP'],
	width=0.8,
	bottom=pr_df['Lab'] + pr_df['Aus'] + pr_df['WP'] + pr_df['Dem'] + pr_df['GRN'] + pr_df['SEX'] + pr_df['NXT'] + pr_df['AJ'] + pr_df['miscL'] + pr_df['Ind'] + pr_df['miscR'] + pr_df['Ann'] + pr_df['RUA'],
	label='Katter\'s Australian Party')

ax2.bar(pr_df.index,
	pr_df['PUP'],
	color='#FCEE4F',
	width=0.8,
	bottom=pr_df['Lab'] + pr_df['Aus'] + pr_df['WP'] + pr_df['Dem'] + pr_df['GRN'] + pr_df['SEX'] + pr_df['NXT'] + pr_df['AJ'] + pr_df['miscL'] + pr_df['Ind'] + pr_df['miscR'] + pr_df['Ann'] + pr_df['RUA'] + pr_df['KAP'],
	label='JKJ')

ax2.bar(pr_df.index,
	pr_df['FF'],
	color=colors_map['FF'],
	width=0.8,
	bottom=pr_df['Lab'] + pr_df['Aus'] + pr_df['WP'] + pr_df['Dem'] + pr_df['GRN'] + pr_df['SEX'] + pr_df['NXT'] + pr_df['AJ'] + pr_df['miscL'] + pr_df['Ind'] + pr_df['miscR'] + pr_df['Ann'] + pr_df['RUA'] + pr_df['KAP'] + pr_df['PUP'],
	label='Family First')

ax2.bar(pr_df.index,
	pr_df['ON'],
	color=colors_map['ON'],
	width=0.8,
	bottom=pr_df['Lab'] + pr_df['Aus'] + pr_df['WP'] + pr_df['Dem'] + pr_df['GRN'] + pr_df['SEX'] + pr_df['NXT'] + pr_df['AJ'] + pr_df['miscL'] + pr_df['Ind'] + pr_df['miscR'] + pr_df['Ann'] + pr_df['RUA'] + pr_df['KAP'] + pr_df['PUP'] + pr_df['FF'],
	label='One Nation')

ax2.bar(pr_df.index,
	pr_df['CD'],
	color=colors_map['CD'],
	width=0.8,
	bottom=pr_df['Lab'] + pr_df['Aus'] + pr_df['WP'] + pr_df['Dem'] + pr_df['GRN'] + pr_df['SEX'] + pr_df['NXT'] + pr_df['AJ'] + pr_df['miscL'] + pr_df['Ind'] + pr_df['miscR'] + pr_df['Ann'] + pr_df['RUA'] + pr_df['KAP'] + pr_df['PUP'] + pr_df['FF'] + pr_df['ON'],
	label='Christian Democrats')

ax2.bar(pr_df.index,
	pr_df['DLP'],
	color=colors_map['DLP'],
	width=0.8,
	bottom=pr_df['Lab'] + pr_df['Aus'] + pr_df['WP'] + pr_df['Dem'] + pr_df['GRN'] + pr_df['SEX'] + pr_df['NXT'] + pr_df['AJ'] + pr_df['miscL'] + pr_df['Ind'] + pr_df['miscR'] + pr_df['Ann'] + pr_df['RUA'] + pr_df['KAP'] + pr_df['PUP'] + pr_df['ON'] + pr_df['FF'] + pr_df['CD'],
	label='Democratic Labor Party')

ax2.bar(pr_df.index,
	pr_df['CP'],
	color=colors_map['CP'],
	width=0.8,
	bottom=pr_df['Lab'] + pr_df['Aus'] + pr_df['WP'] + pr_df['Dem'] + pr_df['GRN'] + pr_df['SEX'] + pr_df['NXT'] + pr_df['AJ'] + pr_df['miscL'] + pr_df['Ind'] + pr_df['miscR'] + pr_df['Ann'] + pr_df['RUA'] + pr_df['KAP'] + pr_df['PUP'] + pr_df['ON'] + pr_df['FF'] + pr_df['CD'] + pr_df['DLP'],
	label='Country Party / Nationals')

ax2.bar(pr_df.index,
	pr_df['LIB'],
	color=colors_map['LIB'],
	width=0.8,
	bottom=pr_df['Lab'] + pr_df['Aus'] + pr_df['WP'] + pr_df['Dem'] + pr_df['GRN'] + pr_df['SEX'] + pr_df['NXT'] + pr_df['AJ'] + pr_df['miscL'] + pr_df['Ind'] + pr_df['miscR'] + pr_df['Ann'] + pr_df['RUA'] + pr_df['KAP'] + pr_df['PUP'] + pr_df['ON'] + pr_df['FF'] + pr_df['CD'] + pr_df['DLP'] + pr_df['CP'],
	label='Liberals')

# ax2.tick_params(axis='x', labe
#                lsize=24)
ax1.tick_params(axis='y', labelsize=24)
ax2.tick_params(axis='y', labelsize=24)
for tick in ax2.get_xticklabels():#, ax1.get_yticklabels(), ax2.get_yticklabels()]:
    tick.set_fontname("PT Serif")
for tick in ax2.get_yticklabels():#, ax1.get_yticklabels(), ax2.get_yticklabels()]:
    tick.set_fontname("PT Serif")
for tick in ax1.get_yticklabels():#, ax1.get_yticklabels(), ax2.get_yticklabels()]:
    tick.set_fontname("PT Serif")

# ax2.plot(df['year'], df['quota'], color='xkcd:salmon', linewidth=2)
# secax_y2 = ax.secondary_yaxis(
#     1.2, functions=(celsius_to_anomaly, anomaly_to_celsius))
#handles, labels = ax2.get_legend_handles_labels()
#fig.legend(handles, labels, loc='upper left', bbox_to_anchor=(1.05,0), borderaxespad=0., fontsize=18)
ax2.legend(bbox_to_anchor=(1.35, 1.7), loc='upper right', borderaxespad=0., fontsize=18)
#ax1.legend(bbox_to_anchor=(1.05, 1), loc='upper left', borderaxespad=0., fontsize=24)
#fig.tight_layout()

fname = '/Users/clinton/roam/img/real_and_imagined.png'
plt.savefig(fname, bbox_inches='tight')
fname

Real and imagined governments by year #

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.ticker as mtick

df = pd.read_csv('~/dev/elections/aus_pr/governments.csv').reset_index()
df['lab'] = np.where(df['gvmt'] == 'Lab', 1, 0)
df['coa'] = np.where(df['gvmt'] == 'Coa', 1, 0)
actual_df = df[df['version'] == 'actual']
pr_df = df[df['version'] == 'pr'].reset_index()

actual_df.loc[-2, 'year'] = 1968
actual_df.loc[-1, 'year'] = 1970
actual_df.loc[19, 'year'] = 2020
actual_df.loc[20, 'year'] = 2023

pr_df.loc[-2, 'year'] = 1968
pr_df.loc[-1, 'year'] = 1970
pr_df.loc[19, 'year'] = 2020
pr_df.loc[20, 'year'] = 2023

colors_df = pd.read_csv('~/dev/elections/aus_pr/party_colors.csv').reset_index()
colors_map = {}
for i, row in colors_df.iterrows():
    colors_map[row['party']] = '#' + str(row['color'])

plt.rcParams["figure.figsize"] = (15,5)
fig, (ax1, ax2) = plt.subplots(2, 1, sharex=True)

csfont = {'fontname':'PT Serif'}
fig.suptitle('Real and imagined governments', fontsize=36, **csfont)
plt.rcParams['savefig.facecolor']='#E3E2DF'
ax2.set_xlim(-1, 19)
ax1.set_xlim(-1, 19)
ax2.set_xlabel('Year', fontsize=32, **csfont)
ax2.get_xaxis().set_major_formatter(lambda x, p: int(actual_df.loc[int(x), 'year']))
ax1.set_ylabel('Real', fontsize=32,**csfont)
ax2.set_ylabel('Imagined', fontsize=32,**csfont)
ax1.tick_params(axis='y', labelsize=24, left=False)
ax2.tick_params(axis='y', labelsize=24, left=False)

width=0.9
ax1.bar(actual_df.index, actual_df['lab'], color=colors_map['ALP'], width=width, label='Labor')
ax1.bar(actual_df.index, actual_df['coa'], color=colors_map['LIB'], width=width, label='Coalition')

ax2.bar(actual_df.index, pr_df['lab'], color=colors_map['ALP'], width=width, label='Labor')
ax2.bar(actual_df.index, pr_df['coa'], color=colors_map['LIB'], width=width, label='Coalition')
#ax1.get_yaxis().set_visible(False)
#ax2.get_yaxis().set_visible(False)

ax1.yaxis.set_ticklabels([])
ax2.yaxis.set_ticklabels([])
ax2.tick_params(axis='x', labelsize=24)
for tick in ax2.get_xticklabels():#, ax1.get_yticklabels(), ax2.get_yticklabels()]:
    tick.set_fontname("PT Serif")


csfont_bold = {'fontname':'PT Serif', 'fontweight': 'bold'}

def autolabel():
    for idx in range(0, 19):
	height = 0.5
	ax1.text(idx, height,
		 actual_df.loc[idx, 'PM'],
		 ha='center', va='center', rotation=90, fontsize=20, color='#CBE11E', **csfont_bold)
	ax2.text(idx, height,
		 pr_df.loc[idx, 'PM'],
		 ha='center', va='center', rotation=90, fontsize=20, color='#CBE11E', **csfont_bold)

autolabel()

# ax2.plot(df['year'], df['quota'], color='xkcd:salmon', linewidth=2)
# secax_y2 = ax.secondary_yaxis(
#     1.2, functions=(celsius_to_anomaly, anomaly_to_celsius))
#handles, labels = ax2.get_legend_handles_labels()
#fig.legend(handles, labels, loc='upper left', bbox_to_anchor=(1.05,0), borderaxespad=0., fontsize=18)
ax2.legend(bbox_to_anchor=(0.5, -0.6), loc='upper center', borderaxespad=0., fontsize=18, ncol=3)
#ax1.legend(bbox_to_anchor=(1.05, 1), loc='upper left', borderaxespad=0., fontsize=24)
#fig.tight_layout()

fname = '/Users/clinton/roam/img/governments.png'
plt.savefig(fname, bbox_inches='tight')