free web hostingHosting24.com web hosting

Gráficos Estadísticos con PHP + FusionCharts II

Segundo tutorial de Gráficos Estadísticos con PHP y Fusioncharts.
Veremos como crear Gráficos Maestro/Detalle. Por ejemplo: a partir de un gráfico de barras, obtener otro gráfico detalle.
Click aquí para ver el Ejemplo:

Para esto, vamos a seguir con el ejemplo del tutorial anterior (Graficos estadisticos con PHP).

La estructura del directorio es la siguiente:
estructura

Carpeta “funciones_php”: contiene el archivo “FusionCharts.php”, necesario para graficar.
Carpeta “graficos”: contiene los archivos “grafico1.php” y “grafico2.php” (Maestro/Detalle).
Carpeta “swf_charts”: contiene los archivos “Column3D.swf” y “Pie3D.swf” (para graficar).
Carpeta “js”: contiene el archivo “ajax.js”, necesario para pasar parámetros.
Archivo “contenedores_divs.php”: archivo inicial.


Idea General:
Tendremos un archivo que contendrá 2 DIVs. Uno con ID “maestro_chart” y otro con ID “detalle_chart”.
El DIV “maestro_chart” estará visible desde el principio y contendrá al gráfico 1 (gráfico maestro).
El DIV “detalle_chart” no estará visible al principio. Se visualizará cuando se lo requiera, desplegando el gráfico detalle.
Al abrir el archivo inicial (contenedores_divs.php) se desplegará el primer gráfico (de barras), el cual tendrá “links” para visualizar el gráfico detalle (circular o de torta).

El archivo inicial es “contenedores_divs.php”: Este archivo contiene los DIVs explicados anteriormente. También incluyo el archivo javascript necesario(ajax.js).
Al principio, se desplegará el gráfico 1 (gráfico maestro).

<html>
<head>
<title>Ejemplo Grafico Estadistico II: PHP + FusionCharts </title>
<script language="JavaScript" type="text/javascript" src="js/ajax.js"></script>
</head>
<body>
<table>
<tr>
<td>
<div id="maestro_chart">
<?php include("graficos/grafico1.php"); ?>
</div>
</td>
<td>
<div id="detalle_chart" style="display:none;"></div>
</td>
</tr>
<tr>
<td>
Click en el gráfico 1 para ver el detalle.<br>
Los datos del Grafico detalle dependeran de la barra<br>
seleccionada en el grafico maestro.
</td>
</tr>
</table>
</body>
</html>

Primer gráfico (maestro). Archivo “grafico1.php”: No se explicará todo este archivo, debido a que en el tutorial anterior ya fue explicado detalladamente. Además, en los archivos fuentes, podrán encontrar el código muy bien comentado.
Solo explicaré la parte nueva del código.

Creando los enlaces.
Recordemos que nuestro gráfico contará con 4 barras (Anio1, Anio2, Anio3 y Anio4). Cada uno tendrá un enlace hacia su respectivo gráfico detalle.
En este caso se llama a una función javascript “detalleAnios” (ubicado en el archivo ajax.js) y se le pasan 3 parámetros: Anio correspondiente (título), valor del semestre 1 y valor del semestre 2.
Aclaración: La suma de los valores del semestre 1 y semestre 2 es igual al valor total del año seleccionado.

$linkAnio1 = urlencode("\"javascript:detalleAnios('Anio 1', '210', '100');\"");
$linkAnio2 = urlencode("\"javascript:detalleAnios('Anio 2', '175', '265');\"");
$linkAnio3 = urlencode("\"javascript:detalleAnios('Anio 3', '74', '44');\"");
$linkAnio4 = urlencode("\"javascript:detalleAnios('Anio 4', '50', '95');\"");

Una vez armado los enlaces, ya solo queda por asignar a cada barra:

$strXML .= "<set label = 'Anio 1' value ='".$intTotalAnio1."' color = 'EA1000' link = ".$linkAnio1." />";
$strXML .= "<set label = 'Anio 2' value ='".$intTotalAnio2."' color = '6D8D16' link = ".$linkAnio2." />";
$strXML .= "<set label = 'Anio 3' value ='".$intTotalAnio3."' color = 'FFBA00' link = ".$linkAnio3." />";
$strXML .= "<set label = 'Anio 4' value ='".$intTotalAnio4."' color = '0000FF' link = ".$linkAnio4." />";

