Une note de ce à quoi j'étais accro lors de la création d'un histogramme avec matplotlib
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")
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")
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")
Vous devriez probablement avoir l'échelle que vous voulez. Cependant, cette implémentation est déroutante ...
Recommended Posts