Since tomorrow we’ll be having another one of those practice democracy drills here in California, I thought I’d put together a few bar charts.
There are five propositions on tomorrow’s ballot. In researching them, Lena came across the Cal-Access Campaign Finance Activity: Propositions & Ballot Measures.
Unfortunately, for each proposition, you have to click through each committee to get the details for the amount of money they’ve raised and spent. Here’s a run-down in visual form, the only data manipulation I did was round to the nearest dollar. Note: no committees formed to support or oppose Proposition 13.
Here’s how much money was raised, by proposition:

Money Raised
Just in case you didn’t get the full picture, here is the same data plotted on a common scale:

Money Raised (common scale)
And the same two plots for money spent1:

Money Spent

Money Spent (common scale)
It could just be my perception of things, but I get pretty suspicious when there’s a ton of money involved in politics, especially when it’s this lopsided.
The only thing I have to add is you should Vote “YES” on Prop 15, because Larry Lessig says so, and so do the Alameda County Greens!
Update #1: Let me write it out in text, so that the search engines have an easier time finding this. According to the official record from Cal-Access (Secretary of State), as of May 22nd, 2010, there were $54.4 million spent in support of various propositions, most notably $40.5 million on Prop 16, $8.9 million on Prop 17, and $4.6 million on Prop 14. Compare that with a “grand” total of less than $1.2 million spent to oppose them, with a trivial $78 thousand (!!) to oppose Prop 16′s $40.5 million deep pockets.
Update #2: The California Voter Foundation included more recent totals (they don’t seem to be that different), as well as a listing of the top 5 donors for each side of a proposition in their Online Voter Guide.
Also, here’s the python code used to generate these plots (enable javascript to get syntax highlighting):
# Create contributions and expenditures bar charts of committees supporting and
# opposing various propositions on the California Ballot for June 8th, 2010
# created by Paul Ivanov (http://pirsquared.org)
# figure(0) - Contributions by Proposition (as subplots)
# figure(1) - Expenditures by Proposition (as subplots)
# figure(2) - Contributions on a common scale
# figure(3) - Expenditures on a common scale
import numpy as np
from matplotlib import pyplot as plt
import locale
# This part was done by hand by collecting data from CalAccess:
# http://cal-access.sos.ca.gov/Campaign/Measures/
prop = np.array([
4650694.66, 4623830.07 # Yes on 14 Contributions, Expenditures
, 216050, 52796.71 # No on 14 Contributions, Expenditures
, 118807.45, 264136.30 # Yes on 15 Contributions, Expenditures
, 200750.01, 86822.79 # No on 15 Contributions, Expenditures
, 40706258.17, 40582036.58 # Yes on 16 Contributions, Expenditures
, 83187.29, 78063.91 # No on 16 Contributions, Expenditures
, 10328675.12, 8932786.06 # Yes on 17 Contributions, Expenditures
, 1229783.79, 965218.48 # No on 17 Contributions, Expenditures
])
prop.shape = -1,2,2
def currency(x, pos):
"""The two args are the value and tick position"""
if x==0:
return "$0"
if x < 1e3:
return '$%f' % (x)
elif x< 1e6:
return '$%1.0fK' % (x*1e-3)
return '$%1.0fM' % (x*1e-6)
from matplotlib.ticker import FuncFormatter
formatter = FuncFormatter(currency)
yes,no = range(2)
c = [(1.,.5,0),'blue'] # color for yes/no stance
a = [.6,.5] # alpha for yes/no stance
t = ['Yes','No '] # text for yes/no stance
raised,spent = range(2)
title = ["Raised for", "Spent on" ] # reuse code by injecting title specifics
field = ['Contributions', 'Expenditures']
footer ="""
Data from CalAccess: http://cal-access.sos.ca.gov/Campaign/Measures/
'Total %s 1/1/2010-05/22/2010' field extracted for every committee
and summed by position ('Support' or 'Oppose'). No committees formed to
support or oppose Proposition 13. cc-by Paul Ivanov (http://pirsquared.org).
""" # will inject field[col] in all plots
color = np.array((.9,.9,.34))*.9 # spine/ticklabel color
plt.rcParams['savefig.dpi'] = 100
def fixup_subplot(ax,color):
""" Tufte-fy the axis labels - use different color than data"""
spines = ax.spines.values()
# liberate the data! hide right and top spines
[s.set_visible(False) for s in spines[:2]]
ax.yaxis.tick_left() # don't tick on the right
# there's gotta be a better way to set all of these colors, but I don't
# know that way, I only know the hard way
[s.set_color(color) for s in spines]
[s.set_color(color) for s in ax.yaxis.get_ticklines()]
[s.set_visible(False) for s in ax.xaxis.get_ticklines()]
[(s.set_color(color),s.set_size(8)) for s in ax.xaxis.get_ticklabels()]
[(s.set_color(color),s.set_size(8)) for s in ax.yaxis.get_ticklabels()]
ax.yaxis.grid(which='major',linestyle='-',color=color,alpha=.3)
# for subplot spacing, I fiddle around using the f.subplot_tool(), then get
# this dict by doing something like:
# f = plt.gcf()
# adjust_dict= f.subplotpars.__dict__.copy()
# del(adjust_dict['validate'])
# f.subplots_adjust(**adjust_dict)
adjust_dict = {'bottom': 0.12129189716889031, 'hspace': 0.646815834767644,
'left': 0.13732508948909858, 'right': 0.92971038073543777,
'top': 0.91082616179001742, 'wspace': 0.084337349397590383}
for col in [raised, spent]: #column to plot - money spent or money raised
# subplots for each proposition (Fig 0 and Fig 1)
f = plt.figure(col); f.clf(); f.dpi=100;
for i in range(len(prop)):
ax = plt.subplot(len(prop),1, i+1)
ax.clear()
p = i+14 #prop number
for stance in [yes,no]:
plt.bar(stance, prop[i,stance,col], color=c[stance], linewidth=0,
align='center', width=.1, alpha=a[stance])
lbl = locale.currency(round(prop[i,stance,col]), symbol=True, grouping=True)
lbl = lbl[:-3] # drop the cents, since we've rounded
ax.text(stance, prop[i,stance,col], lbl , ha='center', size=8)
ax.set_xlim(-.3,1.3)
ax.xaxis.set_ticks([0,1])
ax.xaxis.set_ticklabels(["Yes on %d"%p, "No on %d"%p])
# put a big (but faded) "Proposition X" in the center of this subplot
common=dict(alpha=.1, color='k', ha='center', va='center', transform = ax.transAxes)
ax.text(0.5, .9,"Proposition", size=8, weight=600, **common)
ax.text(0.5, .50,"%d"%p, size=50, weight=300, **common)
ax.yaxis.set_major_formatter(formatter) # plugin our currency labeler
ax.yaxis.get_major_locator()._nbins=5 # put fewer tickmarks/labels
fixup_subplot(ax,color)
adjust_dict.update(left=0.13732508948909858,right=0.92971038073543777)
f.subplots_adjust( **adjust_dict)
# Figure title, subtitle
extra_args = dict(family='serif', ha='center', va='top', transform=f.transFigure)
f.text(.5,.99,"Money %s CA Propositions"%title[col], size=12, **extra_args)
f.text(.5,.96,"June 8th, 2010 Primary", size=9, **extra_args)
#footer
extra_args.update(va='bottom', size=6,ma='left')
f.text(.5,0.0,footer%field[col], **extra_args)
f.set_figheight(6.); f.set_figwidth(3.6); f.canvas.draw()
f.savefig('CA-Props-June8th2009-%s-Subplots.png'%field[col])
# all props on one figure (Fig 2 and Fig 3)
f = plt.figure(col+2); f.clf()
adjust_dict.update(left= 0.06,right=.96)
f.subplots_adjust( **adjust_dict)
f.set_figheight(6.)
f.set_figwidth(7.6)
extra_args = dict(family='serif', ha='center', va='top', transform=f.transFigure)
f.text(.5,.99,"Money %s CA Propositions"%title[col], size=12, **extra_args)
f.text(.5,.96,"June 8th, 2010 Primary", size=9, **extra_args)
extra_args.update(ha='left', va='bottom', size=6,ma='left')
f.text(adjust_dict['left'],0.0,footer%field[col], **extra_args)
ax = plt.subplot(111)
for stance in [yes,no]:
abscissa=np.arange(0+stance*.30,4,1)
lbl = locale.currency(round(prop[:,stance,col].sum()),True,True)
lbl = lbl[:-3] # drop the cents, since we've rounded
lbl = t[stance]+" Total"+ lbl.rjust(12)
plt.bar(abscissa,prop[:,stance,col], width=.1, color=c[stance],
alpha=a[stance],align='center',linewidth=0, label=lbl)
for i in range(len(prop)):
lbl = locale.currency(round(prop[i,stance,col]), symbol=True, grouping=True)
lbl = lbl[:-3] # drop the cents, since we've rounded
ax.text(abscissa[i], prop[i,stance,col], lbl , ha='center',
size=8,rotation=00)
ax.set_xlim(xmin=-.3)
ax.xaxis.set_ticks(np.arange(.15,4,1))
ax.xaxis.set_ticklabels(["Proposition %d"%(i+14) for i in range(4)])
fixup_subplot(ax,color)
# plt.legend(prop=dict(family='monospace',size=9)) # this makes legend tied
# to the subplot, tie it to the figure, instead
handles, labels = ax.get_legend_handles_labels()
l = plt.figlegend(handles, labels,loc='lower right',prop=dict(family='monospace',size=9))
l.get_frame().set_visible(False)
ax.yaxis.set_major_formatter(formatter) # plugin our currency labeler
f.canvas.draw()
f.savefig('CA-Props-June8th2009-%s.png'%field[col])
plt.show()
- I don’t fully understand what these numbers mean, as some groups’ “Total Expenditures” exceed their “Total Contributions” and still had positive “Ending Cash”↩







