GNUplot Básico
Qué es gnuplot
GNUPlot es una herramienta GNU que nos permitirá dibujar fácilmente gráficas con datos numéricos obtenidos en programas externos.
Si ejecutamos gnuplot desde la línea de comandos de Linux, entraremos en el prompt de gnuplot, listo para recibir nuestras órdenes. Si ejecutamos quit o exit, saldremos del programa. Con load fichero.plt dentro de gnuplot o con gnuplot fichero.plt desde fuera, podemos cargar un fichero de órdenes para gnuplot como si las estuviéramos tecleando (el fichero contendrá líneas con el mismo formato que las que se teclean dentro del command line de gnuplot).
Dentro de gnuplot tenemos ejecutar todo tipo de comandos para dibujar gráficas, como por ejemplo:
gnuplot> plot sin(x) gnuplot> plot [0:5] sin(x) gnuplot> a=0.5 gnuplot> print a gnuplot> plot a*sin(x)*cos(x)
Este pequeño tutorial está pensado para mostrar de qué manera se pueden dibujar gráficos ya tabulados en ficheros de texto, obtenidos mediante algún tipo de procesamiento externo, de modo que no veremos todas las posibilidades del prompt de gnuplot.
Pintando datos tabulados
Supongamos que mediante una aplicación obtenemos unos resultados numéricos tabulados en un fichero de texto, del estilo:
0.10 1.12 23.45 11.11 0.20 2.12 12.34 22.22 0.30 2.34 98.23 10.40 ... 1.10 8.32 22.45 12.00
Es decir, un fichero de texto llamado "datos.txt" con (en este caso) 4 columnas numéricas.
Podemos obtener una gráfica en pantalla mediante gnuplot utilizando el siguiente comando:
gnuplot> plot "datos.txt" using 1:2 with lines
Es decir: dibújame una gráfica usando las columnas 1 y 2 del fichero datos.txt, rellenando los espacios entre los puntos de la gráfica con líneas rectas.
El parámetro with lines a la hora de dibujar la gráfica indica el tipo de rellenado entre puntos a utilizar (continuo, discontinuo, etc). El formato genérico de uso es with lines o with lines <NUMERO>. Este número varía según el terminal que tengamos seleccionado con el comando set term. La mejor manera de ver los tipos de rellenados disponibles sería ejecutar:
gnuplot> set term x11 gnuplot> test
Podemos dibujar más de una gráfica en la misma ventana:
gnuplot> plot "datos.txt" using 1:2 with lines, \ > "datos.txt" using 1:3 with lines, \ > "datos.txt" using 2:4 with lines
Si necesitamos añadir títulos, podemos hacerlo:
gnuplot> plot "datos.txt" using 1:2 title **A** with lines, \ > "datos.txt" using 1:3 title **B** with lines, \ > "datos.txt" using 2:4 title **C** with lines
También podemos superponer funciones teóricas:
gnuplot> f(x) = 12.3*x + 1.31 gnuplot> plot "datos.txt" using 1:2 title **A** with lines, \ > "datos.txt" using 1:3 title **B** with lines, \ > "datos.txt" using 2:4 title **C** with lines, \ > f(x) with lines
Si necesitamos dibujar exáctamente un rango concreto de la gráfica, podemos hacerlo:
gnuplot> set xrange [0:2] gnuplot> set yrange [0:10] gnuplot> replot
La escala no tiene por qué ser lineal, puede ser logarítmica:
gnuplot> set xrange [0.01:20] gnuplot> set yrange [0:2] gnuplot> set logscale x gnuplot> replot
También podemos cambiar las graduaciones e incrementos marcados en los ejes:
gnuplot> set xtics 1 gnuplot> set mxtics 5 gnuplot> set ytics 0.5 gnuplot> set mytics 5 gnuplot> set grid (Nota: si queremos poner rejilla) gnuplot> replot
También podemos poner etiquetas en los ejes, y título:
gnuplot> set xlabel "Clientes" gnuplot> set ylabel "Tiempo de respuesta (ms)" gnuplot> set title "Mi grafica" gnuplot> replot
Obteniendo una versión impresa de la gráfica
Aparte del hecho de que podemos capturar la gráfica resultante en pantalla con ksnapshot, gimp o similares, podemos obtener una versión postscript PNG (.png) de la gráfica mediante:
gnuplot> set term png gnuplot> set output "salida.png" gnuplot> plot "datos.dat" using 1:2
También es posible reimprimir una gráfica después de haberla obtenido por pantalla:
# cat comandos_gnuplot set term x11 set output "salida.png" plot "datos.dat" using 1:2 set term png set output "salida.png" replot quit # gnuplot -persist < comandos_gnuplot
GNUPlot soporta varios formatos de salida. Por ejemplo, podemos imprimir directamente las gráficas en formato Postscript:
gnuplot> set terminal postscript gnuplot> set output "salida.ps"
Cargar ficheros plt desde línea de comandos
Sea un fichero "datos.plt" con un fichero como el siguiente:
# Esto es un comentario y gnuplot lo ignora. set xlabel "Bla" set ylabel "Bla Bla" plot "fichero.dat" with (etc. etc. etc.)
Podemos ejecutarlo de 2 formas diferentes, desde la línea de comandos de Linux o desde dentro de gnuplot:
bash$ gnuplot -persist datos.plt
o bien
gnuplot> load "datos.plt"
La opción -persist (al igual que poner un pause -1 dentro del .plt) sirve para que la gráfica se quede en pantalla hasta que pulsemos una tecla.
Estilos de ploteado
Como ya hemos visto, hay diferentes estilos de ploteado. Veamos algunos ejemplos:
gnuplot> plot (...) with lines gnuplot> plot (...) with lines -1 gnuplot> plot (...) with dots gnuplot> plot (...) with impulses gnuplot> plot (...) with steps gnuplot> plot (...) with histeps gnuplot> plot (...) with boxes gnuplot> plot (...) smooth csplines gnuplot> plot (...) smooth bezier
Otros
- Dibujar ejes en el cero:
gnuplot> set xzeroaxis gnuplot> set yzeroaxis lt -1
La opción lt permite indicar el line type, pero también hay ls (line style) o lw (line width).
- Recortar puntos cerca de los bordes: si no queremos que se dibujen puntos cerca de los ejes, podemos hacerlo como en el siguiente ejemplo:
gnuplot> set clip one gnuplot> plot sin(x) with linespoints gnuplot> set noclip one gnuplot> replot gnuplot> set clip two gnuplot> replot gnuplot> set noclip two gnuplot> replot
- Que la gráfica sólo tenga la parte positiva en X e Y: si sólo queremos sacar el primer cuadrante de la gráfica, podemos hacerlo con:
gnuplot> set xtics nomirror gnuplot> set ytics nomirror
- Recortar la relación de aspecto de la gráfica:
gnuplot> set size square gnuplot> set size ratio 0.5
- Añadir una rejilla a los minor tics:
gnuplot> set grid xtics ytics mxtics mytics
- Ejemplo de fichero para generar una gráfica:
#!/usr/bin/gnuplot set data style lines set term png set xdata time set format x "%H:%M" set timefmt "%H:%M" set xtics 60*60 set datafile missing "0" set title "Uso de CPU " set ylabel "% CPU en uso" set xlabel "Hora del 2009_02_24" set output "2009_02_24_maquina-uso_cpu.png" set yrange [0:100] plot "reports.txt" using 2:3 notitle