2012-06-26 16 views
9

OSX v10.6.8 e Gnuplot v4.4gnuplot memorizza un numero dal file di dati nella variabile

Ho un file di dati con 8 colonne. Vorrei prendere il primo valore dalla sesta colonna e renderlo il titolo. Ecco quello che ho finora:

#m1 m2 q taua taue K avgPeriodRatio time 
#1 2 3 4 5 6  7  8 

K = #read in data here 
graph(n) = sprintf("K=%.2e",n) 
set term aqua enhanced font "Times-Roman,18" 

plot file using 1:3 title graph(K) 

Ed ecco quali sono le prime righe del mio file di dati appare come:

1.00e-07 1.00e-07 1.00e+00 1.00e+05 1.00e+04 1.00e+01 1.310 12070.00 
1.11e-06 1.00e-07 9.02e-02 1.00e+05 1.00e+04 1.00e+01 1.310 12070.00 
2.12e-06 1.00e-07 4.72e-02 1.00e+05 1.00e+04 1.00e+01 1.310 12070.00 
3.13e-06 1.00e-07 3.20e-02 1.00e+05 1.00e+04 1.00e+01 1.310 12090.00 

Non so come leggere correttamente i dati, o se questo è anche il modo giusto per farlo.

EDIT # 1

Ok, grazie a mgilson ora ho

#m1 m2 q taua taue K avgPeriodRatio time 
#1 2 3 4 5 6  7  8 

set term aqua enhanced font "Times-Roman,18" 
K = "`head -1 datafile | awk '{print $6}'`" 
print K+0 
graph(n) = sprintf("K=%.2e",n) 

plot file using 1:3 title graph(K) 

ma ottengo l'errore: stringa non numerica trovato in cui era previsto un'espressione numerica

EDIT # 2

file = "testPlot.txt" 
K = "`head -1 file | awk '{print $6}'`" 
K=K+0 #Cast K to a floating point number #this is line 9 
graph(n) = sprintf("K=%.2e",n) 
plot file using 1:3 title graph(K) 

Questo dà l'errore -> testa: file: No such file or directory "testPlot.gnu", linea 9: stringa non numerica trovato in cui un'espressione numerica si aspettava

risposta

11

Hai alcune opzioni .. .

prima opzione:

uso columnheader

plot file using 1:3 title columnheader(6) 

non ho testato, ma questo può prevenire la prima fila da essere effettivamente tracciato.

seconda opzione:

usare un'utility esterna per ottenere il titolo:

TITLE="`head -1 datafile | awk '{print $6}'`" 
plot 'datafile' using 1:3 title TITLE 

Se la variabile è numerica, e si desidera riformattare, in gnuplot, si può lanciare stringhe un tipo numerico (intero/virgola mobile) con l'aggiunta di 0 (es.).

print "36.5"+0 

Poi si può formattare con sprintf o gprintf come si sta già facendo.

È strano che non ci sia la funzione float. (int funzionerà se si desidera eseguire il cast su un numero intero).

EDIT

Lo script di seguito ha lavorato per me (quando ho incollato i dati di esempio in un file chiamato "file di dati"):

K = "`head -1 datafile | awk '{print $6}'`" 
K=K+0 #Cast K to a floating point number 
graph(n) = sprintf("K=%.2e",n) 
plot "datafile" using 1:3 title graph(K) 

EDIT 2 (indirizzi commenti qui sotto)

Per espandere una variabile nei backtics, avrete bisogno di macro:

set macro 
file="mydatafile.txt" 
#THE ORDER OF QUOTES (' and ") IS CRUCIAL HERE. 
cmd='"`head -1 ' . file . ' | awk ''{print $6}''`"' 
# . is string concatenation. (this string has 3 pieces) 
# to get a single quote inside a single quoted string 
# you need to double. e.g. 'a''b' yields the string a'b 
[email protected] 

Per rispondere alla domanda 2, è una buona idea familiarizzare con le utilità della shell: sed e awk possono farlo entrambe. Mostrerò una combinazione di testa/coda:

cmd='"`head -2 ' . file . ' | tail -1 | awk ''{print $6}''`"' 

