En la documentación adjunta a este post se cuenta
el proceso de investigación sobre cómo
automatizar la generación de informes con gráficos de series temporales
mediante la combinación de GNU Plot con TOL con Html2Pdf de Two Pilots.
El objetivo es mecanizar informes gráficos sin intervención humana.
Se presentan cuatro ejemplos, crecientes en complejidad:
-
El primero genera un gráfico simple en formato GIF utilizando GNU Plot,
se trata de un programa de demostración de GNU Plot ligeramente modificado.
-
El segundo muestra la generación de un gráfico en formato GIF de
una serie temporal larga con datos que
proceden del Banco de Canada (Bank of Canada).
-
El tercero muestra cómo generar un gráfico en formato GIF con una
serie temporal almacenada en el formato BDT de TOL.
También se construye un fichero HTML que contiene el gráfico y
lo convierte a PDF llamando tanto a GNU Plot como al conversor a PDF
(Two Pilots Html2Pdf) desde TOL.
-
En el cuarto se genera el mismo gráfico que en el tercero pero en
3 formatos diferentes JPEG, GIF y PNG,
se insertan los tres gráficos dentro de una página HTML y
se produce el PDF utilizando la mejor calidad posible
para la generación de los JPEG internos del PDF.
Como se explica en el fichero PDF adjunto, al final de este post,
el formato que proporciona mejores resultados es el PNG
(formato que desde hace tiempo me gusta mucho, por ejemplo, todas
las imágenes de este web están en formato PNG).
-
Finalmente
en el quinto se utiliza multiplot para generar un gráfico
del estilo de los que se emplean en los mercados bursátiles
con datos de la operadora de telecomunicaciones Jazztel.
También en este ejemplo,
dejo de utilizar la extensión de demostración de los ficheros
de GNU Plot (.dem) para utilizar la genuina (.plt).
Adjunto a continuación un trozo del código
(el código fuente completo se puede ver en el documento adjunto a este post)
donde se generan las especificaciones para GNU Plot a partir de una
plantilla e igualmente para la página HTML y
se invoca a GNU Plot y a Two Pilots Html2Pdf.
La plantilla para GNU/Plot está inserta en el propio código TOL y
la plantilla para la página HTML se lee de un fichero externo:
///////////////////////////////////////////////////////////////////
// GnuPlot prototype
///////////////////////////////////////////////////////////////////
Text ploSed =
"
set term gif font 'arial' 10 size SIZWID, SEDHEI
set output 'FILGIF'
set datafile separator ';'
set title 'GRATIT' textcolor lt 3 font 'arial,14'
set style data lines
set timefmt '%d/%m/%Y'
set xdata time
set xlabel 'LABELX' textcolor lt 3 font 'arial,12'
set xrange [ 'DTEINI':'DTEEND' ]
set xtics rotate by 90
set format x '%d/%m/%Y'
set ylabel 'LABELY' textcolor lt 3 font 'arial,12'
set yrange [ 0 : ]
set format y '%g'
set grid
set key left
plot 'FILDAT' using 1:2 t 'SERNAM'
reset
";
///////////////////////////////////////////////////////////////////
// Dates and names
///////////////////////////////////////////////////////////////////
Text iniTxt = FormatDate(First(UniqueUsers), "%d/%m/%Y");
Text endTxt = FormatDate(Last (UniqueUsers), "%d/%m/%Y");
Text serNam = Name(UniqueUsers);
///////////////////////////////////////////////////////////////////
// Build and write the GnuPlot command file
///////////////////////////////////////////////////////////////////
Text ploDem = ReplaceTable(ploSed,
[[ [["SIZWID", "800"]], [["SEDHEI", "500"]],
[["FILGIF", filGif]],
[["GRATIT", "Demo: BDT to GIF Chart"]],
[["LABELX", "Weeks"]],
[["DTEINI", iniTxt]], [["DTEEND", endTxt]],
[["LABELY", serNam]],
[["FILDAT", filDat]],
[["SERNAM", serNam]] ]], 1);
Text WriteFile(filDem, ploDem);
///////////////////////////////////////////////////////////////////
// Run GnuPlot
///////////////////////////////////////////////////////////////////
Text cmdExe = "C:\\asc\\Bin\\gnuplot\\bin\\pgnuplot";
Text cmdTxt = cmdExe+" "+filDem;
Real cmdRun = System(cmdTxt); // Execute gnuplot
///////////////////////////////////////////////////////////////////
// Makes a Pdf file from the Html page
///////////////////////////////////////////////////////////////////
Text codHtm = ReplaceTable(ReadFile(filSed),
[[ [["SIZWID", "800"]], [["SEDHEI", "500"]],
[["FILGIF", filGif]],
[["PLOCOD", ploDem]] ]], 1);
Text WriteFile(filHtm, codHtm);
///////////////////////////////////////////////////////////////////
// Makes a Html page from a seed
///////////////////////////////////////////////////////////////////
Text pdfExe = "\""+"C:\\Archivos de programa\\Two Pilots\\"+
"HTML2PDF Pilot\\HTML2PDF_Pilot.exe"+"\"";
Text pdfInp = "C:\\asc\\App\\GnuPlot.Test\\"+filHtm;
Text pdfOut = "C:\\asc\\App\\GnuPlot.Test\\"+filPdf;
Text pdfCmd = pdfExe+" "+ // Executable pdf convertor
pdfInp+" "+ // Input file
pdfOut+" "+ // Output file
" /jpeg 100 /author asalmeron@asolver.com";
Real pdfRun = System(pdfCmd); // Execute html to pdf conversion
La documentación adjunta incluye, en el mismo orden anterior
(salvo los tres códigos fuente HTML que están al final del todo):
el código completo de especificaciones para GNU Plot, el código
fuente TOL, los datos de series temporales utilizados en los gráficos
y los ficheros de mandatos.