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

Publicado el 06 abril 2015 por Gaspar Fernández Moreno @gaspar_fm

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:

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:

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:

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