Create a gist now

Instantly share code, notes, and snippets.

What would you like to do?
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import cps
import seaborn as sns
sns.set_style('white')
plt.ion()
# This is a quick hack that gets the job done :/
def repulsion(arr):
thresh = 2 # Max shift is 2 percentage points
for i in range(len(arr)-1):
diff = arr[i+1]-arr[i]
if diff < thresh:
arr[i] = arr[i+1]-thresh
if np.diff(arr).min() < thresh:
arr = repulsion(arr)
return arr
def percent_format(x):
return str(int(np.round(x))) + '%'
df = pd.read_csv('data.txt')
n = len(df)
vo = 0.0 # text vertical offset
hoa = 0.06 # horiztonal offset of agreement percent number
hoi = 0.26 # horizontal offset of issue text
# Apply repulsion, so that text doesn't overlap
df = df.sort_values('expert_agreement')
df['expert_plot_position'] = repulsion(df['expert_agreement'].copy().values)
df = df.sort_values('public_agreement')
df['public_plot_position'] = repulsion(df['public_agreement'].copy().values)
# Create columns with nicely formatted percents
df['expert_agreement_percent'] = df['expert_agreement'].apply(percent_format)
df['public_agreement_percent'] = df['public_agreement'].apply(percent_format)
plt.figure(figsize=[9,10])
for i in range(n):
# Nicely formatted percents
plt.text(0 - hoa, df.ix[i, 'expert_plot_position'] + vo, df.ix[i, 'expert_agreement_percent'], ha='right', va='center', fontsize=8)
plt.text(1 + hoa, df.ix[i, 'public_plot_position'] + vo, df.ix[i, 'public_agreement_percent'], ha='left', va='center', fontsize=8)
# Policy question text
plt.text(0 - hoi, df.ix[i, 'expert_plot_position'] + vo, df.ix[i, 'issue'], ha='right', va='center', fontsize=8)
plt.text(1 + hoi, df.ix[i, 'public_plot_position'] + vo, df.ix[i, 'issue'], ha='left', va='center', fontsize=8)
# Gray lines
plt.plot([0, 1], [df.ix[i, 'expert_plot_position'], df.ix[i, 'public_plot_position']], linewidth=0.5, color=[0.5, 0.5, 0.5], zorder=1)
plt.scatter(np.zeros(n), df['expert_plot_position'].values, color=cps.blue, zorder=2)
plt.scatter(np.ones(n), df['public_plot_position'].values, color=cps.pink, zorder=2)
# Titles
plt.text(-0.3, 105, "Expert Agreement", ha='right', fontsize=16)
plt.text(1.3, 105, "Public Agreement", ha='left', fontsize=16)
# Clean up chart
sns.despine(bottom=True, left=True) # Remove axes
plt.gca().xaxis.set_major_locator(plt.NullLocator()) # Remove xticks
plt.gca().yaxis.set_major_locator(plt.NullLocator()) # Remove yticks
plt.gcf().set_tight_layout(True)
plt.xlim([-2.4, 3.4])
plt.ylim([-2, 108])
plt.savefig('fig_econ_poll.png', dpi=250)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment