wake-up-neo.net

Histogramm Matplotlib

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?

101
madtowneast
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()

enter image description here

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()

enter image description here

227
unutbu

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()

histogram

20
Matthias123

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')

enter image description here

Schauen Sie sich auch die Matplotlib-Galerie und Matplotlib-Beispiele an.

12

Wenn Sie bereit sind, pandas zu verwenden:

pandas.DataFrame({'x':hist[1][1:],'y':hist[0]}).plot(x='x',kind='bar')
6
Michael Malak

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

0
sirgogo