2011-01-27 23 views
6

Ho dati generati in una simulazione. Il file di dati generato simile a questa:Tracciare le frecce con gnuplot

1990/01/01 99 
1990/01/02 92.7 
1990/01/03 100.3 
1990/01/04 44.2 
1990/01/05 71.23 
... 
2100/01/01 98.25 

posso creare un grafico (banalmente), semplicemente eseguendo il comando (lungo di versione):

plot "simulation.dat" using 1:2 with line 

voglio aggiungere una terza colonna, che aggiungerà informazioni sulla freccia. La codifica per la terza colonna sarà il seguente:

  • 0 => nessuna freccia da trarre per quel valore x asse
  • 1 => una freccia rivolta verso l'alto per essere conservata per il valore x asse
  • 2 => una freccia verso il basso per trarre per il valore dell'asse x

sto solo cominciando a imparare gnuplot, e apprezzeranno aiuto come posso usare gnuplot per creare le frecce sulla prima trama?

+0

Ciao, penso di aver risolto la mia domanda gnuplot (almeno su linux) Ho aggiornato la mia risposta. – Tom

risposta

3

Non penso che ci sia un modo automatico per creare tutte le frecce allo stesso tempo in base alla terza colonna. Si dovrà eseguire la seguente per ogni freccia che si desidera:

set arrow xval1,yval1 to xval2,yval2 

È inoltre possibile utilizzare le frecce relativi

set arrow xval1,yval1 rto 1,0 

Questo disegnerà una freccia orizzontale da xval1, yval1 a (xval1 + 1) , yval1

ci sono plenty of options associated with the set arrow command:

3

Se non si desidera che la punta della freccia allora si potrebbe provare lo stile di impulsi (con impulsi piuttosto che con le linee) (Se vuoi ancora le linee in alto, puoi tracciare due volte).

Se si desidera realmente le punte delle frecce, quanto segue potrebbe essere utile: Utilizza un ciclo for (o tipi) per aggiungere frecce verticali a un grafico.

Gnuplot script, for loop within or adding to existing plot

In particolare:

creare un simloop.gp file che è simile il seguente:

count = count+1 
#save the count to count.gp 
system 'echo '.count.' > count.gp' 
#load the simloop shell 
system "./simloop.sh" 

#draw the arrow 
load 'draw_arrow.gp' 

if(count<max) reread 

quindi creare un file di simloop.sh che assomiglia in modo

#!/bin/bash 

#read the count 
count=$(awk -F, '{print $1}' count.gp) 
#read the file 
xcoord=$(awk -v count=$count -F, 'BEGIN{FS=" ";}{ if(NR==count) print $1}' simulation.dat) 
ycoord=$(awk -v count=$count -F, 'BEGIN{FS=" "}{ if(NR==count) print $2}' simulation.dat) 
dir=$(awk -v count=$count -F, 'BEGIN{FS=" "}{ if(NR==count) print $3}' simulation.dat) 

#choose the direction of the arrow 
if [ \"$dir\" == \"0\" ]; then 
    echo '' > draw_arrow.gp 
fi 

if [ \"$dir\" == \"1\" ]; then 
    echo 'set arrow from ' $xcoord' ,0 to '$xcoord','$ycoord' head' > draw_arrow.gp 
fi 

if [ \"$dir\" == \"2\" ]; then 
echo 'set arrow from '$xcoord',0 to '$xcoord','$ycoord' backhead' > draw_arrow.gp 
fi 

Quindi creare un file simulation.gp che sembra così mething in questo modo:

count = 0; 
max = 5; 
load "simloop.gp" 
set yrange[0:*] 
plot "simulation.dat" u 1:2 w l 

assicurarsi che il file shell ha i permessi eseguibili (chmod + WRX simloop.sh), caricare gnuplot e digitare

load "./simulation.gp" 

Questo ha funzionato per me con il file di dati

1 99 0 
2 92.7 1 
3 100.3 2 
4 44.2 0 
5 71.23 1 

(Per le prove mi sono liberato del tempo di formattazione dovrebbe essere in grado di mettere indietro senza troppo troppi problemi)

poi ho avuto questo grafico:. enter image description here

che credo è più o meno ciò che si desidera.

+0

Ben fatto, chiamo sempre gnuplot da altro codice, quindi non mi sono reso conto che tali scriptfiles non sono troppo complicati. Tuttavia, penso che se si genera il file di input da soli potrebbe essere più semplice tracciare le frecce contemporaneamente nel codice. Se no questa soluzione è perfetta! – Martin

+0

grazie per l'input. Tuttavia, il tuo approccio è un po 'troppo complicato per me (non mi piacciono le sed e awk troppo bene;) – oompahloompah

1

Anche se la domanda è abbastanza vecchia, ecco la mia risposta.

Si può utilizzare lo stile vectors tracciato, che può utilizzare arrowstyles variabili in base al valore di una colonna:

set style arrow 1 backhead 
set style arrow 2 head 
set yrange[0:*] 
set xdata time 
set timefmt "%Y/%m/%d" 
plot "simulation.dat" using 1:2 with line,\ 
    "" using 1:2:(0):(-$2):($3 == 0 ? 1/0 : $3) with vectors arrowstyle variable 

E 'il valore di una colonna è 1/0, il punto è considerato come indefinito e viene saltato.