2013-06-27 4 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[0], 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) 

, 데이터의 중심이 맞다면 당신은 확인할 수 있지만, 나는 예는이 주제에 대한 몇 가지 유용한 것들을 보여주고 있다고 생각합니다.

내 권장 사항 : 코드에 반복되지 않도록하십시오! 그들은 성과를 죽인다. 보시다시피, 제 예제에서는 루프가 없습니다. 파이썬의 수치적인 문제에 대한 최선의 관행은 회피를 피하는 것입니다! 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()을 사용하면 모든 축이 현재 축 (글로벌 변수)에 배치되기 때문입니다.

관련 문제