Hola amigos! De nuevo aquí... Estoy haciendo el pfc, donde estoy incluyendo un par de graficotes que los hago con JpGraph. Bien, he sido capaz de hacer una tarta en 3d y un grafico de barras simple. Ahora, estoy intentando hacer un grafico de barras compuesto de varias barras (en el eje de las Y los valores numericos, cantidades, y en el eje de las X'x los meses del año, por cada año una barra en cada mes). Es todo dinámico, saco los datos de una base de datos, los ordeno y los pongo como quiere jpgraph para hacer los Graph... Parece que todo marcha bien, pero me estoy volviendo loco debido a un problema:JpGraph Error: 25067 - Your manually specified scale and ticks is not correct. The scale seems to be too small to hold any of the specified tick marks.
Me he vuelto loco buscando en sitios, y me estoy retrasando en la planificación. Por ello acudo a vosotros....
Os esplico como va el codigo: antes de hacer nada con jpgraph os he comentado que ordeno los datos. Esos datos estarán dentro de un array y tienen este aspecto:
array (
[año] => array(
0 => cantidad
1 => cantidad
2 => cantidad
3 => cantidad
4 => cantidad
5 => cantidad
6 => cantidad
7 => cantidad
8 => cantidad
9 => cantidad
10 => cantidad
11 => cantidad
)
)
Vamos, un array que contiene años, siendo cada año otro array que contendrá los meses del año con sus respectivas cantidades (que poco interesa saber aquí..).
El código es el siguiente:
Código PHP:
<?php
include_once ('../../funciones/funciones_comunes.php');
include_once('../../../jpgraph/jpgraph.php');
include_once ('../../../jpgraph/jpgraph_bar.php');
//Conseguimos las fechas
/*$fecha_inicio = unixToMySQL($_SESSION["estadisticas_fecha_inicio_unix"]);
unset($_SESSION["estadisticas_fecha_inicio_unix"]);
$fecha_fin = unixToMySQL($_SESSION["estadisticas_fecha_fin_unix"]);
unset($_SESSION["estadisticas_fecha_fin_unix"]);
*/
////////////////////////////////////////////////
$fecha_inicio = time() - (550*24*60*60);
$fecha_fin = $fecha_inicio + (550*24*60*60);
$fecha_inicio = date("m-Y", $fecha_inicio);
$fecha_fin = date("m-Y", $fecha_fin);
$fecha_inicio = strtotime("01-".$fecha_inicio);
$fecha_fin = strtotime("01-".$fecha_fin);
$fecha_inicio = unixToMySQL($fecha_inicio);
$fecha_fin = unixToMySQL($fecha_fin);
//echo $fecha_inicio . "<br />";
//echo $fecha_fin . "<br />";
/////////////////////////////////////////////////
$datos_de_bd = obtenerNumeroInformesIncidenciasEntre2Fechas($fecha_inicio, $fecha_fin);
$datos_ordenados_y_preparados = array();
$anio_inicio = (int) substr($fecha_inicio, 0, 4);
$mes_inicio = (int) substr($fecha_inicio, 5, 2);
$anio_fin = (int) substr($fecha_fin, 0, 4);
$mes_fin = (int) substr($fecha_fin, 5, 2);
//echo $anio_inicio . "-" . $mes_inicio . "............." . $anio_fin . "-" . $mes_fin . "<br />";
$salir_de_anio = false;
$mes = $mes_inicio;
$anio = $anio_inicio;
while ( !$salir_de_anio ){
$salir_de_mes = false;
$no_anadimos = false;
while( !$salir_de_mes ){
if( $mes >= 12 ){
$salir_de_mes = true;
if ( $mes > 12 ) $no_anadimos=true;
}else if( $anio == $anio_fin && $mes == $mes_fin ){
$salir_de_mes = true;
}
if( !$no_anadimos ){
if( $mes < 10 ){
$id = $anio."-0".$mes;
}else{
$id = $anio."-".$mes;
}
$datos_ordenados_y_preparados[$id] = array("date" => $id, "ocurrencias" => 0);
$mes++;
}
}
if( $anio == $anio_fin && $mes-1 == $mes_fin ){
$salir_de_anio = true;
}else{
$anio++;
$mes = 1;
}
}
//print_r($datos_ordenados_y_preparados); echo "<br />";
//Ya tenemos la base, ahora solo nos queda anadir las ocurrencias:
//print_r($datos_de_bd);
foreach ( $datos_de_bd as $dato ){
$datos_ordenados_y_preparados[$dato["date"]]["ocurrencias"]++;
}
//print_r($datos_ordenados_y_preparados); echo "<br />";
//Preparamos el array de los datos y recreamos el array con las etiquetas del graficote:::
$variables = array(); //contendra las variables creadas
foreach ( $datos_ordenados_y_preparados as $parte ){
$anio_parte = substr($parte["date"], 0, 4); //echo "$anio_parte <br />";
$mes_parte = substr($parte["date"], 5, 2); //echo "$mes_parte <br />";
$array_datos_anio = "datos" . $anio_parte; //echo "$array_datos_anio <br />";
if( !isset($$array_datos_anio) ){
$$array_datos_anio = array("0" => 0, "1" => 0, "2" => 0, "3" => 0, "4" => 0, "5" => 0, "6" => 0, "7" => 0, "8" => 0, "9" => 0, "10" => 0, "11" =>0);
$variables[$anio_parte] = $$array_datos_anio;
}
$variables[$anio_parte][$mes_parte-1] = $parte["ocurrencias"];
}
//print_r($variables); echo "<br />";
/*
• De aqui en adelante, todo lo que tiene que ver con el jpGraph.
• * since now, everything connected to jpgraph.
*/
// Creamos el grafico.
$graph = new Graph(700,300,'auto');
$graph->SetScale("textlin");
$graph->SetY2Scale("lin",0,90);
$graph->SetY2OrderBack(false);
$graph->SetShadow();
$graph->img->SetMargin(40,30,20,40);
//El tema (estilo del grafico, conjunto de colores...):
$tema = new UniversalTheme();
$graph->SetTheme($tema); //lo anadimos
$graph->yaxis->SetTickPositions(array(0,5,15,25), array(10,20,30));
$graph->y2axis->SetTickPositions(array(10,20,30));
//Preparamos las etiquetas para los meses
$meses = $gDateLocale->GetShortMonth();
$graph->SetBox(false);
$graph->ygrid->SetFill(false);
$graph->yaxis->HideLine(false);
$graph->yaxis->HideTicks(false,false);
$graph->yaxis->scale->SetGrace(20);
//Asignamos los meses como etiquetas del eje de las X
$graph->xaxis->SetTickLabels($meses);
//Depende de cuantos anios tengamos, crearemos mas barras o no:
$array_colores = array(
0 => "#8A0808",
1 => "#DF7401",
2 => "#AEB404",
3 => "#74DF00",
4 => "#01DF74",
5 => "#088A85",
6 => "#0080FF",
7 => "#0101DF",
8 => "#9A2EFE",
9 => "#585858",
);
$cont = 0;
$graficos = array();
for ($i = $anio_inicio; $i <= $anio_fin; $i++){
$nombre = "plot" . $i;
$$nombre = new BarPlot($variables[$i]);
//para que se muestre el valor en las barras
$$nombre->value->Show();
$$nombre->value->SetFormat("%d"); //valores enteros
$$nombre->value->SetFont(FF_FONT1,FS_BOLD); //fuente
$$nombre->SetValuePos('center'); //que se muestre en el medio
$$nombre->SetColor($array_colores[$cont]);
$$nombre->SetFillColor($array_colores[$cont]);
$$nombre->SetLegend($i);
$graficos[] = $$nombre;
$cont++;
}
//print_r($graficos);
//Creamos el diagrama agrupado:
$gbplot = new GroupBarPlot($graficos);
//lo anadimos el grafico
$graph->Add($gbplot);
//Anadims titulo al graficote
$graph->title->Set("Graficote");
//Mostramos el grafico
$graph->Stroke();
?>