2013-09-03 31 views
5

Il mio file di dati ha questo contenutoGnuplot: Come caricare e visualizzare singolo valore numerico da file di dati

# data file for use with gnuplot 
# Report 001 
# Data as of Tuesday 03-Sep-2013 
total 1976 
case1 522 278 146 65 26 7 
case2 120 105 15 0 0 0 
case3 660 288 202 106 63 1 

Sto facendo un istogramma dal caso ... linee utilizzando lo script qui sotto - e che funziona. La mia domanda è: come posso caricare il valore totale complessivo 1976 (accanto alla parola "totale") dal file di dati e (a) memorizzarlo in una variabile o (b) usarlo direttamente nel titolo della trama?

Questo è il mio script gnuplot:

reset 
set term png truecolor 
set terminal pngcairo size 1024,768 enhanced font 'Segoe UI,10' 
set output "output.png" 
set style fill solid 1.00 
set style histogram rowstacked 
set style data histograms 
set xlabel "Case" 
set ylabel "Frequency" 
set boxwidth 0.8 
plot for [i=3:7] 'mydata.dat' every ::1 using i:xticlabels(1) with histogram \ 
notitle, '' every ::1 using 0:2:2 \ 
with labels \ 
title "My Title" 

A beneficio di altri cercando di etichettare istogrammi, nel mio file di dati, la colonna dopo l'etichetta caso rappresenta il totale di tutto il resto dei valori su quella riga . Questi numeri totali sono visualizzati nella parte superiore di ogni barra dell'istogramma. Ad esempio per case1, 522 è il totale di (278 + 146 + 65 + 26 + 7).

Desidero visualizzare il totale generale da qualche parte sul grafico, ad esempio come seconda riga del titolo o in un'etichetta. Posso ottenere una variabile in sprintf nel titolo, ma non ho trovato la sintassi per caricare un valore di "cella" ("cella" che significa intersezione di colonne di righe) in una variabile.

In alternativa, se qualcuno può dirmi come utilizzare la funzione somma per sommare 522 + 120 + 660 (leggere dal file di dati, non come costanti!) E memorizzare quel totale in una variabile, che ovvierebbe al bisogno avere il totale complessivo nel file di dati, e questo mi renderebbe molto felice.

Molte grazie.

risposta

11

Iniziamo con l'estrazione di una singola cella in (riga, colonna). Se si tratta di valori singoli, è possibile utilizzare il comando stats per estrarre i valori. I numeri row e col sono specificati con every e using, come in un comando di stampa. Nel tuo caso, per estrarre il valore totale, uso:

# extract the 'total' cell 
stats 'mydata.dat' every ::::0 using 2 nooutput 
total = int(STATS_min) 

Riassumendo tutti i valori nella seconda colonna, l'uso:

stats 'mydata.dat' every ::1 using 2 nooutput 
total2 = int(STATS_sum) 

E, infine, per riassumere tutti i valori nelle colonne 3:7 in tutte le righe (cioè la stessa come il comando precedente, ma senza utilizzare i totali memorizzati) utilizzano:

# sum all values from columns 3:7 from all rows 
stats 'mydata.dat' every ::1 using (sum[i=3:7] column(i)) nooutput 
total3 = int(STATS_sum) 

Questi comandi richiedono gnuplot 4.6 lavorare.

Quindi, lo script tracciato potrebbe essere simile al seguente:

reset 
set terminal pngcairo size 1024,768 enhanced 
set output "output.png" 
set style fill solid 1.00 
set style histogram rowstacked 
set style data histograms 
set xlabel "Case" 
set ylabel "Frequency" 
set boxwidth 0.8 

# extract the 'total' cell 
stats 'mydata.dat' every ::::0 using 2 nooutput 
total = int(STATS_min) 

plot for [i=3:7] 'mydata.dat' every ::1 using i:xtic(1) notitle, \ 
    '' every ::1 using 0:(s = sum [i=3:7] column(i), s):(sprintf('%d', s)) \ 
    with labels offset 0,1 title sprintf('total %d', total) 

che dà il seguente risultato:

enter image description here

+1

Ah ah !! Meravigliosi esempi di utilizzo del comando stats per caricare valori di cella. – user424855

+2

@Christoph Sempre un piacere leggere i tuoi post relativi a Gnuplot, roba molto utile :) – EverythingRightPlace

+0

Qual è il colon: sintassi? Non capisco cosa si suppone debba fare :::: 0 o :: 1 - qualcuno potrebbe spiegarmelo? – user3728501

1

per Linux e simili.

Se non si conosce il numero di riga in cui si trovano i dati, ma si sa che si trova nella n-esima colonna di una riga in cui il valore della colonna m-esimo è x, è possibile definire una funzione

get_data(m,x,n,filename)=system('awk "\$'.m.'==\"'.x.'\"{print \$'.n.'}" '.filename) 

e quindi utilizzare, per esempio, come

y = get_data(1,"case2",4,"datafile.txt") 

utilizzando i dati forniti da user424855

print y 

dovrebbe restituire 15

+0

Bello. Hai un piccolo refuso, il comando dovrebbe leggere: 'get_data (m, x, n, filename) = system ('awk" \ $'. M. '== \ "'. X. '\" {Print \ $ '.n.'} "'.filename)'. – Christoph

+0

grazie, ora viene corretto, :) – boclodoa