web-dev-qa-db-fra.com

Existe-t-il un paramètre dans matplotlib / pandas pour avoir l'axe Y d'un histogramme en pourcentage?

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

43
d1337

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()')

enter image description here

Btw: étrange problème de tracé au premier bac du tracé de gauche.

53
Rutger Kassies

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)
14
rshield

On dirait @ CarstenKönig trouvé dans le bon sens :

df.hist(bins=20, weights=np.ones_like(df[df.columns[0]]) * 100. / len(df))
12
hobs

Vous pouvez simplifier la pondération en utilisant np.ones_like ():

df["ColumnName"].plot.hist(weights = np.ones_like(df.index) / len(df.index))
  • np.ones_like () est d'accord avec la structure df.index
  • len (df.index) est plus rapide pour les gros DataFrames
4