]> git.llucax.com Git - mecon/meconlib.git/blob - lib/MECON/Graph.php
Se agrega un método estático para pasar de valores numéricos a porcentajes,
[mecon/meconlib.git] / lib / MECON / 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 grafico.
79      *
80      * @return void
81      * @access public
82      */
83     function MECON_graph($tipo, $ancho=300, $alto=200,$titulo,$attrib_gral=NULL)
84     {    
85         $this->_tipo=$tipo;
86         $this->_ancho= $ancho;
87         $this->_alto= $alto;
88         
89         if (isset($attrib_gral['verValores']))
90             $this->_verValores= $attrib_gral['verValores'];
91         
92         if($this->_tipo=="xy")
93         {
94             $this->_grafico= new Graph($ancho,$alto,"auto");
95             $this->_grafico->SetScale("textlin");
96
97             if (isset($attrib_gral['Xtitulo']))
98                 $this->_grafico->xaxis->title->Set($attrib_gral['Xtitulo']);
99         
100             if (isset($attrib_gral['Ytitulo']))
101                 $this->_grafico->yaxis->title->Set($attrib_gral['Ytitulo']);
102         
103             if (isset($attrib_gral['XEtiquetas']))
104                 $this->_grafico->xaxis->SetTickLabels($attrib_gral['XEtiquetas']);
105         }
106
107         if(($this->_tipo=="torta")||($this->_tipo=="torta3D"))
108         {
109             require_once 'MECON/Graph/external/jpgraph/src/jpgraph_pie.php';
110             require_once 'MECON/Graph/external/jpgraph/src/jpgraph_pie3d.php';
111             
112             $this->_grafico= new PieGraph($ancho,$alto);
113             
114         }
115       
116         //Atributos en comun
117         
118         if (isset($titulo))
119             $this->_grafico->title-> Set($titulo);
120         if (isset($attrib_gral['subTitulo']))
121             $this->_grafico->subtitle->Set($attrib_gral['subTitulo']);
122         if (isset($attrib_gral['verSombra']) and $attrib_gral['verSombra']==true)
123             $this->_grafico->SetShadow();
124         
125        }
126
127
128     /**
129      * Agrega Secuencia de datos.
130      *
131      * @param array $tipo Tipo de grafico para la secuencia
132      * @param array $secuencia Datos del arreglo
133      * @param array $atributos Atributos especiales para la secuencia
134      *
135      * Tipos de secuencias para gráficos xy:
136      * - lineas
137      * - barras
138      * - puntos
139      *
140      * Atributos:
141      * - color
142      * - colorRelleno (solamente barras y puntos)
143      * - leyenda
144      * - impulso ("si") (solamente para puntos)
145      * - tipoMarca (de 1 a 17) (solamente para puntos)
146      * - etiquetas (array) (para gráficos de torta muestra las etiquetas
147      *                          en lugar de los porcentajes)
148      * - explotar (para torta y torta3D) (valor que indica la separación de
149      *                                  de las porciones de la torta) 
150      * - posLeyenda (array con dos coordenadas para la posición de la leyenda)
151      * - formatoValores (string con el formato que se quiere dar a los valores (sprintf))
152      *
153      * @return plot
154      * @access public
155      */
156     function agregarSecuencia($tipo,$secuencia,$atributos=NULL)
157     {
158         if($this->_tipo=="xy")
159         {
160             $valido=false;
161         
162             if ($tipo=="lineas")
163             {
164                 $valido=true;
165                 require_once 'MECON/Graph/external/jpgraph/src/jpgraph_line.php';
166                 $plot= new LinePlot($secuencia);
167
168                 if (isset($atributos['colorRelleno']))
169                     $plot->SetFillColor($atributos['colorRelleno']);
170             }
171            
172         
173             if ($tipo=="barras")
174             {
175                 $valido=true;
176                 require_once 'MECON/Graph/external/jpgraph/src/jpgraph_bar.php';
177                 $plot= new BarPlot($secuencia);
178
179                 if (isset($atributos['colorRelleno']))
180                     $plot->SetFillColor($atributos['colorRelleno']);
181             }
182        
183        
184             if ($tipo=="puntos")
185             {
186                 $valido=true;
187                 require_once 'MECON/Graph/external/jpgraph/src/jpgraph_scatter.php';
188                 $plot= new ScatterPlot($secuencia);
189
190                 if (isset($atributos['tipoMarca']))
191                             $plot->mark->SetType($atributos['tipoMarca']);
192             
193                 if (isset($atributos['impulso']))
194                 {
195                     if ($atributos['impulso']=="si")
196                         $plot->SetImpuls();
197                 }
198             }
199             
200             //Si hubo error
201             if ($valido==true)
202             {
203         
204                 // Seteo opciones generales
205                 if (isset($atributos['formatoValores']))
206                         $plot->value->format = $atributos['formatoValores'];
207
208                 if ($this->_verValores)
209                     $plot->value->Show();
210     
211                 if (isset($atributos['color']))
212                     $plot->SetColor($atributos['color']);
213
214                 if (isset($atributos['leyenda']))
215                 {
216                     $plot->SetLegend($atributos['leyenda']);
217                     //$this->_grafico->legend->SetLayout(LEGEND_HOR);
218                     $this->_grafico->legend->Pos(0.02,0.01);
219                 }
220
221             }else
222             { 
223                 die ("Error: Tipo de grafico $tipo no valido (aun)");
224             }
225         }//del if tipo xy
226
227         
228         if(($this->_tipo=="torta")||($this->_tipo=="torta3D"))
229         {
230             if($this->_tipo=="torta")
231                 $plot= new PiePlot($secuencia);
232             
233             if($this->_tipo=="torta3D")
234                 $plot= new PiePlot3D($secuencia);
235
236                 // Esto lo agrego porque si no, no redondea a 100%
237                 $plot->labeltype = 2;
238
239             if ($this->_verValores)
240                 $plot->value->Show();
241         
242             if (isset($atributos['leyendas']))
243                 $plot->SetLegends($atributos['leyendas']);
244
245             if (isset($atributos['etiquetas']))
246                 $plot->SetLabels($atributos['etiquetas']);
247
248             if (isset($atributos['centro']))
249             {
250                 $x=$atributos['centro'][0];
251                 $y=$atributos['centro'][1];
252                 $plot->SetCenter($x,$y);
253             }
254
255             if (isset($atributos['explotar']))
256                         $plot->ExplodeAll($atributos['explotar']);
257                 
258         }// del if torta
259
260         $this->_grafico->Add($plot);
261
262         if (isset($atributos['posLeyenda']))
263         {
264                 $this->_grafico->legend->xpos = $atributos['posLeyenda'][0];
265                 $this->_grafico->legend->ypos = $atributos['posLeyenda'][1];
266             }
267
268         return $plot;    
269     
270     }
271   
272     /**
273      * Acumula las secuencias para generar un gráfico acumulativo de barras
274      * 
275      * Ejemplo de Uso:
276      * @code
277      *      require_once 'MECON/Graph.php';
278      *      
279      *      $v1 = array(12,8,19,3,10,5);
280      *      $v2 = array(1,28,9,13,1,5);
281      *
282      *      $graph =& new MECON_Graph ("xy", 300, 300, 'PRUEBA');
283      *      
284      *      $attribs1 = array('colorRelleno'=>'green');
285      *      $attribs2 = array('colorRelleno'=>'orange');
286      *
287      *      $b1plot = $graph->agregarSecuencia("barras", $v1, $attribs1);
288      *      $b2plot = $graph->agregarSecuencia("barras", $v2, $attribs2);
289      *
290      *      $graph->acumular(array($b1plot, $b2plot));
291      *      $graph->generar();
292      *   
293      * @endcode
294      *
295      * @param array $secuencias Secuencias de barras a acumular
296      *
297      * @return void
298      * @access public
299      */
300      function acumular ($secuencias)
301      {
302         $accplot = new AccBarPlot($secuencias);
303         $this->_grafico->Add($accplot);
304      }
305   
306     /**
307      * Genera el gráfico y lo dibuja.
308      *
309      * @return void
310      * @access public
311      */
312     function generar()
313     {
314         $this->_grafico->Stroke();
315     }
316
317     /**
318      * Convierte los valores numéricos de entrada en porcentajes
319      *
320      * Ejemplo de uso:
321      * @code
322      *      require_once 'MECON/Graph.php';
323      * 
324      *      $valores = array (4, 6, 23, 14, 30);
325      *      $nuevos = MECON_Graph::porcentajes($valores);
326      *
327      *      // se obtiene (5, 8, 30, 18, 39) (%)
328      *
329      * @endcode
330      *
331      * @param array $valores Array de valores numéricos
332      *
333      * @return array 
334      * @access public
335      * @static
336      */
337      function porcentajes ($valores)
338      {
339         require_once 'MECON/Graph/external/jpgraph/src/jpgraph_pie.php';
340
341         $plot = new PiePlot ($valores);
342         
343         $porciento = $plot->AdjPercentage ($valores);
344         
345         return $porciento;
346      }
347 }