jueves, 1 de agosto de 2013

JpGraph: Grafíca de 2 barras

En este ejemplo vamos a crear una gráfica con 2 barras, este ejercicio lo publico gracias a un comentario de uno de nuestros amigos anonimos jeje.
Es muy sencillo, el desarrollo del plano de la gráfica es el mismo que con los otros ejemplos, lo que cambia es que vamos a ir creando "plots" (barras), y las vamos a agrupar para añadirlas al plano.
El ejemplo se verá como la siguiente imagen.




Cabe mencionar que la librería JpGraph tiene una carpeta llamada Examples y de ahí pueden ver muchos ejemplos como los que les comparto en este blog, (claro que no tan bien explicados verdad jejej XD) pero con muchos trucos e ideas para que los adapten a sus gráficas.

OK le pongo el código
y más abajo explico un poco.



<?php // content="text/plain; charset=utf-8"
require_once ('../jpgraph.php');
require_once ('../jpgraph_bar.php');

$datay=array(20,30,50);
$datay2=array(15,55,10);
$datazero=array(0,0,0);


// Crear la gráfica
$graph = new Graph(480,200,"auto");
$graph->title->Set('Ejemplo con dos barras');


// Ingresar las escalas para  Y(barra1) y Y2(barra2)
$graph->SetScale("textlin");
$graph->SetY2Scale("lin");
$graph->yaxis->scale->SetGrace(10);
$graph->y2axis->scale->SetGrace(5);
$graph->ygrid->SetColor('gray','lightgray@0.5');


// Colores de los datos de Y
$graph->y2axis->SetColor('darkred');


// Crea la barra 0 para dar espacio
$bplotzero = new BarPlot($datazero);


// Crea la primer Y (barra1)
$ybplot1 = new BarPlot($datay);
$ybplot1->value->Show();
$ybplot = new GroupBarPlot(array($ybplot1,$bplotzero));


// Crea la "Y2" (barra2)
$ybplot2 = new BarPlot($datay2);
$ybplot2->value->Show();
$ybplot2->value->SetColor('darkred');
$ybplot2->SetFillColor('darkred');
$y2bplot = new GroupBarPlot(array($bplotzero,$ybplot2));
 // Añade las barras agrupadas al plano
$graph->Add($ybplot);
$graph->AddY2($y2bplot);


//Se envia al navegador
$graph->Stroke();
?> 



Como pueden ver la gráfica se crea igual que los otros ejemplo,  la diferencia es que vemos unos datos nuevos como son SetY2scale y2axis, en estos dos atributos van las escalas para los datos de la barra2.

Con $graph->ygrid->SetColor('gray','lightgray@0.5'); vamos hacer visible las lineas que dividen los valores del eje Y si omitimos este paso se van a ver muy tenues, y lo que estoy haciendo es darle un color gris que aunque es ligth hará que se visualicen mejor las lineas.

Con $graph->y2axis->SetColor('darkred'); le estoy indicando que los valores  del eje Y se vean de color rojo casi vino.

Despues tenemos esta línea que es el truco $bplotzero = new BarPlot($datazero); estamos creando una barras sin ningun valor, como pueden ver en la parte superior del código inicializamos la variable $datazero como array pero con valores de 0 , lo que vamos a hacer es que esta barra nos va a servir de separador al agrupar.

Despues viene la creación de la barra 1, las primeras lineas ya las hemos visto en los ejemplos la nueva linea será $ybplot = new GroupBarPlot(array($ybplot1,$bplotzero));  aquí vamos a crear un grupo de barras que será la barra1 y la barra0.
Esa misma linea la ponemos para la barra2 y de la misma forma es para agrupar y la agruparemos igual con la barra0. $y2bplot = new GroupBarPlot(array($bplotzero,$ybplot2));

Lo último es añadirlo al plano $graph y como pueden ver tenemos dos Add,  en el primero añadimos el primer grupo que es la variable $ybplot (la barra0 y la barra1 agrupadas) y en la segunda linea de AddY2  agregamos la variable $y2bplot (la barra0 y la barra2 agrupadas). Despues la mostramos en el navegador con $graph->Stroke();  y LISTO!!!!

Entonces no se trata de hacer planos o $graph=new Graph muchas veces si no que hay que añadir barras y despues añadirlas a un solo plano ($graph).

