Histogram Matplotlib


107

Bu yüzden küçük bir problemim var. Scipy'de zaten histogram biçiminde olan bir veri kümem var, bu nedenle bölmelerin merkezine ve bölme başına olay sayısına sahibim. Şimdi nasıl grafik çizebilirim histogram gibidir. Sadece yapmayı denedim

bins, n=hist()

ama bundan hoşlanmadı. Herhangi bir tavsiye?

Yanıtlar:


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

görüntü açıklamasını buraya girin

Nesne yönelimli arayüz de basittir:

fig, ax = plt.subplots()
ax.bar(center, hist, align='center', width=width)
fig.savefig("1.png")

Özel (sabit olmayan) bölmeler kullanıyorsanız np.diff, genişlikleri hesaplayarak geçirebilir, genişlikleri iletebilir ve bölme kenarlarını etiketlemek için ax.barkullanabilirsiniz ax.set_xticks:

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

görüntü açıklamasını buraya girin


Bölme kenarlarını çubuk grafiğin x eksenine geçirmenin bir yolu var mı?
CMCDragonkai

@CMCDragonkai: plt.bar's widthparametresi dizi benzeri bir nesneyi kabul edebilir (skaler yerine). Yani width = np.diff(bins)yerine kullanabilirsiniz width = 0.7 * (bins[1] - bins[0]).
unutbu

Ancak widthayar kendi başına yalnızca çubuğun genişliğini doğru ayarlıyor mu? X ekseni etiketlerinden bahsediyorum (yani, gerçek bölme kenarlarının x eksenindeki etiketler olduğunu görmek istiyorum). Nasıl plt.histçalıştığına benzer olmalıdır .
CMCDragonkai

2
@CMCDragonkai: xlabels'ı ax.set_xticksayarlamak için kullanabilirsiniz. Ne demek istediğimi göstermek için yukarıya bir örnek ekledim.
unutbu

22

Çubuk istemiyorsanız, bunu şu şekilde çizebilirsiniz:

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


6
Ayrıca kullanabilirsiniz ax.step.
tacaswell

12

Bunun sorunuza cevap vermediğini biliyorum, ancak histogramlara matplotlib çözümünü ararken her zaman bu sayfaya geliyorum, çünkü basit histogram_demomatplotlib örnek galeri sayfasından kaldırıldı.

İşte numpyiçe aktarılması gerekmeyen bir çözüm . Numpy'yi yalnızca xçizilecek verileri oluşturmak için içe aktarıyorum . @Unutbu'nun yanıtında olduğu gibi işlev histyerine işleve dayanır .bar

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

görüntü açıklamasını buraya girin

Ayrıca matplotlib galerisine ve matplotlib örneklerine bakın .


"İşte uyuşukluk gerektirmeyen bir çözüm" - kodun ilk satırı uyuşmuş :)
Martin R.

2
@Martin R. Bu sadece çizilecek verileri oluşturmak içindir. 4-6. Satırlara bakın. Uyuşukluk yok.
tommy.carstensen

6

Kullanmak istiyorsanız pandas:

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

27
Kullanmayı önerecekseniz pandas, muhtemelen sitelerine bir bağlantı ve neler olup bittiğini açıklayan daha kapsamlı bir örnek eklemelisiniz.
tacaswell

0

Sanırım bu birisi için faydalı olabilir.

Numpy'nin histogram işlevi, benim can sıkıntıma (bunun için iyi bir neden olduğunu anlıyorum), bölmenin değeri yerine her bölmenin kenarlarını geri döndürür. Bu, bir aralık içinde yer alabilen kayan nokta sayıları için mantıklı olsa da (yani, merkez değeri süper anlamlı değildir), bu, ayrık değerler veya tam sayılarla (0, 1, 2, vb.) Uğraşırken istenen çıktı değildir. . Özellikle, np.histogramdan dönen bölmelerin uzunluğu sayımların / yoğunluğun uzunluğuna eşit değildir.

Bunu aşmak için, girdiyi nicelemek için np.digitize kullandım ve her bölme için sayımların fraksiyonuyla birlikte ayrı bir bölme sayısı döndürdüm. Tamsayı sayısını elde etmek için kolayca düzenleyebilirsiniz.

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
####

Referanslar:

[1] https://docs.scipy.org/doc/numpy/reference/generated/numpy.histogram.html

[2] https://docs.scipy.org/doc/numpy/reference/generated/numpy.digitize.html

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.