dovrebbe funzionare.

EDIT 3

di recente ho appreso che in gnuplot, system è una funzione così come un comando. Per fare quanto sopra senza tutto il backtic gymnastics,

data=system("head -1 " . file . " | awk '{print $6}'") 

Wow, molto meglio.

+0

Grazie mille! Ho provato il metodo columnheader ma come hai detto non impedisce la prima riga di tracciare.Ora sto lavorando al secondo metodo che hai menzionato e penso di riuscire a farlo funzionare, ma penso di essere confuso su come eseguire il cast della stringa su un tipo numerico. Ho aggiunto sopra quello che ho cambiato. – whatsherface

+0

@whatsherface - Stai usando un double-quote '' 'dove dovresti usare un backtic (che si trova nello stesso pulsante di ~ su una tastiera americana) – mgilson

+0

E su un'ulteriore ispezione - ho notato che mi mancava il mio doppie virgolette ... – mgilson

4

Questa è una domanda molto vecchio, ma qui è un bel modo per ottenere l'accesso a un singolo valore in qualsiasi file di dati e salvarlo come una variabile gnuplot accessibile:

set term unknown #This terminal will not attempt to plot anything 
plot 'myfile.dat' index 0 every 1:1:0:0:0:0 u (var=$1):1 

Il numero index consente per indirizzare un set di dati particolare (separato da due ritorni a capo), mentre every consente di specificare una riga specifica.

I numeri separati da due punti dopo every dovrebbero essere di forma 1:1:<line_number>:<block_number>:<line_number>:<block_number>, dove il numero di riga è la riga con il blocco (partendo da 0), e il numero di blocco è il numero del blocco (separati da un singolo ritorno a capo, sempre a partire da 0). Il primo e il secondo numero dicono di tracciare ogni 1 riga e ogni blocco di dati e il terzo e il quarto dicono iniziano dalla riga <line_number> e dal blocco <block_number>. Il quinto e il sesto dicono dove fermarsi. Ciò consente di selezionare una singola riga in qualsiasi punto del file di dati.

L'ultima parte del comando plot assegna il valore in una colonna specifica (in questo caso, colonna 1) alla variabile (var). Devono esserci due valori per un comando plot, quindi ho scelto la colonna 1 per tracciare la mia dichiarazione di assegnazione delle variabili.

2

Ecco una soluzione meno "awk" che assegna il valore dalla prima riga e dalla sesta colonna del file "Data.txt" alla variabile x16.

set table 
# Syntax: u 0:($0==RowIndex?(VariableName=$ColumnIndex):$ColumnIndex) 
# RowIndex starts with 0, ColumnIndex starts with 1 
# 'u' is an abbreviation for the 'using' modifier 
plot 'Data.txt' u 0:($0==0?(x16=$6):$6) 
unset table 

Un esempio più generale per la memorizzazione di diversi valori è il seguente:

# Load data from file to variable 
# Gnuplot can only access the data via the "plot" command 
set table 
# Syntax: u 0:($0==RowIndex?(VariableName=$ColumnIndex):$ColumnIndex) 
# RowIndex starts with 0, ColumnIndex starts with 1 
# 'u' is an abbreviation for the 'using' modifier 
# Example: Assign all values according to: xij = Data33[i,j]; i,j = 1,2,3 
plot 'Data33.txt' u 0:($0==0?(x11=$1):$1),\ 
       '' u 0:($0==0?(x12=$2):$2),\ 
       '' u 0:($0==0?(x13=$3):$3),\ 
       '' u 0:($0==1?(x21=$1):$1),\ 
       '' u 0:($0==1?(x22=$2):$2),\ 
       '' u 0:($0==1?(x23=$3):$3),\ 
       '' u 0:($0==2?(x31=$1):$1),\ 
       '' u 0:($0==2?(x32=$2):$2),\ 
       '' u 0:($0==2?(x33=$3):$3) 
unset table 
print x11, x12, x13  # Data from first row 
print x21, x22, x23  # Data from second row 
print x31, x32, x33  # Data from third row 
Problemi correlati