Poesía Binaria

Pintar una gráfica con gnuplot de datos extraidos de SQLite

Como parte de uno de mis últimos proyectos, recopilo datos periódicamente y los almaceno en una tabla SQLite. Pero, al final, los datos no valen para nada si no somos capaces de tener una visión global de lo que ha pasado a lo largo del periodo de tiempo. Y para eso, ¿qué mejor que pintar los datos en una gráfica?

Ya que los datos los almaceno en SQLite, utilizaré el cliente sqlite3 y para pintar las gráficas, gnuplot.

Lo primero es sacar la consulta SQL para extraer los datos de los ejes X e Y. En este caso, el eje X será el tiempo y el eje Y será el valor obtenido en el test:

1
SELECT VALUE, dtm FROM STATUS WHERE monitor=1;

La consulta la podemos complicar todo lo que queramos, introducir más condiciones, rangos de tiempo, etc. SQLite se lleva bien con estos tipos de datos. Cabe decir que el campo value es de tipo REAL y dtm es de tipo DATETIME (por lo tanto, las fechas y horas vendrán especificadas como %Y-%m-%d %H:%M:%S, algo que le tendremos que decir más tarde a gnuplot.

Construyendo el script para gnuplot

Una vez tenemos los datos, sólo queda construir el script:

1
2
3
4
5
6
7
8
#!/usr/bin/gnuplot

set xdata time
set datafile separator ','
set timefmt '%Y-%m-%d %H:%M:%S'
set style data lines
plot '< sqlite3 -csv testing.sqlite "SELECT value, dtm FROM status WHERE monitor=1;"' using 2:1 title 'sysload';
pause -1 "Close the window"

La consulta SQL, para facilitar las cosas, la exportamos como csv, separada por comas y delimitada con comillas, así será más fácil leerla y evitaremos problemas con los delimitadores. A gnuplot le diremos que el separador de los datos (datafile separator) es la coma.

A gnuplot, tendremos que decirle que el eje x (xdata) corresponde al tiempo. El tiempo es algo más difícil de interpretar que un simple número (además, le tenemos que decir el formato de fecha y hora (como a strftime()), en este caso, sería una fecha tipo «2015-03-20 17:50:30» (año-mes-día hora:minutos:segundos).

Por último plot, se encarga de pintar la gráfica obteniendo los datos de sqlite3 como dijimos antes, tomando como eje X el segundo dato (dtm) y eje Y el primero (value). Si tenemos instalados los módulos x11 o qt de gnuplot lo veremos directamente en pantalla (y por eso la pausa antes de cerrar). De lo contrario, tendremos que sacar la salida como imagen, para ello tendremos que poner antes de plot lo siguiente:

1
2
set terminal 'png' size 1024,768
set output 'plot.png'

y podemos quitar el pause, ya que se producirá directamente en el fichero plot.pnt

También podría interesarte....