Ich habe also ein kleines Problem. Ich habe einen Datensatz in scipy, der bereits im Histogrammformat vorliegt, also habe ich die Mitte der Bins und die Anzahl der Ereignisse pro Bin. Wie kann ich das jetzt als Histogramm darstellen. Ich habe versucht, nur zu tun
bins, n=hist()
aber das gefiel ihm nicht. Irgendwelche Empfehlungen?
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 auch einfach:
fig, ax = plt.subplots()
ax.bar(center, hist, align='center', width=width)
fig.savefig("1.png")
Wenn Sie benutzerdefinierte (nicht konstante) Behälter verwenden, können Sie die Breiten mit np.diff
Berechnen, die Breiten an ax.bar
Übergeben und die Behälterkanten mit ax.set_xticks
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()
Wenn Sie keine Balken möchten, können Sie dies folgendermaßen darstellen:
import numpy as np
import matplotlib.pyplot as plt
mu, sigma = 100, 15
x = mu + sigma * np.random.randn(10000)
bins, edges = np.histogram(x, 50, normed=1)
left,right = edges[:-1],edges[1:]
X = np.array([left,right]).T.flatten()
Y = np.array([bins,bins]).T.flatten()
plt.plot(X,Y)
plt.show()
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
wurde von der matplotlib-Beispielgalerieseite entfernt.
Hier ist eine Lösung, bei der numpy
nicht importiert werden muss. Ich importiere nur numpy, um die zu zeichnenden Daten x
zu erzeugen. Es basiert auf der Funktion hist
anstelle der Funktion bar
wie in answer von @unutbu.
import numpy as np
mu, sigma = 100, 15
x = mu + sigma * np.random.randn(10000)
import matplotlib.pyplot as plt
plt.hist(x, bins=50)
plt.savefig('hist.png')
Schauen Sie sich auch die Matplotlib-Galerie und Matplotlib-Beispiele an.
Wenn Sie bereit sind, pandas
zu verwenden:
pandas.DataFrame({'x':hist[1][1:],'y':hist[0]}).plot(x='x',kind='bar')
Ich denke, das könnte für jemanden nützlich sein.
Die Histogrammfunktion von Numpy gibt zu meinem Ärger (obwohl ich es zu schätzen weiß, dass es einen guten Grund dafür gibt) die Kanten jedes Fachs zurück und nicht den Wert des Fachs. Dies ist zwar sinnvoll für Gleitkommazahlen, die innerhalb eines Intervalls liegen können (dh der Mittenwert ist nicht überaus aussagekräftig), dies ist jedoch nicht die gewünschte Ausgabe, wenn es sich um diskrete Werte oder ganze Zahlen (0, 1, 2 usw.) handelt. . Insbesondere ist die Länge der von np.histogram zurückgegebenen Fächer 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 sowie einen Bruchteil der Anzahl für jedes Bin zurückzugeben. Sie können leicht bearbeiten, um die ganzzahlige Anzahl der Zählungen zu erhalten.
def compute_PMF(data)
import numpy as np
from collections import Counter
_, bins = np.histogram(data, bins='auto', range=(data.min(), data.max()), density=False)
h = Counter(np.digitize(data,bins) - 1)
weights = np.asarray(list(h.values()))
weights = weights / weights.sum()
values = np.asarray(list(h.keys()))
return weights, values
####
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