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()
Interfejs zorientowany obiektowo jest również prosty:
fig, ax = plt.subplots()
ax.bar(center, hist, align='center', width=width)
fig.savefig("1.png")
Jeśli używasz niestandardowych (niestałych) pojemników, możesz przekazać obliczenie szerokości za pomocą np.diff
, przekazać szerokości ax.bar
i użyć ax.set_xticks
do oznaczenia krawędzi pojemnika:
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
jestwidth
parametrem może przyjmować szereg-podobnego obiektu (zamiast skalara). Więc możesz użyćwidth = np.diff(bins)
zamiastwidth = 0.7 * (bins[1] - bins[0])
.width
ustawienie ustawia tylko szerokość paska, prawda? Mówię o etykietach na osi X (to znaczy chcę zobaczyć rzeczywiste krawędzie pojemników będące etykietami na osi X). Powinno być podobne do tego, jakplt.hist
działa.ax.set_xticks
do ustawienia xlabels. Dodałem powyżej przykład, aby pokazać, o co mi chodzi.Jeśli nie chcesz słupków, możesz to wykreślić w ten sposób:
źródło
ax.step
.Wiem, że to nie odpowiada na Twoje pytanie, ale zawsze kończę na tej stronie, kiedy szukam rozwiązania matplotlib do histogramów, ponieważ prosty
histogram_demo
został usunięty ze strony galerii przykładów matplotlib.Oto rozwiązanie, które nie wymaga
numpy
importu. Importuję numpy tylko w celu wygenerowania danychx
do wykreślenia. Opiera się na funkcjihist
zamiast funkcji,bar
jak w odpowiedzi @unutbu.Sprawdź także galerię matplotlib i przykłady matplotlib .
źródło
Jeśli chcesz skorzystać z
pandas
:źródło
pandas
, prawdopodobnie powinieneś dołączyć link do ich witryny i bardziej szczegółowy przykład wyjaśniający, co się dzieje.Myślę, że to może być przydatne dla kogoś.
Funkcja histogramu Numpy'ego, ku mojej irytacji (chociaż doceniam, że jest ku temu dobry powód), zwraca raczej krawędzie każdego pojemnika, a nie wartość kosza. Chociaż ma to sens w przypadku liczb zmiennoprzecinkowych, które mogą znajdować się w przedziale (tj. Wartość środkowa nie jest bardzo znacząca), nie jest to pożądane wyjście w przypadku wartości dyskretnych lub liczb całkowitych (0, 1, 2 itd.) . W szczególności długość koszy zwracanych z np. Histogramu nie jest równa długości zliczeń / gęstości.
Aby to obejść, użyłem np.digitize do kwantyzacji danych wejściowych i zwrócenia dyskretnej liczby pojemników wraz z ułamkiem zliczeń dla każdego pojemnika. Możesz łatwo edytować, aby uzyskać całkowitą liczbę zliczeń.
Odniesienia:
[1] https://docs.scipy.org/doc/numpy/reference/generated/numpy.histogram.html
[2] https://docs.scipy.org/doc/numpy/reference/generated/numpy.digitize.html
źródło