Je voudrais comparer deux histogrammes en faisant en sorte que l'axe Y montre le pourcentage de chaque colonne de la taille globale du jeu de données au lieu d'une valeur absolue. Est-ce possible? J'utilise Pandas et matplotlib. Merci
density=True
(normed=True
Pour matplotlib < 2.2.0
) Renvoie un histogramme pour lequel np.sum(pdf * np.diff(bins))
est égal à 1. Si vous voulez que la somme de l'histogramme à 1, vous pouvez utiliser l'histogramme de Numpy () et normaliser vous-même les résultats.
x = np.random.randn(30)
fig, ax = plt.subplots(1,2, figsize=(10,4))
ax[0].hist(x, density=True, color='grey')
hist, bins = np.histogram(x)
ax[1].bar(bins[:-1], hist.astype(np.float32) / hist.sum(), width=(bins[1]-bins[0]), color='grey')
ax[0].set_title('normed=True')
ax[1].set_title('hist = hist / hist.sum()')
Btw: étrange problème de tracé au premier bac du tracé de gauche.
Le traçage des pandas peut accepter tout argument de mot clé supplémentaire provenant de la fonction matplotlib respective. Donc, pour être complet à partir des commentaires des autres ici, voici comment procéder:
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(100,2), columns=list('AB'))
df.hist(density=1)
En outre, pour une comparaison directe, cela peut également être un bon moyen:
df.plot(kind='hist', density=1, bins=20, stacked=False, alpha=.5)
On dirait @ CarstenKönig trouvé dans le bon sens :
df.hist(bins=20, weights=np.ones_like(df[df.columns[0]]) * 100. / len(df))
Vous pouvez simplifier la pondération en utilisant np.ones_like ():
df["ColumnName"].plot.hist(weights = np.ones_like(df.index) / len(df.index))