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')