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