[PYTHON] comportement de matplotlib: histgramme normé

histgramme avec matplotlib

Une note de ce à quoi j'étais accro lors de la création d'un histogramme avec matplotlib

Les écueils de normé

Notez que matplotlib.axes.Axes.hist () ou matplotlib.pyplot.hist (), qui est utilisé pour créer un histogramme avec matplotlib, présente un piège terrifiant. Lors de la création d'un histogramme, on ajoute souvent l'option normed = 1 pour normaliser la fréquence. Cependant, malgré cette option, l'histogramme suivant peut être obtenu.

import numpy as np
import matplotlib.pyplot as plt
np.random.seed(0)
nor = np.random.normal(0,0.5,1000)
plt.hist(nor,normed=1,range=(-3,3),bins=300)
plt.savefig("test.pdf")

c0e82554-a3d9-11f4-b7c0-58dd5fe0b006.png

Eh, la valeur de l'échelle de l'axe y est supérieure à 1. ..

Au début, j'ai pensé que c'était un bug et j'ai essayé de dessiner un histogramme en utilisant barplot. Mais c'est trop de problèmes. Je pensais que c'était une distroplot marine, mais cela n'a pas fonctionné parce que j'avais le même problème. Quand j'ai pensé que c'était un mystère, j'ai réalisé qu'il y en avait un.

import numpy as np
import matplotlib.pyplot as plt
np.random.seed(0)
nor = np.random.normal(0,0.5,1000)
plt.hist(nor,normed=1,range=(-3,3),bins=6)
plt.savefig("test.pdf")

5170b571-cc4a-88b6-b414-dec61b28d729.png

Si la largeur de __bin est 1, cela fonctionne normalement. __ __ En aucune façon __ ,, Comment, __bin est normalisé pour que la surface totale soit de 1. En fait, si vous regardez les détails des données en utilisant la fonction d'histogramme de numpy (le comportement est le même que l'hist de matplotlib)

import numpy as np
np.random.seed(0)
nor = np.random.normal(0,0.5,1000)
hist,pos = np.histogram(nor,normed=1,range=(-3,3),bins=300)
print(np.sum(hist))
#50.0
print(np.sum(hist)*6.0/300)
#1.0

Sera. Par conséquent, vous pouvez réécrire le code comme suit.

import numpy as np
import matplotlib.pyplot as plt
np.random.seed(0)
nor = np.random.normal(0,0.5,1000)
binnum = 300
fig = plt.figure()
ax = plt.subplot(111)
ax.hist(nor,normed=1,range=(-3,3),bins=binnum)
ax_yticklocs = ax.yaxis.get_ticklocs()#Obtenir des informations sur la balance
ax_yticklocs = list(map(lambda x: x * len(range(-3,3))*1.0/binnum, ax_yticklocs))#Multipliez la valeur de graduation d'origine par la largeur du bac
ax.yaxis.set_ticklabels(list(map(lambda x: "%0.2f" % x, ax_yticklocs)))Afficher l'échelle fixe
plt.savefig("test.pdf")

iTerm2.xULA2R.test copy.png

Vous devriez probablement avoir l'échelle que vous voulez. Cependant, cette implémentation est déroutante ...

Recommended Posts

comportement de matplotlib: histgramme normé
Comportement de multiprocessing.pool.Pool.map
histogramme avec matplotlib
Visualisez le comportement de l'algorithme de tri avec matplotlib
[python] comportement d'argmax
Installation de matplotlib (Python 3.3.2)
Affichage japonais de matplotlib, seaborn
Superposition transparente de l'histogramme par Matplotlib
Changer le style de matplotlib
Comportement de la méthode pandas rolling ()
Extrait des paramètres de l'histogramme matplotlib
Installer SciPy et matplotlib (Python)
Ajouter le ratio cumulatif à l'histogramme matplotlib
À propos de la valeur de retour de l'histogramme.
Installation de Python, SciPy, matplotlib (Windows)
Résumé du comportement de conversion de go json
Comportement de python3 par le serveur de Sakura
À propos du comportement de yield_per de SqlAlchemy
Afficher la ligne de division dans l'histogramme matplotlib
À propos de la taille des points dans matplotlib
Comportement exact de diff --ignore-matching-lines = RE
Écrire un histogramme empilé avec matplotlib
Ajustez la largeur du bac de manière nette et précise avec l'histogramme de matplotlib et seaborn