Vous êtes ici Codes PHP et MySQL > GD-Graphiques > Creer un camembert 2D facilement

 

Creer un camembert 2D facilement

Ce code vous permet de generer dynamiquement un graphique Camembert en 2D.

Vous devez disposer de la librairie GD pour l'utiliser.

Pour l'exemple j'ai utilisé 2 polices TTF : HypatiaSansPro (Fournis par Adobe), et Verdana (police inclus dans Windows).
Pensez a modifier les polices pour essayer ce code (lignes 81/82/83)

Cette fonction a beaucoup d'options, mais j'ai pu en oublié, je reste ouvert a toute proposition.

[25/06/2009] Correction : Le graphique ne pouvais etre generer si vous aviez choisis l'autoVal, et qu'une (ou plusieurs) de vos valeurs vallait moins de 0.1239 %. Pour resoudre le probléme, modifier la boucle autoVal (Voir mention EDIT dans le code).

Voici la description pour l'utilisation de ce code.

bool Camembert( array $value [, bool $autoVal [, bool $legend [, bool $legendVal [, string $title [, array $key [, int $width [, int $height [, int $marge_x [, int $marge_y [, int $width_legend ]]]]]]]]]] )

value:
array - Tableau des valeurs a grapher.

autoVal:
bool - Si autoVal vaut TRUE, les valeurs en pourcentage sont calculées automatiquement. Sinon la somme des valeurs de $value doivent etre egale a 100.

legend:
bool - Si legend vaut TRUE, les legendes seront affichée a droite du camembert. Sinon les legendes ne seront pas affichée.

legendVal:
bool - Si legendVal vaut TRUE, les valeurs en % apparaitront avec le texte de la legende.

title:
string - Si title est defini, celui-ci apparaitra au dessus de la legende.

key:
array - Tableau contenu le titre de valeur.

width:
int - Defini la largeur du camembert. Vaut 300 px par défaut.

height:
int - Defini la hauteur du camembert. Vaut 300 px par défaut.

marge_x:
int - Defini la marge a appliquer a gauche du camembert. Vaut 20 px par défaut.

marge_y:
int - Defini la marge a appliquer en haut du camembert. Vaut 20 px par défaut.

width_legend:
int - Defini la largeur du bandeau contenant la legende.
 
MwOuAaa
Site de l'auteur voir
Code vu 5073 fois
Enregistré le 20 Mai 2009
  • Digg ce code sur digg.com
  • Bookmark ce code sur del.icio.us
  • Bookmark ce code sur Google
  • Bookmark ce code sur Yahoo
  • Ajoute Creer un camembert 2D facilement
  • Partage ce code sur Facebook
 
 
 
 

Code Source


01.
02.
03.
04.
05.
06.
07.
08.
09.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
289.
 
<?php
/******************************************************************************/
/*                                                                            */
/*                       __        ____                                       */
/*                 ___  / /  ___  / __/__  __ _____________ ___               */
/*                / _ \/ _ \/ _ \_\ \/ _ \/ // / __/ __/ -_|_-<               */
/*               / .__/_//_/ .__/___/\___/\_,_/_/  \__/\__/___/               */
/*              /_/       /_/                                                 */
/*                                                                            */
/*                                                                            */
/******************************************************************************/
/*                                                                            */
/* Titre          : Creer un camembert 2D facilement                          */
/*                                                                            */
/* URL            : http://www.phpsources.org/scripts514-PHP.htm              */
/* Auteur         : MwOuAaa                                                   */
/* Date édition   : 20 Mai 2009                                               */
/* Website auteur : http://www.ilbee.net/snippet/camembert.php                */
/*                                                                            */
/******************************************************************************/

function Camembert($value$autoVal false$legend false$legendVal false
$title false$key false$width false$height false$marge_x false$marge_y false$width_legend false) {
    // Analyse des valeurs
    $somme 0;
    for($t=0;$t<count($value);$t++) {
        $somme += $value[$t];
    }

    // Si $autoVal est vrai, calcul du pourcentage automatique
    if($autoVal) {
        $tab_val $value;
        $value '';
        $value = array();
/* EDIT */
        for($p=0;$p<count($tab_val);$p++) {
            $calc = ($tab_val[$p] * 100) / $somme;
            if($calc>0.1239) {
                $value[] = ($tab_val[$p] * 100) / $somme;
            };
        }
/* FIN DE L'EDIT */
    } else {
        // Sinon verification de la somme
        if($somme!=100) {
            echo 
'<strong>Erreur:</strong> La somme des valeurs n\'est pas egale a 100% !<br />';
            echo 
'<strong>Notice:</strong> Vous pouvez calculer les valeurs en placant la' .
' variable <em>$autoVal</em> a <strong>true</strong>.';
            return false;
        };
    };

    // Definition de la taille
    if(!$width) {
        $width 300;
    };
    if(!$height) {
        $height 300;
    };
    if(!$width_legend) {
        $width_legend 200;
    };

    // Creation des marges
    if(!$marge_x) {
        $marge_x 20;
    };
    if(!$marge_y) {
        $marge_y 20;
    };

    // Creation de la ressource
    $graf imagecreatetruecolor($width$height);

    // Creation du tableau de couleur
    $Couleur = array();

    // Definition des polices
    // A ADAPTER A VOS BESOIN !
    // Dans le cas présent les fichier TTF sont situé dans un dossier fonts
    $Font['HypatiaSansPro'] =  realpath('fonts/HypatiaSansPro-Bold.otf');
    $Font['Verdana'] =  realpath('fonts/verdana.ttf');
    $Font['Verdana_Bold'] =  realpath('fonts/verdanab.ttf');

    // Definition des couleurs principales
    $Couleur['Blanc'] = imagecolorallocate($graf0xFF0xFF0xFF);
    $Couleur['Noir'] = imagecolorallocate($graf0x000x000x00);

    // Definition des couleurs de portions
    $ColorHex = array();
    $ColorHex['Red'] = array(0x000xCA0x000x000xF70xA10x000x0E0x000xFF);
    $ColorHex['Green'] = array(0x000x000x000xCA0xBA0x030x790x000xFF0xF2);
    $ColorHex['Blue'] = array(0x000x000xCA0x000x000x790x000x000xFF0xBD);
    $Couleur_Portion = array();

    for($c=0;$c<count($ColorHex['Red']);$c++) {
        $Couleur_Portion[$c] = imagecolorallocate($graf$ColorHex['Red'][$c], 
$ColorHex['Green'][$c], $ColorHex['Blue'][$c]);
    }

    // Fond de l'image
    imagefilledrectangle($graf00$width$height$Couleur['Blanc']);

    // Dessine le contour du camembert
    imagefilledellipse($graf$width 2$height 2$width $marge_x 2$height $marge_y 2$Couleur['Noir']);

    // Dessin des portions
    $start 0;
    $array_col = array();
    $color_id 0;
    for($v=0;$v<count($value);$v++) {
        if($color_id==count($ColorHex['Red'])) {
            $color_id 0;
        } else {
            $color_id++;
        };
        
        $array_col[] = $color_id;
        
        $end round($start + (($value[$v] * 360) / 100));
        imagefilledarc($graf$width 2$height 2$width $marge_x$height $marge_y$start$end$Couleur_Portion[$color_id], 
'IMG_ARC_NOFILL IMG_ARC_EDGED');
        $start $end;
    }

    header('Content-Type: image/png');

    // Si on choisi d'afficher la legende
    if($legend) {
        // Si les clefs ne sont pas defini
        if(!$key) {
            echo 
'<strong>Erreur:</strong> Vous ne pouvez pas afficher la legende sans' .
' indiquer les clefs de valeur.';
            return false;
        } else {
            // Si le nombre de clef ne correspond pas au nombre de valeur
            if(count($key)!=count($value)) {
                echo 
'<strong>Erreur:</strong> Le nombre de clefs est different du nombre de valeur';
                return false;
            };
        };

        // Creation de la ressource
        $legend imagecreatetruecolor($width_legend$height);

        // Definition des couleurs
        $LegCouleur['Noir'] = imagecolorallocate($legend0x000x000x00);
        $LegCouleur['Blanc'] = imagecolorallocate($legend0xFF0xFF0xFF);
        $LegCouleur_Portion = array();
        for($l=0;$l<count($ColorHex['Red']);$l++) {
            $LegCouleur_Portion[$l] = imagecolorallocate($legend$ColorHex[
'Red'][$l], $ColorHex['Green'][$l], $ColorHex['Blue'][$l]);
        }    

        // Couleur du fond
        imagefilledrectangle($legend00$width_legend$height$LegCouleur[
'Blanc']);

        // Place une marge en haut
        $yActual $marge_y;

        // Si on a un titre
        if($title) {
            // Taille maxi du titre
            $FontSize 14;
            $GoodSize false;

            // Tant que le titre ne rentre pas
            while(!$GoodSize) {
                // Calcul de la largeur du titre
                $TitleBox imagettfbbox($FontSize0$Font['HypatiaSansPro'], 
$title);
                $TitleWidth $TitleBox[0] + $TitleBox[2];
                $TitleHeight $TitleBox[1] + $TitleBox[3];
                
                // Si le titre rentre dans la boite
                if($TitleWidth<=($width_legend 20)) {
                    $GoodSize true;
                } else {
                    // Sinon on reduit la taille de la police
                    $FontSize--;
                };
            }

            // Centrage du titre
            $xActual = ($width_legend $TitleWidth) / 2;
            imagettftext($legend$FontSize0$xActual$yActual$LegCouleur[
'Noir'], $Font['HypatiaSansPro'], $title);

            // Saut de ligne sous le titre
            $yActual += 20;    
        };

        $LegBloc_height 20;
        $LegBloc_saut 10;
        $Good_LegBlocHeight false;
        
        $max_height $height $yActual $marge_y;
        while(!$Good_LegBlocHeight) {
            $Total_Height = ($LegBloc_height $LegBloc_saut) * count($key);
            if($Total_Height>$max_height) {
                $LegBloc_height--;
                $LegBloc_saut--;
            } else {
                $Good_LegBlocHeight true;
            };
        }

        // Dessin et texte des legendes
        for($k=0;$k<count($key);$k++) {
            imagefilledrectangle($legend20$yActual50$yActual $LegBloc_height$LegCouleur_Portion[$array_col[$k]]);
            imagerectangle($legend20$yActual50$yActual $LegBloc_height
$LegCouleur['Noir']);

            if($legendVal) {
                $legend_valeur $key[$k].' ('.round($value[$k], 2).'%)';
            } else {
                $legend_valeur $key[$k];
            };
            
            $Legend_FontSize 10;
            $Legend_GoodSize false;

            // Tant que la legende ne rentre pas
            while(!$Legend_GoodSize) {
                // Calcul de la largeur du titre
                $LegendBox imagettfbbox($Legend_FontSize0$Font['Verdana'],
 $legend_valeur);
                $LegendWidth $LegendBox[0] + $LegendBox[2];
                $LegendHeight $LegendBox[1] + $LegendBox[3];
                
                // Si le titre rentre dans la boite
                if($LegendWidth<=($width_legend 60)) {
                    $Legend_GoodSize true;
                } else {
                    // Sinon on reduit la taille de la police
                    $Legend_FontSize--;
                };
            }
            
            imagettftext($legend$Legend_FontSize060$yActual $LegBloc_height$LegCouleur['Noir'], $Font['Verdana'], $legend_valeur);
            
            $yActual += $LegBloc_height $LegBloc_saut;
        }
        
        // Creation de l'image Graphique + Legende
        $GrafTotal imagecreatetruecolor($width $width_legend$height);
        // Copie de l'image Graphique temporaire
        imagecopyresized($GrafTotal$graf0,  000$width$height$width
$height);
        // Libération de la mémoire
        imagedestroy($graf);
        // Copie de l'image Legende temporaire
        imagecopyresized($GrafTotal$legend$width000$width_legend$height$width_legend$height);
        // Libération de la mémoire
        imagedestroy($legend);
        
        // Envoi de l'image au navigateur
        imagepng($GrafTotal);
        // Libération de la mémoire
        imagedestroy($GrafTotal);
    } else {
        // Envoi de l'image au navigateur
        imagepng($graf);
        // Libération de la mémoire
        imagedestroy($graf);
    };
}