Espero que les sirva este ejemplo. No olviden dejar sus comentarios, quejas, sugerencias y demás (menos insultos ok). 

"Programar no tiene que ser tan difícil como parece...."

11 comentarios:

  1. Saludos

    Gracias por tu aporte, me gustaría saber si puedo poner dos tipos de gráficas y mostrarlas en una sola pagina, ejemplo: Graficas de tarta y grafica de lineas, Si tienes de casualidad un ejemplo te lo agrade seria mucho

    ResponderEliminar
    Respuestas
    1. Si se puede, pero mi duda es quieres saber como poner dos gráficas diferentes en una sola imagen o dos gráficas diferentes en una sola pantalla

      Eliminar
    2. Si son dos diferentes en una sola página lo unico que tienes que hacer es mandar llamar dos elementos de imagen.

      En estos ejemplos solo cargo los PHP pero para madarlos llamar en una página html checa mi otro tutorial
      http://easy-codigo.blogspot.mx/2012/06/graficas-con-jpgraph.html

      Eliminar
  2. Buenos días, lo primero de todo felicitarte, tus explicaciones me han sido de gran ayuda y me han resuelto muchas dudas, el problema que tengo es que quiero mostrar algo de este estilo:


    imagen php


    Donde por cada usuario quiero mostrar la imagen de su grafica. Lo compilo y lo curioso es que me saca tantas graficas como usuarios tengo en la misma página, una detrás de otra, pero todas son iguales. Extrañamente solo se queda con los arreglos de la última iteracion y si son 3 usuarios, muestras 3 graficas exactamente iguales, tomando siempre el valor de la última vuelta. Si me pudieras orientar sobre el posible error te lo agradecería muchísimo. Al principio pensé que igual arrastraba los valores de los arrays y en cada vuelta me aseguraba que quedaban liberados para tomar los nuevos valores con un unset, pero aún así tampoco he resuelto nada..
    Un saludo y muchas muchas gracias!

    ResponderEliminar
  3. Soy la chica del comentario anterior, no puedo publicar el codigo.. no se si se entiende bien lo que he escrito.. tengo un documento html desde el cual genero codigo php para recorrer por cada usuario y recoger sus arrays para el eje x y el eje y de cada grafica. Llamo a la imagen y me la imprime tantas veces como usuarios recorro. Pero solo se queda con los arrays del ultimo usuario.. espero que asi se entienda mejor.. disculpa las molestias.. :(

    ResponderEliminar
    Respuestas
    1. como le pasas el arreglo al codigo de la grafica.

      Eliminar
    2. Lo coge directamente en el foreach, ahí le asigo el valor al array y cuando llamo a la imagen ya coge los valores, porque dentro de la imagen le tengo puesto que los coja. Estan declarados como variables de sesion, tanto el eje x como el eje y.. intenté pasarlos como si la imagen fuera una funcion, pero me parece que es imposible.. hace poco que estoy manejando este paquete de graficos y se me escapan muchas cosas.. :(

      Eliminar
    3. Al margen de la duda anterior.. tengo otra.. es posible al crear un grafico de barras conseguir que cada barra se dibuje con un color diferente??

      Eliminar
    4. Hola pues mira a veces me es imposible poder ayudar a orientar esos errores que les generan por que todos programamos diferente pero checa este http://easy-codigo.blogspot.mx/2013/04/graficas-con-jpgraph-desde-un.html haber si a lo mejor te ayuda a ver un ejemplo dee como pasarle valores a las graficas. jpGraph aveces es muy "nena" y marca errores por muchas tonterias.
      en cuanto a lo de los colores la verdad aun no e podido hacerlo

      Eliminar
    5. Muchas gracias por todo! se agradece muchísimo la atención! voy a ver si consigo solucionar lo de los gráficos, el ejemplo que muestras ya lo había probado parecido en gráficos de barras y en gráficos lineales, y hasta ahí todo bien, el problemas era al hacer comparativas en gráficos con sectores, por eso quería mostrar una imagen por usuario con los resultados de cada uno en la misma página.. Los colores de momento también los voy a tener que dar por imposible.. :( muchas, muchas gracias de todos modos!!

      Eliminar
  4. como coloco los valores arriba de la barra

    ResponderEliminar