El resto del archivo “grafico1.php” está explicado anteriormente.

Archivo “ajax.js”: Este archivo es el encargado de recibir los parámetros enviados por el primer gráfico (anio, valor semestre1, valor semestre2). Luego de recibir estos parámetros, los envía al archivo “grafico2.php” para que los procese y grafique. Una vez procesados estos datos, se desplegará en pantalla el detalle, en el DIV “detalle_chart” que ahora si será visible.

Se comienza creando el objeto “xmlhttp”:

// Creación del objeto
function objetoAjax(){
	var xmlhttp=false;
	try {
		xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
	} catch (e) {
		try {
		   xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
		} catch (E) {
			xmlhttp = false;
  		}
	}

	if (!xmlhttp && typeof XMLHttpRequest!='undefined') {
		xmlhttp = new XMLHttpRequest();
	}
	return xmlhttp;
}
// Función que recibe los parámetros enviados por grafico1.php, desde los enlaces de cada barra.
// Envía esos datos a grafico2.php para que los procese.
// Una vez procesados esos datos, se despliega en pantalla el gráfico detalle en el DIV "detalle_chart" haciendose ahora visible.
function detalleAnios(anio, semestre1, semestre2) {
	detalleDiv = document.getElementById('detalle_chart');
	detalleDiv.innerHTML = "";
	ajax = objetoAjax();
	ajax.open("POST", "graficos/grafico2.php");
	ajax.onreadystatechange = function() {
		if(ajax.readyState == 4) {
				detalleDiv.innerHTML = ajax.responseText
				detalleDiv.style.display="block";
		}
	}
	ajax.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
	ajax.send("anio="+anio + "&semestre1="+semestre1 + "&semestre2="+semestre2)
}

Segundo gráfico (detalle). Archivo “grafico2.php:
Incluimos la Librería necesaria para graficar:

include '../funciones_php/FusionCharts.php';

Obtengo los datos enviados por la función javascript e inicializo $strXML:

$titulo = $_POST['anio'];
$semestre1 = $_POST['semestre1'];
$semestre2 = $_POST['semestre2'];

Concateno los parámetros que voy a usar para graficar.
Defino las propiedades generales para el gráfico:

$strXML = "<chart caption = 'Grafico 2: Detalle ".$titulo."' bgColor='#CDDEE5' baseFontSize='12' >";

Ahora defino lo que será graficado.
En este caso, serán solo dos variables. O sea, será un gráfico circular con dos “porciones” ($semestre1 y $semestre2):

$strXML .= "<set label = 'Semestre 1' value ='".$semestre1."' />";
$strXML .= "<set label = 'Semestre 2' value ='".$semestre2."' />";

Cierro el string $strXML:

$strXML .= "</chart>";

Y finalmente grafico.

echo renderChartHTML("swf_charts/Pie3D.swf", "",$strXML, "detalle", 350, 350, false);

En este tutorial no he explicado en detalle los parámetros para los gráficos por cuestiones de tiempo espacio.
Pueden ver eso en el aterior ejemplo, en donde está bien detallado cada línea del código.

Ejemplo | Descarga Código fuente

También te puede Interesar

¿Disfrutaste esta entrada? Por qué no dejas un comentario abajo y continúas la conversación, o te suscribes a mi feed y obtienes artículos como este enviados a tu lector de feeds.

Comentarios

Amigo… gracias a gente como tu muchisima gente puede conservar su empleo…..
de verdad con tu ejemplo encontre lo que necesitaba saludos desde colombia

Gracias Rigoberto.
Me alegra que te haya servido el trutorial.

Amigo…. una pregunta …
si me podes colaborar..
como podria colocarlos titulos de las columnas eje x de manera que cuando estos sean muy largos me queden a 45 grados su posicion o 90 grados….
gracias…

Para que los títulos queden en 90º.
En la variable $strXML debes agregar esto:

