22 enero, 2008

Graficos en php

Hola php-eros, hay momentos donde te piden que tienes que presentar tus datos en un gráfico y sinceramente php no es una buena herramienta que permita realizar gráficos con facilidad, algunos recurren a flash o a otras herramientas que se encuentran por Internet. Pues yo les voy a facilitar una clase con la que pueden realizar un gráfico de pastel, con solo modificar unos cuantos parámetros.

Empezamos creando un archivo php y escribiendo el siguiente código
// Definimos el tamaño de la imagen
$imagen = imagecreate(300,550);
// Color de fondo en formato RGB
$bg = imagecolorallocate($imagen,255,255,255);

Luego definimos cuatro arreglos, uno para mostrar el texto, otro para guardar el color principal,otro para guardar el color de sombra y el ultimo para guardar el valor numérico registrado.
$estados[0] = "Java";
$colores[0] = imagecolorallocate($imagen,112,112,112);
$sombras[0] = imagecolorallocate($imagen,0,0,0);
$valores[0] = 600 ;
Después de ingresar varios registros a los arreglos, ahora solo resta calcular los porcentajes de los valores.
// Sumamos el total de los valores
$total = array_sum($valores);
// Calculamos el porcentaje y el ángulo de cada valor
for($i=0; $i<count($valores); $i++) {
$porcentajes[$i] = round(($valores[$i]/$total)*100,2);
$angulos[$i] = round(($porcentajes[$i]*360)/100);
}
Ahora podemos continuar con el dibujo, centramos la gráfica en las dimensiones de la imagen, modificamos en tamaño del gráfico (del pastel) y ponemos el inicio del angulo del gráfico.
// Centro de la gráfica
$cx = 120;
$cy = 65;
// Tamaño del gráfico
$ancho = 200;
$alto = 80;
// Inicio del ángulo
$inicio = 0;
Luego insertamos los datos en la gráfica de la siguiente manera
// Repetimos 35 veces la gráfica.
for($n=35;$n>0;$n--) {
for($i=0;$i<count($valores);$i++) {
imagefilledarc($imagen, $cx, $cy+$n, $ancho, $alto,
$inicio, $angulos[$i]+$inicio, $sombras[$i], IMG_ARC_PIE);
$inicio += $angulos[$i];
}
}

$gris = imagecolorallocate($imagen,119,119,119); //Color de las letras
for($i=0;$i<count($valores);$i++) { imagefilledarc($imagen,$cx,$cy,$ancho,$alto,$inicio,
$angulos[$i]+$inicio,$colores[$i],IMG_ARC_PIE);
$inicio += $angulos[$i];
// Especificación de los colores de cada una de las porsiones
imagefilledrectangle($imagen, 20, 155+($i*20), 34, 169+($i*20), $colores[$i]);
imagestring($imagen, 2, 50, 155+($i*20), $estados[$i].": ".$valores[$i]." (".$porcentajes[$i]."%)", $gris);
}
y finalmente llevamos a nuestra imagen a la vida
header('Content-type: image/png');
imagepng($imagen);
imagedestroy($imagen);

Y así de fácil creamos un gráfico en php, no es lo mas avanzado del mundo pero sirve para graficar, así lo insertamos donde queremos <img src="path/pastel.php" /> y siempre estará actualizado! ;)
El código lo dejo para que lo bajen acá: pastel.php
Si tienen preguntas o comentarios siempre son bienvenidos, espero que les guste el script, adew!!

3 comentarios:

Ariel Orozco dijo...

No tenia ni idea que php era capaz de hacer estas cosas, y con las librerias ya existentes! Me parece genial!

Luis dijo...

Hey mae, ta cool.

Pero es DEM ineficiente usar el count() dentro del for. Cada vez que el iterador pasa por ahi, hace la llamada a la funcion. Lo ideal seria hacer algo como:

$t = count($arr);

y evualar a $t en el iterador.

sinsombra dijo...

tengo un problema al tratarlo de hacer dinamico no muestra la grafica y no tengo idea de como hacerlo esto fue lo que modifiq del codigo :
// Color de fondo en formato RGB
$bg = imagecolorallocate($imagen,255,255,255);
require_once ("../Conexion.php");

$cons= new DBManager();
$query= $cons->get_results("SELECT p.`NOM_PROV` , AVG( gc.`Validacion` ) AS `Validacion`
FROM `graficas_estadisticas` gc, `provincia` p
WHERE gc.`Provincia` = p.`COD_PROV`
GROUP BY p.`COD_PROV` ");
foreach ($query as $item) {
$datos =array(array($item->Validacion,$item->NOM_PROV));
}
foreach( $datos as $ElemArray ) {
$p1 = ($ElemArray[1]);
$p2 = ($ElemArray[0]);;
$i=0;
//Definimos los arreglos de los Pedazos :P
$estados[$i] = $p1;
$colores[$i] = imagecolorallocate($imagen,149,255,107);
$sombras[$i] = imagecolorallocate($imagen,139,184,122);
$valores[$i] = $p2 ;

$i=$i+1;

}