jueves, 3 de enero de 2013

Código en scripts de GnuPlot

Buenos días a todos/as!

A ver, un par de notas que pueden resultar de utilidad cuando queremos usar un mismo script de GnuPlot con distintos ficheros fuente, de forma que obtengamos distintas figuras que provienen de distintos datos y sin embargo son iguales en formato. Añadimos a esto el ahorro de tiempo y la buena imagen que la homogeneidad dá.

A ver, este es nuestro script de trabajo:

#variables iniciales a configurar
fichero='./3c_10.out'
figura='figuras_3d_3c_10_00.png'
titulo="Curva de potencial del sistema H_2(0,0)+H2(0,0)\nGeometria 3 cuerpos"
min=1  #Mostrar o no el valor del minimo
tipo=3   #Tipo: 1=V0, 2=V5, 3=V10

margen=0.8
base=0.7
colorr="black"


#variables iniciales a configurar. Se usarán unas y otras en funcion de una variable previa.
if(tipo==1) xmin=1.5; ymin=0.0; zmin=-4.34379036;
if(tipo==2) xmin=1.4; ymin=0.3; zmin=-4.52947145;
if(tipo==3) xmin=1.7; ymin=0.0; zmin=-4.71167736;


#ajustes de grafica
set style line 1 lt 1 lw 2 linecolor rgb colorr
set style arrow 1 head filled size screen 0.025,30,45 ls 1

set term png size 640,640
set output "a.png"
set xlabel "X"
set ylabel "Y"
#set title titulo
set xrange[:]
set yrange[0:]
set zrange[:2.0]
set xtics -2.5,1,2.5
set ztics -7,2,2
set hidden3d
set cntrparam levels incr -7.5,0.5,2.0
set contour base
unset key
set view 70,110
set ticslevel base


#generacion de figura en fichero temporal para que las variables del gnuplot se actualicen
splot fichero u 7:8:9 w l
set output figura

#ajustes dependientes de variable inicial
if(min==1) set arrow 1 from 0,GPVAL_Y_MAX*margen,2.0 to xmin,ymin,zmin as 1;
if(min==1) base2=GPVAL_Z_MIN-(GPVAL_Z_MAX-GPVAL_Z_MIN)*base;
if(min==1) base3=ymin+GPVAL_Y_MAX/5;
if(min==1) set arrow 2 from xmin,base3,base2*0.8 to xmin,ymin,base2 as 1 front;
if(min==1) set label 1 sprintf("%5.3f,%5.3f,%5.3f",xmin,ymin,zmin) at 0,GPVAL_Y_MAX*margen,2.45 center textcolor rgb colorr


#generacion de grafica final
splot fichero u 7:8:9 w l

set term X11

Como siempre, esto se guarda dentro de un fichero (figuras_3d_3c.plt, por ejemplo), al que llamaremos desde línea de comando de la siguiente forma:

#gnuplot figuras_3d_3c.plt

Antes de ello hemos de configurar las partes comentadas como variables iniciales a donfigurar. En ellas indicaremos el nombre del fichero de entrada, el de la figua de salida, y en este caso valores relacionados con los datos con los que estoy trabajando. Lo importate de ello es que en función de estos valores el comportamiento del script será diferente. Fijaros como las variables iniciadas manualmente luego son llamadas en distintos puntos de script.

Otra cosa interesante de este script es la generación de una figura temporal y el uso de una serie de variables internas del GnuPlot, com són: GPVAL_Z_MIN y demás. A ver, la cosa es que se realiza una representación previa de la figura para que estas variables internas tomen valor (vienen a ser los límites de la figura en sus distintas dimensiones), para luego configurar nuevos elementos de la gráfica en función de dichas variables de forma automáticas. Entoces representamos de nuevo pero esta vez generando la figura buena. Esto nos evita gran cantidad de ajustes manuales que además suelen ser dificiles de hacer de forma homogénea en el caso de muchas figuras.

Más a destacar: el uso de la instrucción sprintf a través de la cual podremos crear una variable string formateada a partir de variables numéricas, que podremos usar como label.  

Los dato para esta figura nos los puedo subir ahora, a ver si me acuerdo de hacerlo más tarde.

El resultado finales el siguente:

Podemos encontrar además otras cosas interesantes, como son las flechas, labels y distintas propiedades de las superficies 3d. Destaco entre ellas la propiedad ticslabel, que separará el plano XY inferiot del resto de l figura, permitiéndonos ver su proyección correctamente. En función de su seperación se configurará automáticamnte la ubicación de la flecha inferior de forma que los señale correctamente sin necesidad de ajustes manuales.

Última nota: Para que la curba en 3d salga como un grid o regilla es preciso que los haya el mismo número de datos en cada línea de cada dimensión es decir, ha de haber siempre n datos Y para cada dato X, si no es así tan solo podremos representar lineas o puntos. Otro punto necesario para que obtengamos dicho grid es que tras cada cambio de vabiable X, dejemos una linea en blanco. Un posible fichero de ejemplo de 3x3 dimensiones, que se representaría correctamente sería el siguiente:

1  1  5.0
1  2  5.1
1  3  2.4

2  1  0.4
2  2  5.1
2  3  0.1

3  1  6.3
3  2  3.1
3  3  2.3

Vamos que tenís que mirar bien el script.

Espero que os sea de utilidad.

=:)




No hay comentarios:

Publicar un comentario