$valeur = array(4117454101105472065456486415);
$key = array('Valeur de clef 1''Texte long 2''Val 3''Val 4''Val 5''Val 6''Val 7','Val 1''Val 2''Val 3');

Camembert($valeurtruetruetrue'Mon graf !'$key);
?>

 

Fonctions du code

: Compte le nombre d'éléments d'un tableau ou le nombre de propriétés...
: Crée un tableau - (PHP 4, PHP 5)
: Affiche une chaîne de caractères - (PHP 4, PHP 5)
: Crée une nouvelle image en couleurs vraies - (PHP 4 >= 4.0.6, PHP 5)
: Retourne le chemin canonique absolu - (PHP 4, PHP 5)
: Alloue une couleur pour une image - (PHP 4, PHP 5)
: Dessine un rectangle rempli - (PHP 4, PHP 5)
: Dessine une ellipse pleine - (PHP 4 >= 4.0.6, PHP 5)
: -
: Dessine une ellipse partielle et la remplit - (PHP 4 >= 4.0.6, PHP 5)
: Envoie un en-tête HTTP - (PHP 4, PHP 5)
: Retourne le rectangle entourant un texte et dessiné avec une police TrueType - (PHP...
: Dessine un texte avec une police TrueType - (PHP 4, PHP 5)
: Dessine un rectangle - (PHP 4, PHP 5)
: Copie et redimensionne une partie d'une image - (PHP 4, PHP 5)
: Détruit une image - (PHP 4, PHP 5)
: Envoie une image PNG vers un navigateur ou un fichier - (PHP 4, PHP 5)
Commentaire
Merci pour cette page très utile !
Juste une suggestion : depuis quelques temps, imagefilledarc ne fonctionnait plus du tout, et je me retrouvais avec un camembert complètement noir.
J'ai résolu le problème en remplaçant
'IMG_ARC_NOFILL IMG_ARC_EDGED'
par
IMG_ARC_PIE
J'espère que ça pourra être utile à d'autres qui pourraient avoir le même problème.
 
Ajouter un commentaire
Code de sécurité

Attention: Les champs marqués d'une étoile * sont obligatoires
 
Librairie PHP

Connexion

 
 

GD-Graphiques

 
 

PHP

 
 
 
 
    Offres d'emploi

Plus de 500 offres d'emploi PHP/MySQL

Offres d'emploi
 
    Editeur PHP
 
        Publicité