Unimos gráficas
Hasta este momento nos hemos ocupado del caso cuando colocamos una gráfica dentro de un dibujo. Para su visualización hemos utilizado la función DrawGraph(). Pero si tuviéramos la necesidad de colocar dos o más gráficas en un dibujo, no podríamos visualizarlas con la ayuda de esta función (si lo hiciéramos, la página con la gráfica se generaría a la primera llamada de esa función, por lo que la segunda gráfica nunca aparecería). En este caso, debemos encontrar la manera que nos permita preparar cada una de las gráficas por separado, y después visualizarlas juntas. Intentemos crear un ejemplo sencillo con una gráfica de pastel, y luego, añadirle una gráfica de barras. El código del ejemplo que genera la gráfica de pastel se muestra en el Listado 4.
Listado 4: Código del script del ejemplo que despliega la gráfica de pastel (pie.php)
<?php
include_once("phplot.php");
$data=array(
array("Votación",30,25,12,33)
);
$graph = new PHPlot();
$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();
?>
Vemos que, comparando con los ejemplos anteriores, no hay nada nuevo. El array de datos contiene solo un array de valores, ya que solamente datos de este tipo sirven para visualizarlos en gráficas de pastel. La gráfica se despliega gracias a la utilización del método DrawGraph() (la última línea del script). Pensemos qué sucedería si al script presentado le añadiéramos el código que despliega una gráfica adicional. Este script se presenta en el Listado 5.
Listado 5: Script que intenta desplegar dos gráficas a la vez
<?php
include_once("phplot.php");
$data=array(array("Votación",30,25,12,33));
$graph = new PHPlot();
$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->SetDataValues($data);
$graph->SetDataType("text-data");
$graph->SetPlotType("bar");
$graph->SetLegend(array());
$graph->DrawGraph();
?>
Desafortunadamente, sólo se abre la primera gráfica (la de pastel), como consecuencia de la primera llamada a la función DrawGraph(). Se realiza la creación de la página que contiene la gráfica de pastel y la envía al navegador. En este caso, la gráfica que se crea en la segunda posición no aparecerá nunca. Por suerte, utilizando la librería PHPlot se pueden separar el proceso de dibujar la gráfica (es decir, colocación de la gráfica en el dibujo) del proceso de despliegue del dibujo que contiene las gráficas. Por defecto, la función DrawGraph(), además de dibujar la gráfica, también ocasiona su visualización. Para deshabilitar su funcionamiento por defecto, primero debemos utilizar el método SetPrintImage() con false como parámetro. Además, debemos prevenir que una gráfica no se coloque encima de la otra, se puede (del mismo modo para la primera gráfica que para la segunda) recurrir al método SetNewPlotAreaPixels(), proporcionando las coordenadas del área rectangular, donde quedará ubicada la gráfica dentro del dibujo. Estas coordenadas son expresadas en píxeles y convertidas en relación a la esquina superior izquierda de la pantalla. Todavía nos queda utilizar el método que despliega el dibujo con las dos gráficas. Esto lo realiza el método PrintImage(). El Listado 6 presenta los elementos más importantes del código del Listado 5 enriquecido por los métodos que permiten crear la página con varias gráficas. El ejemplo del funcionamiento de este código se muestra en la Figura 8.
Listado 6: Fragmento más importante del código que hace visualizar las dos gráficas (pie_and_bars.php)
<?php
include_once("phplot.php");
$data=array(array("Votación",30,25,12,33));
$graph = new PHPlot(800,600);
$graph->SetPrintImage(false);
$graph->SetDataValues($data);
...
...
$graph->DrawGraph();
$graph->SetDataValues($data);
...
...
$graph->SetNewPlotAreaPixels(40,10,300,180);
$graph->DrawGraph();
$graph->PrintImage();
?>