J'ai écrit ici comment superposer la ligne de rapport cumulatif sur pyplot.hist ()
. Cette fois, je superposerai le rapport cumulatif sur plusieurs histogrammes dessinés en utilisant seaborn.FacetGrid ()
. Ci-dessous le graphique terminé.
Ce que vous faites est le même que ici, mais lorsque vous dessinez un histogramme en utilisant seaborn.FacetGrid ()
ou seaborn.distplot ()
, pyplot.hist ()
ne reçoit pas explicitement les informations de bin et de fréquence comme valeur de retour. Par conséquent, les informations de casier et de fréquence sont extraites de l'objet «ax». Plus précisément, il récupère les informations requises à partir de l'objet patches
contenu dans ʻax`. Le code de base est ci-dessous
"""Superposer la ligne du ratio cumulatif sur l'histogramme 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)
#Génération de données de jouets
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})
# seaborn.FacetGrid()Générez plusieurs histogrammes avec
g = sns.FacetGrid(data=df, col='group', hue='group', size=5)
g = g.map(plt.hist, 'x1', alpha=0.7, label='Frequency')
#Tracez une ligne cumulative pour tous les axes contenus dans FacetGrid
for ax in g.axes.ravel():
#Extraire les patchs
patches = ax.patches
#Calculez la valeur du 2ème axe (x)
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:]
#Calculez la valeur du 2ème axe (y:Accumulation)
n = [patch.get_height() for patch in patches]
y2 = np.add.accumulate(n) / sum(n)
#Graphique du 2ème axe
ax2 = ax.twinx()
ax2.plot(x2, y2, ls='--', marker='o', color='r',
label='Cumulative ratio')
ax2.grid(visible=False)
plt.tight_layout()
plt.show()
Le code complet, y compris la légende, est dans Gist. Veuillez vous rendre sur ici.