import matplotlib.pyplot as plt
import numpy as np
mu, sigma = 100, 15
x = mu + sigma * np.random.randn(10000)
hist, bins = np.histogram(x, bins=50)
width = 0.7 * (bins[1] - bins[0])
center = (bins[:-1] + bins[1:]) / 2
plt.bar(center, hist, align='center', width=width)
plt.show()
Die objektorientierte Oberfläche ist ebenfalls unkompliziert:
fig, ax = plt.subplots()
ax.bar(center, hist, align='center', width=width)
fig.savefig("1.png")
Wenn Sie benutzerdefinierte (nicht konstante) Bins verwenden, können Sie die Breiten mit berechnen np.diff
, die Breiten an übergeben ax.bar
und ax.set_xticks
die Bin-Kanten beschriften:
import matplotlib.pyplot as plt
import numpy as np
mu, sigma = 100, 15
x = mu + sigma * np.random.randn(10000)
bins = [0, 40, 60, 75, 90, 110, 125, 140, 160, 200]
hist, bins = np.histogram(x, bins=bins)
width = np.diff(bins)
center = (bins[:-1] + bins[1:]) / 2
fig, ax = plt.subplots(figsize=(8,3))
ax.bar(center, hist, align='center', width=width)
ax.set_xticks(bins)
fig.savefig("/tmp/out.png")
plt.show()
plt.bar
'swidth
Parameter kann ein Array-ähnliches Objekt (anstelle eines Skalars) akzeptieren. Sie könnten alsowidth = np.diff(bins)
statt verwendenwidth = 0.7 * (bins[1] - bins[0])
.width
Einstellung selbst legt nur die Breite des Balkens fest, oder? Ich spreche von den Beschriftungen der x-Achse (dh ich möchte, dass die tatsächlichen Bin-Kanten Beschriftungen auf der x-Achse sind). Es sollte ähnlich sein wie esplt.hist
funktioniert.ax.set_xticks
die xlabels festlegen. Ich habe oben ein Beispiel hinzugefügt, um zu zeigen, was ich meine.Wenn Sie keine Balken möchten, können Sie dies folgendermaßen darstellen:
quelle
ax.step
.Ich weiß, dass dies Ihre Frage nicht beantwortet, aber ich lande immer auf dieser Seite, wenn ich nach der Matplotlib-Lösung für Histogramme suche, weil das Einfache
histogram_demo
von der Matplotlib-Beispielgalerieseite entfernt wurde.Hier ist eine Lösung, die nicht
numpy
importiert werden muss. Ich importiere nur numpy, um diex
zu zeichnenden Daten zu generieren . Es basiert auf der Funktionhist
anstelle der Funktionbar
wie in der Antwort von @unutbu.Schauen Sie sich auch die Matplotlib-Galerie und die Matplotlib-Beispiele an .
quelle
Wenn Sie bereit sind zu verwenden
pandas
:quelle
pandas
, sollten Sie wahrscheinlich einen Link zu ihrer Website und ein ausführlicheres Beispiel einfügen, das erklärt, was los ist.Ich denke, das könnte für jemanden nützlich sein.
Die Histogrammfunktion von Numpy gibt zu meinem Ärger (obwohl ich zu schätzen weiß, dass es einen guten Grund dafür gibt) eher die Ränder jedes Fachs als den Wert des Fachs zurück. Dies ist zwar sinnvoll für Gleitkommazahlen, die innerhalb eines Intervalls liegen können (dh der Mittelwert ist nicht besonders aussagekräftig), dies ist jedoch nicht die gewünschte Ausgabe, wenn es sich um diskrete Werte oder Ganzzahlen (0, 1, 2 usw.) handelt. . Insbesondere ist die Länge der vom np.histogram zurückgegebenen Bins nicht gleich der Länge der Zählungen / Dichte.
Um dies zu umgehen, habe ich np.digitize verwendet, um die Eingabe zu quantisieren und eine diskrete Anzahl von Bins zusammen mit einem Bruchteil der Zählwerte für jeden Bin zurückzugeben. Sie können leicht bearbeiten, um die ganzzahlige Anzahl von Zählungen zu erhalten.
Refs:
[1] https://docs.scipy.org/doc/numpy/reference/generated/numpy.histogram.html
[2] https://docs.scipy.org/doc/numpy/reference/generated/numpy.digitize.html
quelle