Ein Hinweis darauf, wovon ich beim Erstellen eines Histogramms mit matplotlib süchtig war
Beachten Sie, dass matplotlib.axes.Axes.hist () oder matplotlib.pyplot.hist (), mit denen ein Histogramm mit matplotlib erstellt wird, eine schreckliche Gefahr darstellen. Beim Erstellen eines Histogramms fügen wir häufig die Option normiert = 1 hinzu, um die Frequenz zu normalisieren. Trotz dieser Option kann jedoch das folgende Histogramm erhalten werden.
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, der Wert der y-Achsenskala ist größer als 1. ..
Zuerst dachte ich, dies sei ein Fehler und versuchte, mit Barplot ein Histogramm zu zeichnen. Aber es ist zu viel Mühe. Ich dachte, es wäre eine Seegeborene, aber es hat nicht funktioniert, weil ich das gleiche Problem hatte. Als ich dachte, es sei ein Rätsel, wurde mir klar, dass es eines gab.
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")
Wenn die Breite von __bin 1 ist, funktioniert es normal. __ __ Auf keinen Fall __ ,, Wie, __bin wird normalisiert, so dass die Gesamtfläche 1 ist. Wenn Sie sich die Details der Daten mit der Histogrammfunktion von numpy ansehen (das Verhalten ist das gleiche wie das von 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
Wird sein. Daher können Sie den Code wie folgt umschreiben.
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()#Informationen zur Waage abrufen
ax_yticklocs = list(map(lambda x: x * len(range(-3,3))*1.0/binnum, ax_yticklocs))#Multiplizieren Sie den Wert der ursprünglichen Skala mit der Breite des Fachs
ax.yaxis.set_ticklabels(list(map(lambda x: "%0.2f" % x, ax_yticklocs)))Feste Skala anzeigen
plt.savefig("test.pdf")
Sie sollten wahrscheinlich die gewünschte Skala haben. Diese Implementierung ist jedoch verwirrend ...
Recommended Posts