Introducción
Hace poco me llego un email de una persona que tenia dudas acerca de como crear gráficos de barras, gráficas circulares, etc. Así que decidí crear este tutorial para que puedan hacer sus propios gráficos con perl.
Preparando Todo
Para este tutorial vamos a usar el módulo llamado GD::Graphs el cual pueden encontrar en CPAN:
http://search.cpan.org/CPAN/authors/id/M/MV/MVERB/GDGraph-1.43.tar.gz
También hice un zip con todos los archivos necesarios para poder usar el módulo. Todo lo que tienen que hacer es bajar el zip y extraer su contenido en el directorio de "/lib" en su perl.
http://perlenespanol.com/pub/GD.zip
Recuerden extraer todos los archivos usando el nombre de los directorios que ya vienen. Si no puedes extraer los archivos en tu distribución de perl, lee el tutorial acerca de como ejecutar módulos de perl sin tener que instalarlos.
Si ya tienes todo listo, sigamos con el tutorial.
Gráfica de Barras
Como primer ejemplo vamos a crear una gráfica de barras. Digamos que queremos hacer una gráfica de barras con el número de visitas que tiene "Perl en Español". Lo primero que necesitamos es llamar a los módulos necesarios:
use strict;
use CGI ':standard';
use GD::Graph::bars;
Nota como usamos "GD::Graph::bars" pues queremos hacer una gráfica de barras.
Ahora emepecemos con el código llenando nuestros campos:
my @campos = ('Oct 2003','Nov 2003','Dec 2003','Ene 2004','Feb 2004');
Ahora vamos a hacer nuestro array con los valores. Los dos arrays deben de tener la misma cantidad de elementos, de lo contrario perl nos mostraría un error:
my @valores = ('547','2282','2798','2354','4326');
Muy bien ya tenemos nuestros dos arrays ahora vamos a juntarlos en un array que va a contener los dos arrays y que más adelante le vamos a envíar el módulo:
my @graf = (\@campos, \@valores);
Siempre deben de ir los nombres de los campos primero seguidos por los valores.
Ahora lo que sigue es la linea con la que vamos a crear nuestra gráfica:
my $grafico = GD::Graph::bars->new(500, 300);
Los valores dentro de "new()" son el ancho y el alto que queremos que tenga nuestro gráfico.
$grafico->set(
x_label => 'Mes',
y_label => 'Visitas Totales',
title => 'Visitas Mensuales de "Perl en Español"',
) or warn $grafico->error;
Vemos como el "x_label" es el pequeño titulo que va a poner horizontalmente y el "y_label" es el que va a ir verticalmente. El valor de "title" es como dice su nombre el título de nuestra gráfica.
my $imagen = $grafico->plot(\@graf) or die $grafico->error;
Muy bien ahora si creamos la imagen evíando la referencia a nuestro array de arrays que hicimos anteriormente.
Ahora vien la hora de la verdad, el despliegue de nuestro gráfico:
print "Content-type: image/png\n\n";
print $imagen->png;
exit(1);
Noten como el "Content-type" tiene un valor de "image/png" lo que le dice al navegador que el contenido que sigue es el código de una imagen.
Pueden ver aquí como quedaría este ejemplo.
Código Final
#!/usr/bin/perl -w
use strict;
use CGI ':standard';
use GD::Graph::bars;
my @campos = ('Oct 2003','Nov 2003','Dec 2003','Ene 2004','Feb 2004');
my @valores = ('547','2282','2798','2354','4326');
my @graf = (\@campos, \@valores);
my $grafico = GD::Graph::bars->new(500, 300);
$grafico->set(
x_label => 'Mes',
y_label => 'Visitas Totales',
title => 'Visitas Mensuales de "Perl en Español"',
) or warn $grafico->error;
my $imagen = $grafico->plot(\@graf) or die $grafico->error;
print "Content-type: image/png\n\n";
print $imagen->png;
exit(1);
Gráficas Circulares
Muy bien, ahora usando los mismos valores de el ejemplo anterior, vamos a crear una gráfica de barras. Lo primero que debemos de cambiar es la llamada al módulo de "GD::Graph" que debe de decir:
use GD::Graph::pie;
Ahora el código que tenemos que cambiar también es:
my $grafico = GD::Graph::pie->new(320, 300);
$grafico->set(
title => 'Visitas Mensuales de "Perl en Español"',
'3d' => 1,
) or warn $grafico->error;
Como es lógico la variable "title" es el título de nuestra gráfica, el valor "3d" es si queremos que nuestra gráfica tenga un efecto de 3d.
Ese es todo el código que debemos de cambiar.
Pueden ver aquí como quedaría este ejemplo.
Código Final
#!/usr/bin/perl -w
use strict;
use CGI::Carp qw(fatalsToBrowser);
use CGI ':standard';
use GD::Graph::pie;
my @campos = ('Oct 2003','Nov 2003','Dec 2003','Ene 2004','Feb 2004');
my @valores = ('547','2282','2798','2354','4326');
my @graf = (\@campos, \@valores);
my $grafico = GD::Graph::pie->new(320, 300);
$grafico->set(
title => 'Visitas Mensuales de "Perl en Español"',
'3d' => 1,
) or warn $grafico->error;
my $imagen = $grafico->plot(\@graf) or die $grafico->error;
print "Content-type: image/png\n\n";
print $imagen->png;
exit(1);
Gráfica de Área
Ahora veamos como hacer un gráfico de área, este gráfico es como una linea que tiene un área por debajo(?), mejor veamos el ejemplo.
Como ya sabemos primero hay que editar la llamada al módulo:
use GD::Graph::area;
Ahora el constructor de nuestro gráfico va a ser de la siguiente manera:
my $grafico = GD::Graph::area->new(500, 300);
$grafico->set(
x_label => 'Mes',
y_label => 'Número de Visitas',
title => 'Visitas Mensuales de "Perl en Español"',
) or warn $grafico->error;
No tiene caso que explique todas las variables de nuevo pues son iguales a las del primer ejemplo.
Pueden ver aquí como quedaría este ejemplo.
Código Final
#!/usr/bin/perl -w
use strict;
use CGI::Carp qw(fatalsToBrowser);
use CGI ':standard';
use lib('./lib');
use GD::Graph::area;
my @campos = ('Oct 2003','Nov 2003','Dec 2003','Ene 2004','Feb 2004');
my @valores = ('547','2282','2798','2354','4326');
my @graf = (\@campos, \@valores);
my $grafico = GD::Graph::area->new(500, 300);
$grafico->set(
x_label => 'Mes',
y_label => 'Número de Visitas',
title => 'Visitas Mensuales de "Perl en Español"',
) or warn $grafico->error;
my $imagen = $grafico->plot(\@graf) or die $grafico->error;
print "Content-type: image/png\n\n";
print $imagen->png;
exit(1);
Desplegando el gráfico
Desplegar el gráfico en nuestra página de HTML es sumamente sencillo, sólo basta con incluir la siguiente linea tal y como lo harías con un gráfico:
<img src="http://perlenespanol.com/cgi-bin/pub/tutGD/area.cgi" alt="Visitas Mensuales">
Claro que debes de cambiar el URL a tu CGI.
Opciones Extra
Aparte de las propiedades que usamos anteriormente en las gráficas como "title","x_label","y_label", etc. Hay muchas propiedades más que podemos usar y aquí va una lista de algunas de ellas:
Para Gráficas de Barras |
propiedad | acción |
bar_width | Cambia el ancho de las barras al especificado en pixeles. Por default el módulo usa el mayor ancho posible considerando el ancho de el gráfico. |
bar_spacing | Cambia la separación en píxeles de las barras. En algunos sistemas el valor de 1 será redondeado a 0. En caso de que se haya puesto un valor de bar_width este valor será ignorado y el bar_spacing será calculado automáticamente. El default es de 0. |
Para Gráficas Circulares |
propiedad | acción |
3d | Cuando se pone con un valor verdadero se hará un efecto 3d. El default es 1. |
pie_height | El grosor de la gráfica cuando esta el efecto 3d abilitado. El defaul es 0.1xAltura. |
start_angle | El angulo donde la primera rebanada de datos inicializará. Por default esta 0. |
suppress_angle | Si el pedazo de datos es menor a esta cantidad de datos se eliminará y no se desplegará. El default es 0. |
label | Imprimer el mensaje abajo de el gráfico. El default es undef. |
Todas estas propiedades se pueden incluir tal y como lo hice en los ejemplos con el "title","x_label","y_label", etc.
¿Problemas con tu instalación?
Si tienes problemas al instalar el módulo GD y GD::Graph, entra a la siguiente liga dentro del foro del sitio donde podrás encontrar una solución a tu problema:
http://perlenespanol.com/foro/viewtopic.php?t=284