Skip to content

Instantly share code, notes, and snippets.

@emptymalei
Forked from messefor/hist_cum_twin_grid.py
Created November 7, 2018 15:06
Show Gist options
  • Save emptymalei/81b06e067191465f3a3690d65fbcda4d to your computer and use it in GitHub Desktop.
Save emptymalei/81b06e067191465f3a3690d65fbcda4d to your computer and use it in GitHub Desktop.
Example to show how to plot histogram with accumulate ratio. Plot multiple histograms using seaborn.FacetGrid().
"""Example to show how to plot histogram with accumulate ratio.
Plot multiple histogram using seaborn.FacetGrid()
"""
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
% matplotlib inline
sns.set(style="darkgrid", palette="muted", color_codes=True)
# Genarate toy data
np.random.seed(0)
size = 200
x1 = np.random.normal(size=size)
group = np.random.choice((0, 1), size=size)
df = pd.DataFrame({'x1': x1, 'group': group})
# Plot multiple histogram using seaborn.FacetGrid()
g = sns.FacetGrid(data=df, col='group', hue='group', size=5)
g = g.map(plt.hist, 'x1', alpha=0.7, label='Frequency')
# Add cumulative ratio to each ax in gridobject
for ax in g.axes.ravel():
# Get patches in ax
patches = ax.patches
# Calc values plot with secondary axis
# Calc x value (position to plot)
bins_part= [patch.get_xy()[0] + patch.get_width() for patch in patches]
bins = [patches[0].get_xy()[0]] + bins_part
x2 = np.convolve(bins, np.ones(2) / 2, mode="same")[1:]
# Calc cumlative ratio
n = [patch.get_height() for patch in patches]
y2 = np.add.accumulate(n) / sum(n)
# Plot secondary value
ax2 = ax.twinx()
lines = ax2.plot(x2, y2, ls='--', marker='o', color='r',
label='Cumulative ratio')
ax2.grid(visible=False)
# Add 1st y label
ax.set_ylabel('Frequency')
# Add 2nd y label
ax2.set_ylabel('Cumulative ratio')
# Add Legend
plt.legend(handles=[patches[0], lines[0]])
plt.savefig('fig_facetgrid.png', dpi=150)
plt.tight_layout()
plt.show()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment