102 votes

Comment puis-je tracer un histogramme de sorte que la somme des hauteurs des barres soit égale à 1 en matplotlib ?

J'aimerais tracer un histogramme normalisé à partir d'un vecteur en utilisant matplotlib. J'ai essayé ce qui suit :

plt.hist(myarray, normed=True)

ainsi que :

plt.hist(myarray, normed=1)

mais aucune des deux options ne produit un axe y de [0, 1] tel que la somme des hauteurs des barres de l'histogramme soit égale à 1. J'aimerais produire un tel histogramme - comment puis-je le faire ?

7 votes

Je sais que c'est vieux, mais pour référence future & toute personne qui visite cette page, ce type d'axe est appelé un axe de "densité de probabilité" !

2voto

user1021819 Points 372

Depuis matplotlib 3.0.2, normed=True est déprécié. Pour obtenir le résultat souhaité, j'ai dû faire :

import numpy as np
data=np.random.randn(1000)
bins=np.arange(-3.0,3.0,51)
counts, _ = np.histogram(data,bins=bins)
if density: # equivalent of normed=True
    counts_weighter=counts.sum()
else: # equivalent of normed=False
    counts_weighter=1.0
plt.hist(bins[:-1],bins=bins,weights=counts/counts_weighter)

Essayer de spécifier weights y density simultanément comme arguments à plt.hist() n'a pas fonctionné pour moi. Si quelqu'un connaît un moyen de le faire fonctionner sans avoir accès à l'argument du mot-clé normalisé, veuillez me le faire savoir dans les commentaires et je supprimerai/modifierai cette réponse.

Si vous voulez des centres de poubelles, ne les utilisez pas. bins[:-1] qui sont les bords du bac - vous devez choisir un schéma approprié pour calculer les centres (qui peuvent ou non être dérivés de manière triviale).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X