Unimos el texto y las gráficas
A pesar de que en la página se presentan las gráficas, convendría colocar el array con los datos. Esta operación no es sencilla, aunque pueda parecerlo. Si el array del que estamos hablando lo insertamos después de utilizar la función DrawGraph() (o PrintImage()), no aparecerá en la pantalla del navegador. Si lo colocamos antes, nos espera una sorpresa desagradable: el array aparecerá, pero en lugar de las gráficas sólo veremos signos raros. La causa de tal situación es el envío de la cabecera Content-type: image/* (donde * representa el formato del dibujo requerido), precediendo la aparición de la gráfica. Por supuesto, eliminando la posibilidad de visualización del texto común anterior (este funcionamiento lo ocasionaría el envío automático de la encabecera Content-type: text/html). Tampoco se puede visualizar el texto después de la transferencia del dibujo, ya que el navegador, que está en espera de una gráfica, no lo interpretará de manera correcta. La única salida es la creación de un script extra y utilizar en él la etiqueta HTML IMG. Como el valor del parámetro SRC en la etiqueta IMG podemos dar el nombre del script que crea el dibujo:
...
print "Visualización del array de datos";
print "<IMG SRC=\"graph.php\">";
...
Esta solución resulta útil sólamente cuando todos los datos necesarios para la creación de las gráficas (es decir, el array de datos y el argumento del método para el objeto PHPlot) se encuentren dentro del archivo llamado en la etiqueta IMG. En el caso del script que se presenta en el Listado 2, los datos provenían del formulario, del que fueron enviados con la ayuda del método POST. Lo que para nosotros, desafortunadamente, es un problema, ya que en la solución que deseamos implementar, el formulario debería llamar al script cuyo fragmento se presenta más arriba (es decir, éste en el cual se encuentra el array con los datos y la etiqueta IMG). Pero, ¿Cómo transferir los datos del formulario al script, llamado en la etiqueta IMG? Si los datos fueran transferidos con el método GET, se podría unir la cadena query string al nombre del script; sin embargo, en el caso de formularios enormes, el obstáculo podría ser la capacidad limitada de esta cadena. También se puede almacenar el array $_POST en la variable de la sesión y restaurar su contenido dentro del script que se menciona.
Es difícil no apoyarse en la idea de que soluciones como esta son un perfecto ejemplo de exageración en cosas sencillas. La transferencia de un array superglobal dentro de otro o convertir datos del array $_POST por query string son cosas poco comunes. Por consiguiente, ¿de qué manera dar una solución más sencilla a este problema? El método PrintImage() nos resulta de ayuda, el cual - además de que puede desplegar la gráfica – también permite almacenarla en un archivo. Teniendo la gráfica en un archivo, ¡podemos acceder a ella desde la etiqueta IMG!
Ocupémonos del script que nos permitirá almacenar la gráfica en un archivo. Este se presenta en el Listado 7.
Listado 7: Script que almacena la gráfica en un archivo (pie_to_file.php)
<?php
include_once("phplot.php");
$data=array(array("Votación",30,25,12,33));
$graph = new PHPlot();
$graph->SetPrintImage(false);
$graph->SetFileFormat("jpg");
$graph->SetOutputFile("graph.jpg");
$graph->SetIsInline(true);
$graph->SetDataValues($data);
$graph->SetDataType("text-data");
$graph->SetPlotType("pie");
$graph->SetTitle("Resultados de la votación");
$graph->SetLegend(array("Partido A", " Partido B", " Partido C", " Partido D"));
$graph->DrawGraph();
$graph->PrintImage();
?>
Comparando con el script mencionado anteriormente, aquí aparecen tres funciones nuevas: SetFileFormat(), SetOutputFile() y SetIsInline(). La pimera de ellas permite definir el formato del archivo en el cual se almacenará la gráfica. Se puede utlizar los mismos formatos que proporciona la versión de la librería GD instalada. La segunda función permite definir el nombre del archivo en el cual se encontrará la gráfica, y la tercera bloquea el despliegue de la gráfica en la pantalla. Gracias al uso de estas funciones, en el momento de utilizar el método PrintImage(), en el disco aparecerá el archivo graph.jpg, mientras tanto la página que se visualiza en el navegador quedará vacía (no tendrá lugar el envío de la cabecera Content-type: image/*).
Para saber cómo utilizar tal gráfica salvada en el archivo, veamos el script que se presenta en el Listado 8 y el efecto de su funcionamiento que se presenta en la Figura 9.
Listado 8: Visualización del texto y la gráfica en una misma página (pie_and_data.php)
<?php
include("pie_to_file.php");
print "Tabla de datos:<BR><BR>".
"<TABLE BORDER>".
"<TR><TD>Partido A</TD>
<TD>Partido B</TD>
<TD>Partido C</TD>
<TD>Partido D</TD></TR>".
"<TR><TD>30</TD><TD>25</TD>
<TD>12</TD> <TD>33</TD></TR>".
"</TABLE><BR><BR>";
print "<IMG SRC='graph.jpg'>"
?>
Como podemos ver, en la primera línea es llamado el script pie_to_file.php, ya conocido del Listado 7, que crea la gráfica y la almacena en el archivo graph.jpg. Este archivo se llama en la última línea con el tag IMG.
La librería PHPlot ofrece muchas más posibilidades. Vale la pena notar la posibilidad de escalar los datos, característica indispensable en el caso de tener la necesidad de colocar datos de valores muy diversos en una gráfica. Para escalar la gráfica se utiliza la función DoScaleData(), la cual no es proporcionada por la clase PHPlot, pero si por la clase descendiente PHP_Data (el código de esta clase se encuentra en el archivo phplot_data.php). Si quisieramos utilizar las funciones proporcionadas por la clase descendiente, hay que incluir su código con ayuda de la función include(), y luego crear un objeto de esa clase ($chart = new PHPlot_Data). Utilizando tal objeto se puede llamar los métodos de la clase base (PHPlot), tanto como los de la descendiente (PHPlot_Data).
Tomando datos
Introducir datos de manera manual no parece ser una solución muy práctica. Sería mucho más cómodo obtener tal información desde uno de los sitios web. Supongamos que queremos presentar las cotizaciones de las monedas en una gráfica. Estas cotizaciones las proporcionan casi todos los sitios web de los bancos. Si quisiéramos utilizarlos, bastaría la función fsockopen(): enviar al navegador la cabecera del request cuyo propósito será cargar el documento que contenga la información sobre las cotizaciones de las monedas y, luego, con ayuda de la función fgets() y el uso de expresiones regulares, extraer de la página el fragmento requerido y colocar los datos en el array de datos con la estructura que cumpla los requerimientos de la librería PHPlot.