source: spip-zone/_plugins_/jpgraph/jpgraph_fonctions.php @ 32539

Last change on this file since 32539 was 32539, checked in by olivier.gautier@…, 11 years ago

Nouveau type de graph "accbarre" : correspond à http://hem.bredband.net/aditus/chunkhtml/ch15s02.html#fig.example23
On peut accumuler jusqu'à 3 séries de données.
Peut-être faudra-t-il prévoir un modèle avec 4 ou 5 séries de données pour proposer un maximum de possibilités ? A suivre...

File size: 15.3 KB
Line 
1<?php
2
3if (!defined('_DIR_LIB')) define('_DIR_LIB', _DIR_RACINE . 'lib/');
4define('_DIR_JPGRAPH_LIB', _DIR_LIB . 'jpgraph-3.0.6/');
5
6
7//
8// cree un hash unique
9// (a ameliorer activer le cache de jpgraph ou celui de spip ?)
10function jpgraph_name_hash($type="graph",$largeur,$hauteur,$donnee) {
11    // repertoire local/cache-jpgraph dispo ?
12    if (!is_dir(_DIR_VAR."cache-jpgraph/")) {                                     
13                   if (!mkdir (_DIR_VAR."cache-jpgraph/", 0777)) // on essaie de le creer 
14                        spip_log("plugin jgraph: impossible de creer le reperoitre image");
15    }
16
17    // creer le nom unique
18    $donnee[] = $largeur;
19    $donnee[] = $hauteur;
20    $hash = md5(serialize($donnee));
21    return _DIR_VAR."cache-jpgraph/$type-$hash.png";
22}
23
24
25// On passe les donnee dans un tableau
26function jpgraph_traitement_donnees($donnee) {
27        $donnee =  explode(";", $donnee);
28        foreach ($donnee as $key => $value)
29                $donnee[$key] = (float) $value;   
30        if (count($donnee)<2) 
31        $donnee[] = "1";   // securite pour empecher les erreurs si donnnee pas renseigne 
32        return $donnee;
33}
34
35// On passe les legendes dans un tableau
36function jpgraph_traitement_legendes($legende) {
37        $legende =  explode(";", $legende); 
38        foreach ($legende as $key => $value) 
39                $legende[$key] = utf8_decode(trim($value));
40        return $legende;
41}
42
43// extrait couleur ds un tableau: contour / fond / degrade
44function jpgraph_traitement_couleurs($couleur) {
45        $couleur = explode(";", $couleur);
46        $couleur['contour']=trim($couleur[0]);
47        if ($couleur[1]) $couleur['fond']=trim($couleur[1]);
48        if ($couleur[2]) $couleur['degrade']=trim($couleur[2]);
49        return $couleur;
50}
51
52// extrait marqueur dans un tableau: nom / epaisseur / contour / fond
53function jpgraph_traitement_marqueur($marqueur) {
54        $marqueur = explode(";", $marqueur);
55        $marqueur['nom'] = trim ($marqueur[0]);
56        if ($marqueur[1]) $marqueur['epaisseur'] = (int) $marqueur[1];
57        if ($marqueur[2]) $marqueur['contour'] = trim ($marqueur[2]);
58        if ($marqueur[3]) $marqueur['fond'] = trim ($marqueur[3]);
59        return $marqueur;
60}
61
62
63//--------------------------------------------
64// filtre jgraph
65//--------------------------------------------
66function filtre_jpgraph($str,
67        $type_graphe="courbe",
68        $titre="",
69        $donnee="",
70        $donneedeux="",
71        $donneetrois="",
72        $legende="",
73        $legendedeux="",
74        $legendetrois="",
75        $largeur=400,
76        $hauteur=300,
77        $couleur="orange",
78        $couleurdeux="",
79        $couleurtrois="",
80        $marqueur="",
81        $marqueurdeux="",
82        $marqueurtrois="")
83{
84       
85          // constantes
86          $marqueur_formes = array("carre"=>MARK_SQUARE,
87                     "triangle"=> MARK_UTRIANGLE,
88                     "triangle_bas"=> MARK_DTRIANGLE,
89                     "losange"=> MARK_DIAMOND,
90                     "cercle"=> MARK_CIRCLE,
91                     "disque"=> MARK_FILLEDCIRCLE,
92                     "croix"=> MARK_CROSS,
93                     "croix_x" => MARK_X,
94                     "etoile" => MARK_STAR);
95   
96    // traiter les parametres en entree
97    $type_graphe = strtolower(trim($type_graphe));  // pour pb avec les modeles si du blanc en fin de ligne
98    $donnee = jpgraph_traitement_donnees($donnee);
99    if ($donneedeux) $donneedeux = jpgraph_traitement_donnees($donneedeux);
100    if ($donneetrois) $donneetrois = jpgraph_traitement_donnees($donneetrois);
101    if ($legende) $legende = jpgraph_traitement_legendes($legende);
102    if ($legendedeux) $legendedeux = jpgraph_traitement_legendes($legendedeux);
103    if ($legendetrois) $legendetrois = jpgraph_traitement_legendes($legendetrois);
104    $largeur = (int) $largeur;    if (($largeur<=10) OR ($largeur>1600)) $largeur = 400;
105    $hauteur = (int) $hauteur;    if (($hauteur<=10) OR ($hauteur>1600)) $hauteur = 300;
106    $couleur = jpgraph_traitement_couleurs($couleur);
107    if ($couleurdeux) $couleurdeux = jpgraph_traitement_couleurs($couleurdeux);
108    if ($couleurtrois) $couleurtrois = jpgraph_traitement_couleurs($couleurtrois);
109    if ($marqueur) $marqueur = jpgraph_traitement_marqueur($marqueur);
110    if ($marqueurdeux) $marqueurdeux = jpgraph_traitement_marqueur($marqueurdeux);
111    if ($marqueurtrois) $marqueurtrois = jpgraph_traitement_marqueur($marqueurtrois);
112
113   
114    // retrouver jpgraph
115        $cwd = getcwd();
116        chdir(realpath(_DIR_JPGRAPH_LIB));
117    require_once ('src/jpgraph.php');
118    switch($type_graphe) {
119        case "courbe":      require_once ('src/jpgraph_line.php'); break;
120        case "barre":       require_once ('src/jpgraph_bar.php');  break;
121        case "accbarre":       require_once ('src/jpgraph_bar.php');  break;
122        case "camembert":   require_once ('src/jpgraph_pie.php');  break;
123        default:            $type_graphe = "courbe";
124                            require_once ('src/jpgraph_line.php'); 
125                            break;       
126    }
127    chdir($cwd);
128   
129   
130    // creation du graphe
131    switch($type_graphe) {
132        case "courbe":      $graph = new Graph($largeur,$hauteur);
133                            $graph->SetScale('textlin');
134                            // Create the linear plot
135                            $plot=new LinePlot($donnee);                           
136                            // style & couleur
137                            if ($couleur['contour']) $plot->SetColor($couleur['contour']);                                             
138                                        if ($couleur['degrade']) $plot->SetFillGradient($couleur['fond'],$couleur['degrade']);
139                                        if ($$couleur['fond']) $plot->SetFillColor($couleur['fond']);
140                                        // L'epaisseur est sorti du modele, voir comment reintegrer ulterieurement
141                                        //   if ($epaisseur) $plot->SetWeight($epaisseur);
142                                        if (isset($marqueur_formes[$marqueur['nom']])) 
143                                                                 $plot->mark->SetType($marqueur_formes[$marqueur['nom']]); 
144                                        if ($marqueur['couleur']) $plot->mark->SetColor($marqueur['couleur']);
145                                        if ($marqueur['fond']) $plot->mark->SetFillColor($marqueur['fond']);
146                                        if ($marqueur['epaisseur'])$plot->mark->SetWidth($marqueur['epaisseur']);
147                            // titre & legende
148                            $plot->SetLegend($legendedeux[0]);
149                           
150                            if ($donneetrois) {
151                                $plot3=new LinePlot($donneetrois);
152                                if ($couleurtrois['contour']) $plot3->SetColor($couleurtrois['contour']);
153                                if ($couleurtrois['degrade']) $plot3->SetFillGradient($couleurtrois['fond'],$couleurtrois['degrade']);
154                                if ($couleurtrois['fond']) $plot3->SetFillColor($couleurtrois['fond']);
155                                // L'epaisseur est sorti du modele, voir comment reintegrer ulterieurement
156                                //   if ($epaisseur) $plot->SetWeight($epaisseur);
157                                if (isset($marqueur_formes[$marqueurtrois['nom']])) 
158                                        $plot3->mark->SetType($marqueur_formes[$marqueurtrois['nom']]);
159                                if ($marqueurtrois['couleur']) $plot3->mark->SetColor($marqueurtrois['couleur']);
160                                if ($marqueurtrois['fond']) $plot3->mark->SetFillColor($marqueurtrois['fond']);
161                                if ($marqueurtrois['epaisseur'])$plot3->mark->SetWidth($marqueurtrois['epaisseur']);
162                                $graph->Add($plot3);
163                                if ($legendedeux[2]) $plot3->SetLegend($legendedeux[2]);
164                            }
165                           
166                            if ($donneedeux) {
167                                $plot2=new LinePlot($donneedeux);
168                                if ($couleurdeux['contour']) $plot2->SetColor($couleurdeux['contour']);
169                                if ($couleurdeux['degrade']) $plot2->SetFillGradient($couleurdeux['fond'],$couleurdeux['degrade']);
170                                if ($$couleurdeux['fond']) $plot2->SetFillColor($couleurdeux['fond']);
171                                // L'epaisseur est sorti du modele, voir comment reintegrer ulterieurement
172                                //   if ($epaisseur) $plot->SetWeight($epaisseur);
173                                if (isset($marqueur_formes[$marqueurdeux['nom']])) 
174                                        $plot2->mark->SetType($marqueur_formes[$marqueurdeux['nom']]);
175                                if ($marqueurdeux['couleur']) $plot2->mark->SetColor($marqueurdeux['couleur']);
176                                if ($marqueurdeux['fond']) $plot2->mark->SetFillColor($marqueurdeux['fond']);
177                                if ($marqueurdeux['epaisseur'])$plot2->mark->SetWidth($marqueurdeux['epaisseur']);
178                                $graph->Add($plot2);
179                                if ($legendedeux[1]) $plot2->SetLegend($legendedeux[1]);
180                            }
181                           
182                            if ($legendetrois[0]) $graph->xaxis->title->Set($legendetrois[0]);
183                            if ($legendetrois[1]) $graph->yaxis->title->Set($legendetrois[1]);
184                           
185                            $graph->title->Set(utf8_decode($titre));
186                            if (count($legende)>1) 
187                                $graph->xaxis->SetTickLabels($legende); 
188                            break;
189                           
190        case "barre":       $graph = new Graph($largeur,$hauteur);
191                            $graph->SetScale('textlin');
192                            // Create the linear plot
193                            $plot1 = new BarPlot($donnee);
194                            // style & couleur
195                                        if ($couleur['contour']) $plot1->SetColor($couleur['contour']);
196                                        // Le degrade pour les barres est tres specifique (un peu comme le modele de marqueur) et doit etre traite dans une fonction supplementaire, sera fait ulterieurement
197                                        // if ($couleur['degrade']) $plot->SetFillGradient($couleur['fond'],$couleur['degrade']);
198                                       
199                                        //petit patch en attendant d'uniformiser la doc : pour l'instant la doc indique que couleur=blue doit remplir en bleu les barres, alors que l'uniformisation des
200                                        // couleurs indiquera plutot qu'il s'agit d'une couleur de contour et non une couleur de fond
201                                        if (($couleur['contour']) AND (!$couleur['fond'])) $plot1->SetFillColor($couleur['contour']);
202                                        //Devra etre probablement supprime ulterieurement, ou alors on garde cela, dans le cas d'oubli de la couleur de fond
203                                       
204                                        if ($couleur['fond']) $plot1->SetFillColor($couleur['fond']);                             
205                           $group_plot[0]= $plot1;
206                           
207                           if ($donneedeux) {
208                                $plot2 = new BarPlot($donneedeux);
209                                if ($couleurdeux['contour']) $plot2->SetColor($couleurdeux['contour']);
210                                if (($couleurdeux['contour']) AND (!$couleurdeux['fond'])) $plot2->SetFillColor($couleurdeux['contour']);
211                                if ($couleurdeux['fond']) $plot2->SetFillColor($couleurdeux['fond']);
212                                $group_plot[1]= $plot2;
213                           }
214
215                           if ($donneetrois) {
216                                $plot3 = new BarPlot($donneetrois);
217                                if ($couleurtrois['contour']) $plot3->SetColor($couleurtrois['contour']);
218                                if (($couleurtrois['contour']) AND (!$couleurtrois['fond'])) $plot3->SetFillColor($couleurtrois['contour']);
219                                if ($couleurtrois['fond']) $plot3->SetFillColor($couleurtrois['fond']);
220                                $group_plot[2]= $plot3;
221                           }
222
223                            $plot = new  GroupBarPlot ($group_plot);
224                            // titre & legende
225                            $graph->title->Set(utf8_decode($titre));
226                            if (count($legende)>1)
227                                $graph->xaxis->SetTickLabels($legende);
228                        if ($legendetrois[0]) $graph->xaxis->title->Set($legendetrois[0]);
229                        if ($legendetrois[1]) $graph->yaxis->title->Set($legendetrois[1]);
230                            break;
231       
232         case "accbarre":       $graph = new Graph($largeur,$hauteur);
233                            $graph->SetScale('textlin');
234                            // Create the linear plot
235                            $plot1 = new BarPlot($donnee);
236                            // style & couleur
237                                        if ($couleur['contour']) $plot1->SetColor($couleur['contour']);
238                                        // Le degrade pour les barres est tres specifique (un peu comme le modele de marqueur) et doit etre traite dans une fonction supplementaire, sera fait ulterieurement
239                                        // if ($couleur['degrade']) $plot->SetFillGradient($couleur['fond'],$couleur['degrade']);
240                                       
241                                        //petit patch en attendant d'uniformiser la doc : pour l'instant la doc indique que couleur=blue doit remplir en bleu les barres, alors que l'uniformisation des
242                                        // couleurs indiquera plutot qu'il s'agit d'une couleur de contour et non une couleur de fond
243                                        if (($couleur['contour']) AND (!$couleur['fond'])) $plot1->SetFillColor($couleur['contour']);
244                                        //Devra etre probablement supprime ulterieurement, ou alors on garde cela, dans le cas d'oubli de la couleur de fond
245                                       
246                                        if ($couleur['fond']) $plot1->SetFillColor($couleur['fond']);                             
247                           $group_plot[0]= $plot1;
248                           
249                           if ($donneedeux) {
250                                $plot2 = new BarPlot($donneedeux);
251                                if ($couleurdeux['contour']) $plot2->SetColor($couleurdeux['contour']);
252                                if (($couleurdeux['contour']) AND (!$couleurdeux['fond'])) $plot2->SetFillColor($couleurdeux['contour']);
253                                if ($couleurdeux['fond']) $plot2->SetFillColor($couleurdeux['fond']);
254                                $group_plot[1]= $plot2;
255                           }
256
257                           if ($donneetrois) {
258                                $plot3 = new BarPlot($donneetrois);
259                                if ($couleurtrois['contour']) $plot3->SetColor($couleurtrois['contour']);
260                                if (($couleurtrois['contour']) AND (!$couleurtrois['fond'])) $plot3->SetFillColor($couleurtrois['contour']);
261                                if ($couleurtrois['fond']) $plot3->SetFillColor($couleurtrois['fond']);
262                                $group_plot[2]= $plot3;
263                           }
264
265                            $plot = new AccBarPlot($group_plot);
266                            // titre & legende
267                            $graph->title->Set(utf8_decode($titre));
268                            if (count($legende)>1)
269                                $graph->xaxis->SetTickLabels($legende);
270                        if ($legendetrois[0]) $graph->xaxis->title->Set($legendetrois[0]);
271                        if ($legendetrois[1]) $graph->yaxis->title->Set($legendetrois[1]);
272                            break;
273
274         case "camembert":  $graph = new PieGraph($largeur,$hauteur);   
275                            // Create the linear plot
276                            $plot = new PiePlot($donnee);
277                            // style & couleur
278                            if ($couleur['contour']) $plot->SetColor($couleur['contour']);
279                            switch ($couleur['fond']) {
280                                case "earth":
281                                        $plot->SetTheme('earth');
282                                        break;
283                                case "water":
284                                        $plot->SetTheme('water');
285                                        break;
286                                case "sand":
287                                        $plot->SetTheme('sand');
288                                        break;
289                                case "pastel":
290                                        $plot->SetTheme('pastel');
291                                        break;
292                                default:
293                                        $plot->SetTheme('earth');
294                                        break;
295                            }     
296                            // titre & legende
297                            $graph->title->Set(utf8_decode($titre));
298                            if (count($legende)>1) 
299                                $plot->SetLegends($legende);       
300                            break;
301    }
302   
303    // Attacher le trace au graph
304    $graph->Add($plot); 
305   
306    // export du graphe dans un fichier   
307    $filename = jpgraph_name_hash($type_graphe,$largeur,$hauteur,$donnee);
308    @unlink($filename); // http://jpgraph.intellit.nl/index.php?topic=4547.msg11823
309    $graph->Stroke($filename);
310   
311    $titre = str_replace("'","&#039",$titre);
312    return "<span class='spip_documents jgraph'><img src='$filename' alt='$titre' width='$largeur' height='$hauteur' /></span>";
313
314}
315
316
317?>
Note: See TracBrowser for help on using the repository browser.