Domanda

Io so come creare un istogramma (basta usare "con le scatole") in gnuplot se il mio file .dat ha già correttamente i dati cestinate. C'è un modo per prendere un elenco di numeri e hanno gnuplot fornire un istogramma in base a intervalli e bin ridimensiona l'utente fornisce?

È stato utile?

Soluzione

Sì, e la sua rapida e semplice anche se molto nascosto:

binwidth=5
bin(x,width)=width*floor(x/width)

plot 'datafile' using (bin($1,binwidth)):(1.0) smooth freq with boxes

controllare help smooth freq capire perché quanto sopra rende un istogramma

affrontare gamme solo impostare la variabile xrange.

Altri suggerimenti

Ho un paio di correzioni / integrazioni risposta molto utile di Born2Smile:

  1. bidoni vuoti causati casella per il bidone adiacente di estendere in modo non corretto nel suo spazio; evitare questo utilizzando set boxwidth binwidth
  2. Nella versione di Born2Smile, bidoni sono resi come centrata sulla loro limite inferiore. Strettamente essi dovrebbero estendersi dal limite inferiore al limite superiore. Questo può essere corretto modificando la funzione bin: bin(x,width)=width*floor(x/width) + width/2.0

essere molto attenti: tutte le risposte in questa pagina sono implicitamente di prendere la decisione di dove inizia la categorizzazione - il bordo sinistro del bidone più a sinistra, se ti piace - dalle mani dell'utente. Se l'utente sta combinando una di queste funzioni per la categorizzazione dei dati con il / la propria decisione su dove inizia binning (come si fa sul blog che è collegato a sopra) le funzioni di cui sopra sono tutti corretti. Con un punto di partenza arbitrario per discretizzazione 'Min', la funzione corretta è:

bin(x) = width*(floor((x-Min)/width)+0.5) + Min

Si può capire perché questo è corretto in modo sequenziale (aiuta a disegnare un paio di bidoni e un punto da qualche parte in uno di essi). Sottrarre min dal vostro punto di dati per vedere quanto lontano nella gamma binning è. Poi dividere per binwidth modo che si sta lavorando in modo efficace in unità di 'bidoni'. Poi 'piano' il risultato di andare verso il bordo sinistro di che bin, aggiungere 0,5 per andare al centro del bidone, moltiplicare per la larghezza in modo che non sei più a lavorare in unità di bidoni, ma in una scala assoluta ancora una volta, poi finalmente aggiungere di nuovo sul minimo di offset si sottratto alla partenza.

Consideriamo questa funzione in azione:

Min = 0.25 # where binning starts
Max = 2.25 # where binning ends
n = 2 # the number of bins
width = (Max-Min)/n # binwidth; evaluates to 1.0
bin(x) = width*(floor((x-Min)/width)+0.5) + Min

es. il valore di 1.1 cade veramente nel bidone sinistra:

  • Questa funzione associa correttamente al centro del bidone sinistra (0,75);
  • La risposta di Born2Smile, bin (x) = larghezza * piano (x / larghezza), le mappe in modo non corretto a 1;
  • La risposta di MAS90, bin (x) = larghezza * piano (x / larghezza) + binwidth / 2.0, le mappe in modo non corretto a 1,5.

La risposta di Born2Smile è corretto solo se i confini bin avvengono a (n + 0.5) * binwidth (dove n viene eseguito su numeri interi). La risposta di MAS90 è corretto solo se i confini bin avvengono a n * binwidth.

Vuoi tracciare un grafico come questo? entrare descrizione dell'immagine qui sì? Poi si può dare un'occhiata al mio articolo del blog: http: //gnuplot-surprising.blogspot.com/2011/09/statistic-analysis-and-histogram.html

le linee principali del codice:

n=100 #number of intervals
max=3. #max value
min=-3. #min value
width=(max-min)/n #interval width
#function used to map a value to the intervals
hist(x,width)=width*floor(x/width)+width/2.0
set boxwidth width*0.9
set style fill solid 0.5 # fill style

#count and plot
plot "data.dat" u (hist($1,width)):(1.0) smooth freq w boxes lc rgb"green" notitle

Come al solito, Gnuplot è uno strumento fantastico per il disegno dolce che osserva i grafici e può essere fatto per eseguire tutti i tipi di calcoli. Tuttavia , è destinato a tracciare i dati piuttosto che a servire come una calcolatrice e spesso è più facile da usare un programma esterno (ad esempio, Octave) per fare più calcoli "complicato", salvare i dati in un File, quindi utilizzare Gnuplot per produrre il grafico. Per il problema di cui sopra, controlla la funzione "Hist" sta usando Octave [freq,bins]=hist(data), poi tracciare questo Gnuplot usando