labelDisplay=’ROTATE’

en la parte en donde declarás esto:

$strXML = “[chart caption = 'Grafico 2: Detalle ".$titulo."' bgColor='#CDDEE5' baseFontSize='12' ]“;

Al final debería quedar así:

$strXML = “[chart caption = 'Grafico 2: Detalle ".$titulo."' bgColor='#CDDEE5' baseFontSize='12' labelDisplay='ROTATE']“;

Recordá reemplazar los Corchetes por los signos Mayor y Menor respectivamente.
Cualquier duda, escribilo por acá.

Hola que tal, la información que brindaste es muy buena, gracias por eso…ahora te presento una duda para ver si me puedes ayudar, yo necesito hacer un Multi-Series Chart XML, que compare varios datos de una tabla..me explico a un id le pertenecen varias cantidades según una fecha, hasta el momento con un solo conjunto de datos de un id lo e logrado

$strXML.= “”;

, sin embargo no encuentro la manera de comparar esto con otro conjunto de datos del mismo id..ya q si repito esta linea con el otro conjunto de valores no llega al resultado que espero,

$strXML.= “”;

No se si me puedas ayudar un poco..igual muchas gracias y saludos desde Venezuela

ahh se me olvido mencionar..estoy trabajando con php consultando datos de una tabla en mysql..noc si sea relevante pero por si acaso..hasta luego..gracias de nuevo.

Muy interesante amigo,quisiera tambien realizar grafica de linea, como consigo los archivos, asi como el Pie3D.SWF que es el pastel, por ejemplo tengo un sistema que esta en PHP y la base de datos en POSTGREs, como enlazar los reportes estadisticos que me va a generar.GRACIAS espero su ayuda.

Hola gente.
Sobre el pedido de Jonathan Ruiz y Jorge:
Este Sábado (7 de Marzo) pondré un nuevo tutorial sobre Multi-Series Chart y Gráficos de Líneas.
Podrán descargar los archivos de ejemplo así como pudieron descargar estos.

Sobre el motor de Base de datos, no tiene importancia, ya que solo deberían cambiar el string de conexión y funciona para cualquier motor.

Saludos y estén atentos.

ok..estare al pendiente entonces…muchas gracias por eso amigo , que la pases bien.

Hola que tal…me gustaria saber si lograste montar el otro ejemplo????…gracias…

Si, ya está. Miralo en este enlace:

http://micodigobeta.com.ar/?p=229

ok..dejame darle una repasadita…muchas gracias compañero

Hola alguien me puede decir como hago para que cuando un valor 1645 salga 1645 y no 1.6K

Una pregunta: una vez obtenido el gráfico, cual es metodo mas practico para imprimir el grafico obtenido? estoy trabajando con PHP y MySQL.

Gracias!!!

Yuri, a qué te referís con imprimir el gráfico ??
Para imprimirlo en pantalla se utiliza la función renderChartHtml (que se encuentra en el archivo fusionChart.php).
Para imprimirlo en hoja, simplemente con el método print de javascript.

Juan, para eso, tenes que agregar esto (en la línea 20):

formatNumberScale=’0′

y

thousandseparator=’.’

————————————————–

formatNumberScale=’0′ –> para que aparezca 1645 en vez de 1.6k
thousandseparator=’.’ –> para que el separador de miles sea el punto.

En si, debería quedarte así la línea 20 del código fuente:

$strXML = “[chart caption = 'Grafico 1: Maestro' bgColor='#CDDEE5' baseFontSize='12' showValues='1' xAxisName='Anios' formatNumberScale='0' thousandseparator='.']“;

Recuerda reemplazar los corchetes por los signos mayor y menor respectivamente.

Hola que tal, nuevamente yo, con la info que publicaste creeme que me has ayudado un monton, y ahora estoy montado en una grafica muy parecida a este maestro detalle, la diferencia es que mi maestro en un char combinado, es uno que combina uno de barra con uno de lineas, y el detalle uno multiserie, pero tengo dos cosas que me tienen bloqueado, primero por mas q busco aun no tengo el swf de ese grafico en particular, solo tengo el q combina multiserie con lineas, y el multiserie, si por casualidad lo tienes te estaria agradecidisimo y dos si tienes algun ejemplo de eso,,, se q es mucho pedir pero bue..asi todos aprendemos algo nuevo…igual son graficos a consultas de base de datos

