2012-09-05 23 views
6

Sto provando a disegnare parte di un istogramma usando matplotlib.istogrammi normalizzati matplotlib

Invece di disegnare l'intero istogramma che ha molti valori anomali e valori elevati, voglio concentrarmi solo su una piccola parte. L'istogramma originale si presenta così:

hist(data, bins=arange(data.min(), data.max(), 1000), normed=1, cumulative=False) 
plt.ylabel("PDF") 

enter image description here

E dopo la focalizzazione che appare così:

hist(data, bins=arange(0, 121, 1), normed=1, cumulative=False) 
plt.ylabel("PDF") 

enter image description here

Si noti che l'ultimo bidone è allungata e peggiore di tutti i tick Y sono scalati in modo che la somma sia esattamente 1 (quindi i punti fuori dal range corrente non vengono presi in considerazione per tutti)

So che posso ottenere ciò che voglio disegnando l'istogramma sull'intero intervallo possibile e quindi limitando l'asse alla parte a cui sono interessato, ma si perde un sacco di tempo calcolando i raccoglitori che non lo farò usare/vedere comunque.

hist(btsd-40, bins=arange(btsd.min(), btsd.max(), 1), normed=1, cumulative=False) 
axis([0,120,0,0.0025]) 

enter image description here

Esiste un modo semplice e veloce per disegnare proprio la regione mirata, ma ancora ottenere la scala Y corretta?

+0

Come sarebbero i valori normati essere calcolato senza prendere l'intero insieme di dati in considerazione? In generale, i valori dell'istogramma devono essere calcolati in modo che l'integrale della curva sia 1, non semplicemente dividendo per il numero di punti. – chthonicdaemon

+0

In assenza di una funzione che descrive la distribuzione, il meglio che puoi fare è contare il numero di punti e dividere di conseguenza. – cdecker

risposta

5

Per tracciare un sottoinsieme dell'istogramma, non penso che sia possibile calcolare l'intero istogramma.

Hai provato a calcolare l'istogramma con numpy.histogram e quindi a tracciare una regione utilizzando pylab.plot o qualcosa del genere? Cioè

import numpy as np 
import pylab as plt 

data = np.random.normal(size=10000)*10000 

plt.figure(0) 
plt.hist(data, bins=np.arange(data.min(), data.max(), 1000)) 

plt.figure(1) 
hist1 = np.histogram(data, bins=np.arange(data.min(), data.max(), 1000)) 
plt.bar(hist1[1][:-1], hist1[0], width=1000) 

plt.figure(2) 
hist2 = np.histogram(data, bins=np.arange(data.min(), data.max(), 200)) 
mask = (hist2[1][:-1] < 20000) * (hist2[1][:-1] > 0) 
plt.bar(hist2[1][mask], hist2[0][mask], width=200) 

istogramma originale: Original histogram

Istogramma calcolato manualmente: Histogram calculated manually

istogramma calcolato manualmente, ritagliata: Histogram calculated manually, cropped (NB: i valori sono più piccoli perché bidoni sono più stretta)

4

Penso che sia possibile normalizzare i dati utilizzando un determinato peso. (repeat è una funzione numpy).

hist(data, bins=arange(0, 121, 1), weights=repeat(1.0/len(data), len(data)))

Problemi correlati