set style histogram rowstacked gap 0
set style fill solid 0.5 border lt -1
plot "./data.dat" smooth freq with boxes

Ho trovato questo discussione estremamente utile, ma ho sperimentato alcuni problemi "arrotondamento".

Più precisamente, utilizzando una binwidth di 0,05, ho notato che, con le tecniche presentate qui sopra, punti di dati che leggono 0,1 e 0,15 caduta nello stesso bidone. Questo (comportamento, ovviamente indesiderato) è molto probabilmente dovuto alla funzione "piano".

Qui di seguito è il mio piccolo contributo per cercare di aggirare questo.

bin(x,width,n)=x<=n*width? width*(n-1) + 0.5*binwidth:bin(x,width,n+1)
binwidth = 0.05
set boxwidth binwidth
plot "data.dat" u (bin($1,binwidth,1)):(1.0) smooth freq with boxes

Questo metodo ricorsivo è per x> = 0; si potrebbe generalizzare questo con dichiarazioni più condizionali per ottenere qualcosa di ancora più generale.

Non abbiamo bisogno di utilizzare il metodo ricorsivo, può essere lento. La mia soluzione utilizza una funzione Rint instesd definita dall'utente della funzione int o sul pavimento instrinsic.

rint(x)=(x-int(x)>0.9999)?int(x)+1:int(x)

Questa funzione vi darà rint(0.0003/0.0001)=3, mentre int(0.0003/0.0001)=floor(0.0003/0.0001)=2.

Perché? Si prega di guardare funzione e imbottitura Perl int zeri

Ho una piccola modifica per la soluzione di Born2Smile.

Lo so che non ha molto senso, ma si può decidere che per ogni evenienza. Se i dati sono interi e avete bisogno di una dimensione galleggiante bin (forse per il confronto con un altro insieme di dati, o densità trama in griglia più fine), sarà necessario aggiungere un numero casuale compreso tra 0 e 1 pavimento interno. In caso contrario, ci saranno picchi dovuti per arrotondare errore. floor(x/width+0.5) non lo farà perché creerà modello che non è vero per i dati originali.

binwidth=0.3
bin(x,width)=width*floor(x/width+rand(0))

Per quanto riguarda le funzioni di categorizzazione, non mi aspettavo il risultato delle funzioni offerte finora. Vale a dire, se il mio binwidth è 0,001, queste funzioni sono state centrando la bidoni su 0,0005 punti, mentre sento che è più intuitivo di avere i bidoni centrate su 0.001 confini.

In altre parole, mi piacerebbe avere

Bin 0.001 contain data from 0.0005 to 0.0014
Bin 0.002 contain data from 0.0015 to 0.0024
...

La funzione binning mi è venuta è

my_bin(x,width)     = width*(floor(x/width+0.5))

Ecco uno script per confrontare alcune delle funzioni bin offerti a questa:

rint(x) = (x-int(x)>0.9999)?int(x)+1:int(x)
bin(x,width)        = width*rint(x/width) + width/2.0
binc(x,width)       = width*(int(x/width)+0.5)
mitar_bin(x,width)  = width*floor(x/width) + width/2.0
my_bin(x,width)     = width*(floor(x/width+0.5))

binwidth = 0.001

data_list = "-0.1386 -0.1383 -0.1375 -0.0015 -0.0005 0.0005 0.0015 0.1375 0.1383 0.1386"

my_line = sprintf("%7s  %7s  %7s  %7s  %7s","data","bin()","binc()","mitar()","my_bin()")
print my_line
do for [i in data_list] {
    iN = i + 0
    my_line = sprintf("%+.4f  %+.4f  %+.4f  %+.4f  %+.4f",iN,bin(iN,binwidth),binc(iN,binwidth),mitar_bin(iN,binwidth),my_bin(iN,binwidth))
    print my_line
}

ed ecco l'output

   data    bin()   binc()  mitar()  my_bin()
-0.1386  -0.1375  -0.1375  -0.1385  -0.1390
-0.1383  -0.1375  -0.1375  -0.1385  -0.1380
-0.1375  -0.1365  -0.1365  -0.1375  -0.1380
-0.0015  -0.0005  -0.0005  -0.0015  -0.0010
-0.0005  +0.0005  +0.0005  -0.0005  +0.0000
+0.0005  +0.0005  +0.0005  +0.0005  +0.0010
+0.0015  +0.0015  +0.0015  +0.0015  +0.0020
+0.1375  +0.1375  +0.1375  +0.1375  +0.1380
+0.1383  +0.1385  +0.1385  +0.1385  +0.1380
+0.1386  +0.1385  +0.1385  +0.1385  +0.1390
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top