2011-01-27 22 views
6

Tengo datos generados en una simulación. El fichero de datos generado es como la siguiente:Trazado de flechas 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 

puedo crear un gráfico (trivial), por la simple emisión de la orden (a largo versionado):

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

Quiero añadir una tercera columna que agregará información de flecha. La codificación para la tercera columna sería como sigue:

  • 0 => ninguna flecha que se puede extraer para ese valor x eje
  • 1 => una flecha apuntando hacia arriba que se puede extraer para el valor x eje
  • 2 => una flecha hacia abajo que se establecerá para el valor del eje x

yo sólo estoy empezando a aprender gnuplot, y apreciarán ayuda en la forma en que puedo utilizar gnuplot para crear las flechas de la primera trama?

+0

Hola, creo que tengo tu pregunta de gnuplot funcionando (al menos en Linux) actualicé mi respuesta. – Tom

Respuesta

3

No creo que haya una manera automática de crear todas las flechas al mismo tiempo basadas en la tercera columna. Tendrá que ejecutar lo siguiente para cada flecha que desea:

set arrow xval1,yval1 to xval2,yval2 

También puede utilizar las flechas relativas

set arrow xval1,yval1 rto 1,0 

Para ello se utilizará una flecha horizontal de xval1, yval1 a (xval1 + 1) , yval1

Hay plenty of options associated with the set arrow command:

3

Si no desea que la punta de la flecha entonces es posible probar el estilo de impulsos (con impulsos en lugar de con las líneas) (Si aún desea las líneas en la parte superior, puede trazar dos veces).

Si realmente desea las puntas de flecha, puede ser útil lo siguiente: Utiliza un ciclo for (o géneros) para agregar flechas verticales a un trazado.

Gnuplot script, for loop within or adding to existing plot

Específicamente:

crear un simloop.gp archivo que se parece a lo siguiente:

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 

A continuación, cree un archivo simloop.sh que se ve algo así como

#!/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 

Luego crea un archivo simulation.gp que se vea tan Mething como lo siguiente:

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

Asegúrese de que el archivo de shell tenga permisos ejecutables (chmod + wrx simloop.sh), cargar hasta gnuplot y escriba

load "./simulation.gp" 

Esto funcionó para mí con el archivo de datos

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

(Para las pruebas que se deshizo de las veces de formato que debe ser capaz de poner de nuevo sin demasiado mucha molestia)

Entonces tuve este gráfico:. enter image description here

que creo que es más o menos lo que quiere.

+0

Bien hecho, siempre llamo a gnuplot desde otro código, así que no me di cuenta de que tales archivos de comandos no son demasiado complicados. Sin embargo, creo que si genera el archivo de entrada usted mismo podría ser más fácil trazar las flechas al mismo tiempo en su código. Si no, esta solución es perfecta! – Martin

+0

gracias por la entrada. Sin embargo, su enfoque es un poco demasiado complicado para mí (no entiendo sed y awk demasiado bien;) – oompahloompah

1

Aunque la pregunta es bastante antigua, esta es mi respuesta.

Uno puede usar el estilo vectors trazado, que se puede utilizar arrowstyles variables basados ​​en el valor de una columna:

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 

Es el valor de una columna es 1/0, el punto es considerado como indefinido y se salta.