Jonathan dame unos días y pongo el ejemplo que pedís.

ok…gracias por todo….

Saludos desde Bolivia, estoy sorprendido de nuevo, mil gracias.

Estimado.

Primero que nada felicitaciones por tu blog, esta muy bueno.

Mi consulta es:

¿como puedo generar una funcion que me actualize el grafico segun una consultaa traves de ajax?

Phpero, en este ejemplo hay una actualización de un gráfico según una consulta enviada desde javascript.

En principio tenemos solo un gráfico. Al hacer click en ese gráfico (más precisamente en alguna barra del gráfico), se envían parámetros ,a través de javascript (usando el objeto xmlhttp), los cuales llegan al archivo php que muestra en pantalla el 2do gráfico.

Podrías actualizar el gráfico a través de un combo (evento change), un enlace, etc.

En otras palabras, en este ejemplo se actualiza un gráfico a través de ajax.
Si no es esto lo que preguntabas, escribe algún ejemplo de lo que quieres.

Saludos y gracias por el comentario.

Gracias por responder tan rapido.

Imaginate que hay un combo con:

empresa 1
empresa 2.

Al seleccionar un combo me muestra la tabla en un campo id (esto es a traves de ajax).
Lo que necesito es ademas de mostrar la información es graficar los datos procesados.

Muchas gracias por tu pronta respuesta

Phpero:

1 – Supongamos que tienes un combo:

* select name=”combo” onchange=”funcion_actualiza_div(parametros)”

Con eso llamamos a la función (javascript) “funcion_actualiza_div” a la cual le envías los parámetros necesarios.

2 – La función javascript (voy a obviar la creación del objeto xmlhhtprequest):

Lo que se hace es enviar los parámetros necesarios al archivo PHP. Esos parámetros servirán para mostrar la tabla de la empresa seleccionada en el combo.
Supongo que esos parámetro se usarán para una consulta a la base de datos. Y con el resultado de esa consulta vendrán los datos para graficar.

function funcion_actualiza_div(parametros) {
miDiv = document.getElementById(‘div’);
miDiv.innerHTML = “”;
ajax = objetoAjax();
ajax.open(“POST”, “archivo.php”);
ajax.onreadystatechange = function() {
if(ajax.readyState == 4) {
miDiv.innerHTML = ajax.responseText
miDiv.style.display=”block”;
}
}
ajax.setRequestHeader(“Content-Type”,”application/x-www-form-urlencoded”);
ajax.send(parametros);
}

3 – Actualización del div (en donde mostrás el gráfico y la tabla).

El archivo PHP devuelve un resultado, que sería la impresión en pantalla de la tabla, y la impresión del gráfico por pantalla.

La impresión del gráfico por pantalla ya lo tenés con estos ejemplos.
La impresión de la tabla (que vos quieras mostrar) es simplemente un conjunto de “echo” de las variables de la base de datos.

Mirá este ejemplo de cómo graficar para sacarte más dudas.

http://micodigobeta.com.ar/?p=48

Muchas gracias por tu respuesta.

He podido solucionar mi rpoblema.

Gracias por tu pronta respuesta.

me fue de gran ayuda tu aporte, pero quisiera hacer que los graficos que se generan se puedan exportar a excel , como hacer eso, de antemano te doy las gracias por la ayuda que me puedas brindar

Hola Mariela.
No he probado exportar a Excel estos gráficos.
Hay que tener en cuenta que son gráficos en formato SWF. Quizás sea un inconveniente a la hora de exportarlo a Excel.

Incluso no logré exportarlo a PDF.

Podrías seguir este tutorial: http://micodigobeta.com.ar/?p=372
Allí tienes para exportar a Excel, e incluso con esos datos puedes graficar de forma automática.

Saludos

Hola

Alguien me puede ayudar.

Tengo un PIE3D, pero lo que me gustaria es que muestre los porcentajes y cuando le pase el mouse muestre la cantidad.

