------------------------------------------------------------------------------- $Id: Graph.php 428 2003-11-18 14:30:30Z mmarre $ -----------------------------------------------------------------------------*/ require_once 'MECON/Graph/external/jpgraph/src/jpgraph.php'; /** * Liberia base para el manejo de graficos. */ class MECON_Graph { /** * Tipo del grafico (xy, torta, gantt) * @var int $ancho * @access private */ var $_tipo; /** * Ancho del grafico. * @var int $ancho * @access private */ var $_ancho; /** * Alto del grafico. * @var int $alto * @access private */ var $_alto; /** * El grafico propiamente dicho. * @var Graph $grafico * @access private */ var $_grafico; /** * Booleano que define si se muestran o no los valores * @var bool $verValores * @access private */ var $_verValores; /** * Class constructor. * * @param string $tipo Tipo de grafico(xy,torta,torta3D,gantt) * @param int $ancho Ancho del grafico * @param int $alto Alto del grafico * @param string $titulo Titulo del grafico. * @param array $attrib_gral Contiene opciones generales para el gráfico. * * Opciones generales para gráficos XY: * - XTitulo (Título del Eje X) * - YTitulo (Título del Eje Y) * - XEtiquetas (Array de Referencias del eje X) * - XEtiquetasRotar (Rota las etiquetas del eje X en 90 grados) * - margenes (array asociativo con alguna/s de las siguientes claves: * - L (margen izquierdo) * - R (margen derecho) * - T (margen superior) * - B (margen inferior)) * * @return void * @access public */ function MECON_graph($tipo, $ancho=300, $alto=200,$titulo,$attrib_gral=NULL) { $this->_tipo=$tipo; $this->_ancho= $ancho; $this->_alto= $alto; if (isset($attrib_gral['verValores'])) $this->_verValores= $attrib_gral['verValores']; if($this->_tipo=="xy") { $this->_grafico= new Graph($ancho,$alto,"auto"); $this->_grafico->SetScale("textlin"); if (isset($attrib_gral['Xtitulo'])) $this->_grafico->xaxis->title->Set($attrib_gral['Xtitulo']); if (isset($attrib_gral['Ytitulo'])) $this->_grafico->yaxis->title->Set($attrib_gral['Ytitulo']); if (isset($attrib_gral['XEtiquetas'])) $this->_grafico->xaxis->SetTickLabels($attrib_gral['XEtiquetas']); if (isset($attrib_gral['XEtiquetasRotar'])) $this->_grafico->xaxis->label_angle = 90; } if(($this->_tipo=="torta")||($this->_tipo=="torta3D")) { require_once 'MECON/Graph/external/jpgraph/src/jpgraph_pie.php'; require_once 'MECON/Graph/external/jpgraph/src/jpgraph_pie3d.php'; $this->_grafico= new PieGraph($ancho,$alto); } //Atributos en comun if (isset($titulo)) $this->_grafico->title-> Set($titulo); if (isset($attrib_gral['subTitulo'])) $this->_grafico->subtitle->Set($attrib_gral['subTitulo']); if (isset($attrib_gral['verSombra']) and $attrib_gral['verSombra']==true) $this->_grafico->SetShadow(); if (isset($attrib_gral['margenes'])){ if (isset($attrib_gral['margenes']['L'])) $this->_grafico->img->left_margin = $attrib_gral['margenes']['L']; if (isset($attrib_gral['margenes']['R'])) $this->_grafico->img->right_margin = $attrib_gral['margenes']['R']; if (isset($attrib_gral['margenes']['T'])) $this->_grafico->img->top_margin = $attrib_gral['margenes']['T']; if (isset($attrib_gral['margenes']['B'])) $this->_grafico->img->bottom_margin = $attrib_gral['margenes']['B']; } } /** * Agrega Secuencia de datos. * * @param array $tipo Tipo de grafico para la secuencia * @param array $secuencia Datos del arreglo * @param array $atributos Atributos especiales para la secuencia * * Tipos de secuencias para gráficos xy: * - lineas * - barras * - puntos * * Atributos: * - color * - colorRelleno (solamente barras y puntos) * - leyenda * - impulso ("si") (solamente para puntos) * - tipoMarca (de 1 a 17) (solamente para puntos) * - etiquetas (array) (para gráficos de torta muestra las etiquetas * en lugar de los porcentajes) * - tema ("earth", "pastel", "water", "sand") * (para gráficos de torta, permite cambiar el esquema de colores) * (es "earth" por default) * - explotar (para torta y torta3D) (valor que indica la separación de * de las porciones de la torta) * - posLeyenda (array con dos coordenadas para la posición de la leyenda) * - formatoValores (string con el formato que se quiere dar a los valores * (sprintf)) * - noAgregar (Si está seteado indica que la secuencia se genera pero no * se agrega al gráfico. Se utiliza para gráficos de barras * acumulativos, donde las secuencias deben agregarse todas * juntas al final) * * @return plot * @access public */ function agregarSecuencia($tipo,$secuencia,$atributos=NULL) { if($this->_tipo=="xy") { $valido=false; if ($tipo=="lineas") { $valido=true; require_once 'MECON/Graph/external/jpgraph/src/jpgraph_line.php'; $plot= new LinePlot($secuencia); if (isset($atributos['colorRelleno'])) $plot->SetFillColor($atributos['colorRelleno']); } if ($tipo=="barras") { $valido=true; require_once 'MECON/Graph/external/jpgraph/src/jpgraph_bar.php'; $plot= new BarPlot($secuencia); if (isset($atributos['colorRelleno'])) $plot->SetFillColor($atributos['colorRelleno']); } if ($tipo=="puntos") { $valido=true; require_once 'MECON/Graph/external/jpgraph/src/jpgraph_scatter.php'; $plot= new ScatterPlot($secuencia); if (isset($atributos['tipoMarca'])) $plot->mark->SetType($atributos['tipoMarca']); if (isset($atributos['impulso'])) { if ($atributos['impulso']=="si") $plot->SetImpuls(); } } //Si hubo error if ($valido==true) { // Seteo opciones generales if (isset($atributos['formatoValores'])) $plot->value->format = $atributos['formatoValores']; if ($this->_verValores) $plot->value->Show(); if (isset($atributos['color'])) $plot->SetColor($atributos['color']); if (isset($atributos['leyenda'])) { $plot->SetLegend($atributos['leyenda']); //$this->_grafico->legend->SetLayout(LEGEND_HOR); $this->_grafico->legend->Pos(0.02,0.01); } }else { trigger_error ("Error: Tipo de grafico $tipo no valido (aun)", E_USER_ERROR); } }//del if tipo xy if(($this->_tipo=="torta")||($this->_tipo=="torta3D")) { if($this->_tipo=="torta") $plot= new PiePlot($secuencia); if($this->_tipo=="torta3D") $plot= new PiePlot3D($secuencia); // Esto lo agrego porque si no, no redondea a 100% $plot->labeltype = 2; if ($this->_verValores) $plot->value->Show(); if (isset($atributos['leyendas'])) $plot->SetLegends($atributos['leyendas']); if (isset($atributos['tema'])) $plot->SetTheme($atributos['tema']); if (isset($atributos['etiquetas'])) $plot->SetLabels($atributos['etiquetas']); if (isset($atributos['centro'])) { $x=$atributos['centro'][0]; $y=$atributos['centro'][1]; $plot->SetCenter($x,$y); } if (isset($atributos['explotar'])) $plot->ExplodeAll($atributos['explotar']); }// del if torta if (isset($atributos['posLeyenda'])) { $this->_grafico->legend->xpos = $atributos['posLeyenda'][0]; $this->_grafico->legend->ypos = $atributos['posLeyenda'][1]; } if (!isset($atributos['noAgregar'])) $this->_grafico->Add($plot); return $plot; } /** * Acumula las secuencias para generar un gráfico acumulativo de barras * * Ejemplo de Uso: * @code * require_once 'MECON/Graph.php'; * * $v1 = array(12,8,19,3,10,5); * $v2 = array(1,28,9,13,1,5); * * $graph =& new MECON_Graph ("xy", 300, 300, 'PRUEBA'); * * $b1plot = $graph->agregarSecuencia("barras", $v1); * $b2plot = $graph->agregarSecuencia("barras", $v2); * * $graph->acumular(array($b1plot, $b2plot)); * $graph->generar(); * * @endcode * * @param array $secuencias Secuencias de barras a acumular * * @return void * @access public */ function acumular ($secuencias) { $rgb = new RGB(); $colores = array_keys ($rgb->rgb_table); // Esto pinta cada secuencia de un color diferente for ($i=0; $i< count($secuencias); $i++) $secuencias[$i]->SetFillColor ($colores[$i]); $accplot = new AccBarPlot($secuencias); $this->_grafico->Add($accplot); } /** * Genera el gráfico y lo dibuja. * * @return void * @access public */ function generar() { $this->_grafico->Stroke(); } /** * Convierte los valores numéricos de entrada en porcentajes * * Ejemplo de uso: * @code * require_once 'MECON/Graph.php'; * * $valores = array (4, 6, 23, 14, 30); * $nuevos = MECON_Graph::porcentajes($valores); * * // se obtiene (5, 8, 30, 18, 39) (%) * * @endcode * * @param array $valores Array de valores numéricos * * @return array * @access public * @static */ function porcentajes ($valores) { require_once 'MECON/Graph/external/jpgraph/src/jpgraph_pie.php'; $plot = new PiePlot ($valores); $porciento = $plot->AdjPercentage ($valores); return $porciento; } }