2013-06-27 14 views
6

Ben histogramlar oluşturmak için matplotlib.pyplot kullanıyorum. Aslında bu histogramların grafikleriyle ilgilenmiyorum, ancak frekanslar ve kutularla ilgileniyorum (bunu yapmak için kendi kodumu yazabileceğimi biliyorum, ancak bu paketi kullanmayı tercih ederim). Ben aşağıdakileri yapabilirsiniz biliyorumHistogramı çizmeden matplotlib.pyplot ile histogram oluşturmanın herhangi bir yolu var mı?

,

import numpy as np 
import matplotlib.pyplot as plt 

x1 = np.random.normal(1.5,1.0) 
x2 = np.random.normal(0,1.0) 

freq, bins, patches = plt.hist([x1,x1],50,histtype='step') 

bir histogram oluşturmak için. Tek ihtiyacım freq[0], freq[1] ve bins[0] olduğunu. Ben denemek ve kullanırken sorun işlevinde,

freq, bins, patches = plt.hist([x1,x1],50,histtype='step') 

oluşur. Örneğin,

def func(x, y, Nbins): 
    freq, bins, patches = plt.hist([x,y],Nbins,histtype='step') # create histogram 

    bincenters = 0.5*(bins[1:] + bins[:-1]) # center bins 

    xf= [float(i) for i in freq[0]] # convert integers to float 
    xf = [float(i) for i in freq[1]] 

    p = [ (bincenters[j], (1.0/(xf[j] + yf[j])) for j in range(Nbins) if (xf[j] + yf[j]) != 0] 

    Xt = [j for i,j in p] # separate pairs formed in p 
    Yt = [i for i,j in p] 

    Y = np.array(Yt) # convert to arrays for later fitting 
    X = np.array(Xt) 

    return X, Y # return arrays X and Y 

Ben func(x1,x2,Nbins) ve arsa veya baskı X ve Y aradığınızda, benim beklenen eğri/değerleri alamadım. Parçamda bir kısmi histogram olduğundan, plt.hist ile ilgili bir şey olduğundan şüpheleniyorum.

+5

Neden np.histogram kullanmayın()? – Pablo

+0

Öneriniz için teşekkürler. Sorunun başka yerde olduğu anlaşılıyor. Yukarıdaki kod satırını satır olarak çalıştırırsam (işlev olarak değil) hem np.histogram() hem de plt.hist() ile çalışır. Bunu bir işlevde kullanmayla ilgili herhangi bir fikir çalışmıyor mu? – user1175720

cevap

3

Ben çok iyi sorunuzu anlama ediyorsam bilmiyorum, ama burada, siz (1D veya 2D) çok basit bir ev yapımı histogram örneği var, her bir işlev içinde bir ve düzgün olarak adlandırılan : elbette

import numpy as np 
import matplotlib.pyplot as plt 

def func2d(x, y, nbins): 
    histo, xedges, yedges = np.histogram2d(x,y,nbins) 
    plt.plot(x,y,'wo',alpha=0.3) 
    plt.imshow(histo.T, 
       extent=[xedges.min(),xedges.max(),yedges.min(),yedges.max()], 
       origin='lower', 
       interpolation='nearest', 
       cmap=plt.cm.hot) 
    plt.show() 

def func1d(x, nbins): 
    histo, bin_edges = np.histogram(x,nbins) 
    bin_center = 0.5*(bin_edges[1:] + bin_edges[:-1]) 
    plt.step(bin_center,histo,where='mid') 
    plt.show() 

x = np.random.normal(1.5,1.0, (1000,1000)) 

func1d(x[0],40) 
func2d(x[0],x[1],40) 

, verilerin merkezleme doğru olup olmadığını kontrol edebilir, ama örnek bu konu hakkında bazı faydalı şeyler gösteriyor diye düşünüyorum.

Benim öneri: Kodunuzdaki herhangi döngü önlemek için deneyin! Performansı öldürüyorlar. Eğer bakarsan, benim örneğimde ilmekler yok. Python ile sayısal problemlerde en iyi uygulama döngülerden kaçınıyor! Numpy, tüm sabit döngü işlerini yapan çok sayıda C-uygulamalı işleve sahiptir.

0

sayılı

Ama pyplot atlayabilir:

import matplotlib.pyplot 

fig = matplotlib.figure.Figure() 
ax = matplotlib.axes.Axes(fig, (0,0,0,0)) 
numeric_results = ax.hist(data) 
del ax, fig 

Aktif eksenlerini ve rakamları etkilemez, yüzden bile başka bir şey komplo ortasında kullanmanızda bir sorun olacağını . Küresel bir değişkendir - plt.draw_something() herhangi kullanımı geçerli ekseninde arsa koyacağız çünkü

budur.

İlgili konular