]> git.llucax.com Git - mecon/meconlib.git/blob - lib/MLIB/Graph.php
Se agrega un objeto que permite armar tablas html a partir de templates.
[mecon/meconlib.git] / lib / MLIB / Graph.php
1 <?php /* vim: set binary expandtab tabstop=4 shiftwidth=4 textwidth=80:
2 -------------------------------------------------------------------------------
3                                     mlib
4 -------------------------------------------------------------------------------
5 This file is part of mlib.
6
7 mlib is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 2 of the License, or (at your option)
10 any later version.
11
12 mlib is distributed in the hope that it will be useful, but WITHOUT
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
14 FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
15  
16 You should have received a copy of the GNU General Public License; if not,
17 write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
18 Boston, MA  02111-1307  USA
19 -------------------------------------------------------------------------------
20 Creado: Tue Nov 26 12:45:31 2003
21 Autor:  Manuel Nazar Anchorena <manazar@mecon.gov.ar>
22 -------------------------------------------------------------------------------
23 $Id: Graph.php 428 2003-11-18 14:30:30Z mmarre $
24 -----------------------------------------------------------------------------*/
25
26 require_once 'MLIB/Graph/external/jpgraph/src/jpgraph.php';
27
28 /**
29  * Liberia base para el manejo de graficos.  
30  */
31 class MLIB_Graph {
32
33
34     /**
35      * Tipo del grafico (xy, torta, gantt)
36      * @var int $ancho
37      * @access private
38      */
39     var $_tipo;
40     
41
42     /**
43      * Ancho del grafico.
44      * @var int $ancho
45      * @access private
46      */
47     var $_ancho;
48     
49     /**
50      * Alto del grafico.
51      * @var int $alto
52      * @access private
53      */
54     var $_alto;
55
56      /**
57      * El grafico propiamente dicho.
58      * @var Graph $grafico
59      * @access private
60      */
61     var $_grafico;
62
63     /**
64      * Booleano que define si se muestran o no los valores
65      * @var bool $verValores
66      * @access private
67      */
68     var $_verValores;
69
70     /**
71      * Class constructor.
72      *
73      * @param string $tipo Tipo de grafico(xy,torta,torta3D,gantt)
74      * @param int $ancho Ancho del grafico
75      * @param int $alto Alto del grafico
76      * @param string $titulo Titulo del grafico.
77      * @param array $attrib_gral Contiene opciones generales para el gráfico.
78      *
79      * Opciones generales para gráficos XY:
80      * - XTitulo (Título del Eje X)
81      * - YTitulo (Título del Eje Y)
82      * - XEtiquetas (Array de Referencias del eje X)
83      * - XEtiquetasRotar (Rota las etiquetas del eje X en 90 grados)
84      * - margenes (array asociativo con alguna/s de las siguientes claves:
85      *              - L (margen izquierdo)
86      *              - R (margen derecho)
87      *              - T (margen superior)
88      *              - B (margen inferior))
89      *
90      * @return void
91      * @access public
92      */
93     function MLIB_graph($tipo, $ancho=300, $alto=200,$titulo,$attrib_gral=NULL)
94     {    
95         $this->_tipo=$tipo;
96         $this->_ancho= $ancho;
97         $this->_alto= $alto;
98         
99         if (isset($attrib_gral['verValores']))
100             $this->_verValores= $attrib_gral['verValores'];
101         
102         if($this->_tipo=="xy")
103         {
104             $this->_grafico= new Graph($ancho,$alto,"auto");
105             $this->_grafico->SetScale("textlin");
106
107             if (isset($attrib_gral['Xtitulo']))
108                 $this->_grafico->xaxis->title->Set($attrib_gral['Xtitulo']);
109         
110             if (isset($attrib_gral['Ytitulo']))
111                 $this->_grafico->yaxis->title->Set($attrib_gral['Ytitulo']);
112         
113             if (isset($attrib_gral['XEtiquetas']))
114                 $this->_grafico->xaxis->SetTickLabels($attrib_gral['XEtiquetas']);
115
116                 if (isset($attrib_gral['XEtiquetasRotar']))
117                         $this->_grafico->xaxis->label_angle = 90;
118         }
119
120         if(($this->_tipo=="torta")||($this->_tipo=="torta3D"))
121         {
122             require_once 'MLIB/Graph/external/jpgraph/src/jpgraph_pie.php';
123             require_once 'MLIB/Graph/external/jpgraph/src/jpgraph_pie3d.php';
124             
125             $this->_grafico= new PieGraph($ancho,$alto);
126
127         }
128       
129         //Atributos en comun
130         
131         if (isset($titulo))
132             $this->_grafico->title-> Set($titulo);
133         if (isset($attrib_gral['subTitulo']))
134             $this->_grafico->subtitle->Set($attrib_gral['subTitulo']);
135         if (isset($attrib_gral['verSombra']) and $attrib_gral['verSombra']==true)
136             $this->_grafico->SetShadow();
137
138         if (isset($attrib_gral['margenes'])){
139                 if (isset($attrib_gral['margenes']['L']))
140                         $this->_grafico->img->left_margin = $attrib_gral['margenes']['L'];
141                 
142                 if (isset($attrib_gral['margenes']['R']))
143                         $this->_grafico->img->right_margin = $attrib_gral['margenes']['R'];
144                 
145                 if (isset($attrib_gral['margenes']['T']))
146                         $this->_grafico->img->top_margin = $attrib_gral['margenes']['T'];
147                 
148                 if (isset($attrib_gral['margenes']['B']))
149                         $this->_grafico->img->bottom_margin = $attrib_gral['margenes']['B'];
150             }
151
152     }
153
154
155     /**
156      * Agrega Secuencia de datos.
157      *
158      * @param array $tipo Tipo de grafico para la secuencia
159      * @param array $secuencia Datos del arreglo
160      * @param array $atributos Atributos especiales para la secuencia
161      *
162      * Tipos de secuencias para gráficos xy:
163      * - lineas
164      * - barras
165      * - puntos
166      *
167      * Atributos:
168      * - color
169      * - colorRelleno (solamente barras y puntos)
170      * - leyenda
171      * - impulso ("si") (solamente para puntos)
172      * - tipoMarca (de 1 a 17) (solamente para puntos)
173      * - etiquetas (array) (para gráficos de torta muestra las etiquetas
174      *                          en lugar de los porcentajes)
175      * - tema ("earth", "pastel", "water", "sand") 
176      *          (para gráficos de torta, permite cambiar el esquema de colores)
177      *          (es "earth" por default)
178      * - explotar (para torta y torta3D) (valor que indica la separación de
179      *                      de las porciones de la torta) 
180      * - posLeyenda (array con dos coordenadas para la posición de la leyenda)
181      * - formatoValores (string con el formato que se quiere dar a los valores
182      *                  (sprintf))
183      * - noAgregar (Si está seteado indica que la secuencia se genera pero no
184      *              se agrega al gráfico.  Se utiliza para gráficos de barras
185      *              acumulativos, donde las secuencias deben agregarse todas
186      *              juntas al final)
187      *
188      * @return plot
189      * @access public
190      */
191     function agregarSecuencia($tipo,$secuencia,$atributos=NULL)
192     {
193         if($this->_tipo=="xy")
194         {
195             $valido=false;
196         
197             if ($tipo=="lineas")
198             {
199                 $valido=true;
200                 require_once 'MLIB/Graph/external/jpgraph/src/jpgraph_line.php';
201                 $plot= new LinePlot($secuencia);
202
203                 if (isset($atributos['colorRelleno']))
204                     $plot->SetFillColor($atributos['colorRelleno']);
205             }
206            
207         
208             if ($tipo=="barras")
209             {
210                 $valido=true;
211                 require_once 'MLIB/Graph/external/jpgraph/src/jpgraph_bar.php';
212                 $plot= new BarPlot($secuencia);
213
214                 if (isset($atributos['colorRelleno']))
215                     $plot->SetFillColor($atributos['colorRelleno']);
216             }
217        
218        
219             if ($tipo=="puntos")
220             {
221                 $valido=true;
222                 require_once 'MLIB/Graph/external/jpgraph/src/jpgraph_scatter.php';
223                 $plot= new ScatterPlot($secuencia);
224
225                 if (isset($atributos['tipoMarca']))
226                             $plot->mark->SetType($atributos['tipoMarca']);
227             
228                 if (isset($atributos['impulso']))
229                 {
230                     if ($atributos['impulso']=="si")
231                         $plot->SetImpuls();
232                 }
233             }
234             
235             //Si hubo error
236             if ($valido==true)
237             {
238         
239                 // Seteo opciones generales
240                 if (isset($atributos['formatoValores']))
241                         $plot->value->format = $atributos['formatoValores'];
242
243                 if ($this->_verValores)
244                     $plot->value->Show();
245     
246                 if (isset($atributos['color']))
247                     $plot->SetColor($atributos['color']);
248
249                 if (isset($atributos['leyenda']))
250                 {
251                     $plot->SetLegend($atributos['leyenda']);
252                     //$this->_grafico->legend->SetLayout(LEGEND_HOR);
253                     $this->_grafico->legend->Pos(0.02,0.01);
254                 }
255
256             }else
257             { 
258                 trigger_error ("Error: Tipo de grafico $tipo no valido (aun)", E_USER_ERROR);
259             }
260         }//del if tipo xy
261
262         
263         if(($this->_tipo=="torta")||($this->_tipo=="torta3D"))
264         {
265             if($this->_tipo=="torta")
266                 $plot= new PiePlot($secuencia);
267             
268             if($this->_tipo=="torta3D")
269                 $plot= new PiePlot3D($secuencia);
270
271                 // Esto lo agrego porque si no, no redondea a 100%
272                 $plot->labeltype = 2;
273
274             if ($this->_verValores)
275                 $plot->value->Show();
276         
277             if (isset($atributos['leyendas']))
278                 $plot->SetLegends($atributos['leyendas']);
279  
280             if (isset($atributos['tema']))
281                 $plot->SetTheme($atributos['tema']);
282
283             if (isset($atributos['etiquetas']))
284                 $plot->SetLabels($atributos['etiquetas']);
285
286             if (isset($atributos['centro']))
287             {
288                 $x=$atributos['centro'][0];
289                 $y=$atributos['centro'][1];
290                 $plot->SetCenter($x,$y);
291             }
292
293             if (isset($atributos['explotar']))
294                         $plot->ExplodeAll($atributos['explotar']);
295                 
296         }// del if torta
297         
298
299         if (isset($atributos['posLeyenda']))
300         {
301                 $this->_grafico->legend->xpos = $atributos['posLeyenda'][0];
302                 $this->_grafico->legend->ypos = $atributos['posLeyenda'][1];
303             }
304
305         if (!isset($atributos['noAgregar']))
306             $this->_grafico->Add($plot);
307         
308             return $plot;    
309     
310     }
311   
312     /**
313      * Acumula las secuencias para generar un gráfico acumulativo de barras
314      * 
315      * Ejemplo de Uso:
316      * @code
317      *      require_once 'MLIB/Graph.php';
318      *      
319      *      $v1 = array(12,8,19,3,10,5);
320      *      $v2 = array(1,28,9,13,1,5);
321      *
322      *      $graph =& new MLIB_Graph ("xy", 300, 300, 'PRUEBA');
323      *
324      *      $b1plot = $graph->agregarSecuencia("barras", $v1);
325      *      $b2plot = $graph->agregarSecuencia("barras", $v2);
326      *
327      *      $graph->acumular(array($b1plot, $b2plot));
328      *      $graph->generar();
329      *   
330      * @endcode
331      *
332      * @param array $secuencias Secuencias de barras a acumular
333      *
334      * @return void
335      * @access public
336      */
337      function acumular ($secuencias)
338      {
339             $rgb = new RGB();
340             $colores = array_keys ($rgb->rgb_table);
341         
342             // Esto pinta cada secuencia de un color diferente
343             for ($i=0; $i< count($secuencias); $i++)
344                 $secuencias[$i]->SetFillColor ($colores[$i]);
345             
346         $accplot = new AccBarPlot($secuencias);
347         $this->_grafico->Add($accplot);
348      }
349   
350     /**
351      * Genera el gráfico y lo dibuja.
352      *
353      * @return void
354      * @access public
355      */
356     function generar()
357     {
358         $this->_grafico->Stroke();
359     }
360
361     /**
362      * Convierte los valores numéricos de entrada en porcentajes
363      *
364      * Ejemplo de uso:
365      * @code
366      *      require_once 'MLIB/Graph.php';
367      * 
368      *      $valores = array (4, 6, 23, 14, 30);
369      *      $nuevos = MLIB_Graph::porcentajes($valores);
370      *
371      *      // se obtiene (5, 8, 30, 18, 39) (%)
372      *
373      * @endcode
374      *
375      * @param array $valores Array de valores numéricos
376      *
377      * @return array 
378      * @access public
379      * @static
380      */
381      function porcentajes ($valores)
382      {
383         require_once 'MLIB/Graph/external/jpgraph/src/jpgraph_pie.php';
384
385         $plot = new PiePlot ($valores);
386         
387         $porciento = $plot->AdjPercentage ($valores);
388         
389         return $porciento;
390      }
391 }