Last active
April 10, 2016 20:25
-
-
Save csaid/21677bb64c1579f9e9d4852529331ac2 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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