2013-06-27 9 views
6

私は、matplotlib.pyplotを使ってヒストグラムを作成しています。私は実際にこれらのヒストグラムのプロットに興味はありませんが、周波数とビンに興味があります(私はこれを行うための独自のコードを書くことができますが、このパッケージを使用することを好むでしょう)。ヒストグラムをプロットせずにmatplotlib.pyplotでヒストグラムを作成する方法はありますか?

私は、ヒストグラムを作成するために、

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

を以下のことを行うことができます知っています。私が必要とするのは​​,freq[1]bins[0]です。試してみると問題が発生しますが、機能には

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

があります。例えば、

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 

私はfunc(x1,x2,Nbins)、プロットまたは印刷XYを呼んで、私は私の予想される曲線/値を得ることはありません。私はプロットに部分的なヒストグラムがあるので、plt.histと何か関係があります。

+5

なぜnp.histogram()を使用しないのですか? – Pablo

+0

提案していただきありがとうございます。それはどこに問題があるかのように見えます。上記のコードを(関数ではなく)行ごとに実行すると、np.histogram()とplt.hist()の両方で動作します。関数でこれを使用する理由についてのアイデアはうまくいきませんか? – user1175720

答えて

3

私はあなたの質問を非常によく理解しているかどうかはわかりませんが、ここでは、(1Dまたは2Dの)非常に単純な自家製のヒストグラムの例があります。 :もちろん

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) 

、データのセンタリングが右である場合はチェックして、私は例がこのトピックに関するいくつかの有用なものを示していると思います。

私の推奨:あなたのコードにループは避けてください!彼らはパフォーマンスを殺す。あなたが見るなら、私の例ではループはありません。 Pythonの数値問題のベストプラクティスは、ループを避けることです! Numpyには、すべてのハードループ処理を行うC実装の関数がたくさんあります。

0

しかし、あなたはpyplotをバイパスすることができます

import matplotlib.pyplot 

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

それも何かをプロットの真ん中にそれを使用しても大丈夫だろうので、それは、アクティブな軸と数字に影響を与えません。 。

これは、plt.draw_something()を使用すると、グローバル変数である現在の軸にプロットが配置されるためです。

関連する問題