2013-06-27 10 views
6

Sto usando matplotlib.pyplot per creare istogrammi. Non sono interessato alle trame di questi istogrammi, ma sono interessato alle frequenze e ai bin (so che posso scrivere il mio codice per farlo, ma preferirei usare questo pacchetto).Un modo per creare un istogramma con matplotlib.pyplot senza tracciare l'istogramma?

so di poter fare quanto segue,

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

per creare un istogramma. Tutto ciò di cui ho bisogno è freq[0], freq[1] e bins[0]. Il problema si verifica quando provo e uso,

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

in una funzione. Ad esempio,

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 

quando chiamo func(x1,x2,Nbins) e la trama o stampare X e Y, non ottengo la mia curva/valori attesi. Sospetto che abbia a che fare con lo plt.hist, poiché nella mia trama c'è un istogramma parziale.

+5

Perché non si utilizza np.histogram()? – Pablo

+0

Grazie per il suggerimento. Sembra che il problema risieda altrove. Se eseguo il codice sopra indicato riga per riga (non come funzione), funziona sia con np.histogram() che con plt.hist(). Qualche idea sul perché utilizzare questo in una funzione non funziona? – user1175720

risposta

3

Non so se sto capendo la tua domanda molto bene, ma qui, hai un esempio di un istogramma fatto in casa molto semplice (in 1D o 2D), ognuno all'interno di una funzione, e correttamente chiamato :

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) 

Naturalmente, si può controllare se la centratura dei dati è giusto, ma credo che l'esempio mostra alcune cose utili su questo argomento.

La mia raccomandazione: cerca di evitare loop nel tuo codice! Uccidono la performance. Se guardi, nel mio esempio non ci sono loop. La migliore pratica in problemi numerici con Python è evitare loop! Numpy ha molte funzioni implementate da C che fanno tutto il lavoro di hard-looping.

0

No.

Ma si può ignorare la 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 

Non avrà un impatto assi attivi e figure, quindi sarebbe ok per usarlo anche nel mezzo di tramare qualcosa d'altro .

Questo perché qualsiasi utilizzo di plt.draw_something() inserisce il grafico nell'asse corrente, che è una variabile globale.

Problemi correlati