creen que se pueda ???.

Hola Juan.
Estuve mirando la documentación de FusionCharts, pero no encontré información sobre lo que necesitás.

Este es el sitio de la documentación:

http://www.fusioncharts.com/docs/

Quizás encuentres algo allí.
Saludos.

Excelente!!!! Felicitaciones!!! Gracias!!

como puedo hacer para realizar un grafico en barras parecido StackedColumn3D pero que no tenga escrito en la cabecera fushion chart

Hola Mariela.
Si puedo esta misma tarde respondo tu pregunta.
Estoy reinstalando varios programitas, asi ni bien pueda te respondo.
Saludos

Hola. Muy bueno tu tutorial. Tengo algo parecido (ajax con php), pero trato de regresar dos graficos con una titulos en html asi que en php trato de regresarlos concatenados:

echo “Primer grafico”.displaychart1.”Grafico 2.displaychart2;

Las funcioes displaychartx procesan los datos en la variable $strXML y hacen el render del grafico.
El problema es que primero me aparecen los graficos uno seguido de otro y los titulos me aparecen despues. Sabes como podria hacer que me aparezcan en orden con sus titulos (titulo 1, grafico 1, titulo 2, grafico 2). Ya intente alinearlos en una tabla de 1 columna x 4 lineas per ni asi funciona.
Saludos

olvide unas comillas en la linea de php
echo “Primer grafico”.displaychart1.”Grafico 2″.displaychart2;

hola, tengo una pregunta, hay alguna propiedad para hacer que la grafica cresca conforme el numero de campos aumenta ya que al tener un tamaño fijo llega un momento en que los datos ya no se distinguen.
Agradesco su ayuda

Isabel, no existe tal propiedad.
También me encontré con ese problema.
Te sugiero una solución, no es muy elegante pero es práctica:

Lo que podrías hacer es calcular el ancho del gráfico de acuerdo a la cantidad de barras que tendrá.

Por ejemplo: Para 15 barras, el ancho de 500px es perfecto.
Luego de eso, si tenés más de 15 barras podrías ir aumentando por cada barra que se agregue. Por ejemplo 20px.

Entonces tendrías que crear una variable con un tamaño mínimo para el gráfico:

$tamano = 500;

Por cada barra, aumentamos:

$tamano += 20;

Al final asignamos ese tamaño al gráfico.

ok muchas gracias por tu ayuda, ha sido de gran utilidad¡¡¡¡

Hola te felicito muy interesante, pero tengo un inconveniente, es que debo realizar un modulo estadistico en php y veo todo los codigos y me pregunto por donde empezar? html, dreamweaver..otros?

Te agradezco me puedas ayudar.

Hola Jasmine.
Deberías tener un conocimiento básico sobre HTML y PHP para hacer estos gráficos.
Si no los tienes, puedes buscar por internet. Hay muchos manuales y tutoriales.

HTML: http://www.google.com.ar/#hl=es&q=tutorial+html&meta=lr%3Dlang_es&aq=&oq=&fp=3291d68c1385e80

PHP: http://www.google.com.ar/#hl=es&q=tutorial+php&meta=lr%3Dlang_es&aq=&oq=&fp=3291d68c1385e80

Saludos

Hola a todos.. tengo una pregunta… estaba revisando queria saber como puedo modificar la escala del grafico… seria de gran ayuda…

Muy util, gracias por la información, solo una duda, es mejor trabajarlos en Dreamweaver verdad?

smv1404: En realidad podés usar cualquier editor de texto para programar en PHP. Personalmente uso netbeans con el plugin. Pero Dreamweaver también sirve. Aveces suelo usarlo más que nada para el diseño de sitios.
Pero para este tutorial podés usar cualquier editor. Notepad++ es un buen editor.

Primero que todo muchas gracias por la información, esta muy bien explicada y me ha sido de gran ayuda, mi pregunta es ¿como logro los colores en degradado en las graficas 3d ?

Alejandro, te recomiendo que leas la documentación en el sitio oficial:

http://www.fusioncharts.com/

Allí encontrarás la respuesta.
Saludos

Deja un Comentario

(requerido)

(requerido)