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