programmation
visites - 0/p --- >>> Ø;
---
<?php /*Un premier exemple : graphique des visiteurs
pour appliquer ces quelques notions, voici un premier exemple assez simple. On desire pouvoir générer un histogramme (graphique sous forme de "batons") représentant le nombre de visites sur votre site web sur les 12 mois de l'année.
On supposera que vous avez déjà réalisé la partie comptabilisation des visites (dans une table mysQl par exemple), on ne s'y étendra pas ce n'est pas le but du tutorial. imaginons donc que le nombre de visites pour chacun des 12 mois est placé dans le tableau $visites. ici ce tableau sera remplis "à la main", mais ce serait à vous de le remplir en fonction de votre table mySQl.
a) les visites, l'image et les couleurs
On commence donc par créer un tableau contenant les visites sur 12 mois (donc 12 valeurs). On crée ensuite une image 400x300 et on crée trois couleurs, dont la première (le blanc) sera la couleur du fond.
visites.php
-------------------------------------------------------------------------------- */ $visites = array(138, 254, 381, 652, 896, 720, 140, 556, 663, 331, 407, 768);
header ("Content-type: image/png"); $largeurimage = 400; $hauteurimage = 300; $im = imagecreate ($largeurimage, $hauteurimage) or die ("Erreur lors de la création de l'image"); $blanc = imagecolorallocate ($im, 255, 255, 255); $noir = imagecolorallocate ($im, 0, 0, 0); $bleu = imagecolorallocate ($im, 0, 0, 255);
/* b) On dessine les axes
On place l'axe vertical du temps (un simple trait noir) en bas de l'image, en laissant une marge de 10 points. On écrit en dessous le numéro de chacun des mois en utilisant une simple boucle for et la fonction imageString. les numeros de mois sont placés tous les 30 points en partant de la gauche de l'image. Enfin on trace un trait vertical représentant l'axe vertical du nombre de visites.
*/
// on dessine un trait vertical pour représenter l'axe du temps imageline ($im, 10, $hauteurimage-10, $largeurimage-10, $hauteurimage-10, $noir); // on affiche le numéro des 12 mois for ($mois=1; $mois<=12; $mois++) { imagestring ($im, 0, $mois*30, $hauteurimage-10, $mois, $noir); } // on dessine un trait vertical pour représenter le nombre de visites imageline ($im, 10, 10, 10, $hauteurimage-10, $noir); /*
c) On dessine les batons
Voici la partie un peu plus difficile au cours de laquelle on dessine les batons. Tout d'abord, il nous faut le nombre de visites maximal que nous aurons à tracer sur le graphe. ici, la valeur est posée arbitrairement (1000), mais en ré alité il faudrait la calculer en parcourant le tableau des visites à la recherche de son maximum, mais faisons simple... pour chacun des mois, il faut calculer la hauteur du rectangle que l'on veut tracer. pour cela on fait un produit en croix sachant que la hauteur du rectangle pour le nombre de visites maximum serait égale (pour simplifier) à la hauteur de l'image. a partir du nombre de visites pour un mois donné on en déduit la hauteur voulue. il ne reste plus qu'à le tracer chaque rectangle, en commençant par son point supé rieur gauche et en finissant par son point inférieur droit. pour améliorer les choses, on ajoute le nombre de visites au dessus de chaque rectangle.
*/ // le nombre maximum de visites $visitesmax = 1000; // tracé des batons for ($mois=1; $mois<=12; $mois++) { $hauteurimagerectangle = round(($visites[$mois-1]*$hauteurimage)/$visitesmax); imagefilledrectangle ($im, $mois*30-7, $hauteurimage-$hauteurimagerectangle, $mois*30+7, $hauteurimage-10, $bleu); imagestring ($im, 0, $mois*30-7, $hauteurimage-$hauteurimagerectangle-10, $visites[$mois-1], $noir); } // et c'est fini... imagepng ($im);
/* d) Et voila !
Bien sûr le résultat n'est pas superbe, mais on obtient quelque chose de présentable en une vingtaine de lignes, ce qui n'est pas si mal ni si difficile... */
?>
cheese3D - 0/p --- >>> Ø;
---
<?php #http://www.phpcs.com/codes/CAMEMBERTS-3D_34131.aspx /* - Date de création : 18/09/2005 - nom : camembert.php - auteur : opossum_farceur. - Object : les camemberts 3D. - Source : http://fr3.php.net/manual/fr/function.imagefilledarc.php */
function camembert($arr) { $size=3; /* taille de la police, largeur du caractère */ $ifw=imagefontwidth($size);
$w=500; /* largeur de l'image */ $h=250; /* hauteur de l'image */ $a=120; /* grand axe du camembert */ $b=$a/2; /* 60 : petit axe du camembert */ $d=$a/4; /* 60 : "épaisseur" du camembert */ $cx=$w/2-1; /* abscisse du "centre" du camembert */ $cy=($h-$d)/2; /* 95 : ordonnée du "centre" du camembert */
$A=138; /* grand axe de l'ellipse "englobante" */ $B=102; /* petit axe de l'ellipse "englobante" */ $oy=-$d/2; /* -30 : du "centre" du camembert à celui de l'ellipse "englobante"*/
$img=imagecreate($w,$h); $bgcolor=imagecolorallocate($img,0xCD,0xCD,0xCD); imagecolortransparent($img,$bgcolor); $black=imagecolorallocate($img,0,0,0); /* calcule la somme des données */ for ($i=$sum=0,$n=count($arr);$i<$n;$i++) $sum+=$arr[$i][0];
/* fin des préliminaires : on peut vraiment commencer! */ for ($i=$v[0]=0,$x[0]=$cx+$a,$y[0]=$cy,$doit=true;$i<$n;$i++) { for ($j=0,$k=16;$j<3;$j++,$k-=8) $t[$j]=($arr[$i][1]>>$k) & 0xFF; /* détermine les "vraies" couleurs */ $color[$i]=imagecolorallocate($img,$t[0],$t[1],$t[2]); /* calcule l'angle des différents "secteurs" */ $v[$i+1]=$v[$i]+round($arr[$i][0]*360/$sum);
if ($doit) { /* détermine les couleurs "ombrées" */ $shade[$i]=imagecolorallocate($img,max(0,$t[0]-50),max(0,$t[1]-50),max(0,$t[2]-50));
if ($v[$i+1]<180) { /* calcule les coordonnées des différents parallélogrammes */ $x[$i+1]=$cx+$a*cos($v[$i+1]*M_PI/180); $y[$i+1]=$cy+$b*sin($v[$i+1]*M_PI/180); } else { $m=$i+1; $x[$m]=$cx-$a; /* c'est comme si on remplaçait $v[$i+1] par 180° */ $y[$m]=$cy; $doit=false; /* indique qu'il est inutile de continuer! */ } } }
/* dessine la "base" du camembert */ for ($i=0;$i<$m;$i++) imagefilledarc($img,$cx,$cy+$d,2*$a,2*$b,$v[$i],$v[$i+1],$shade[$i],IMG_ARC_PIE);
/* dessine la partie "verticale" du camembert */ for ($i=0;$i<$m;$i++) { $area=array($x[$i],$y[$i]+$d,$x[$i],$y[$i],$x[$i+1],$y[$i+1],$x[$i+1],$y[$i+1]+$d); imagefilledpolygon($img,$area,4,$shade[$i]); }
/* dessine le dessus du camembert */ for ($i=0;$i<$n;$i++) imagefilledarc($img,$cx,$cy,2*$a,2*$b,$v[$i],$v[$i+1],$color[$i],IMG_ARC_PIE);
#imageellipse($img,$cx,$cy-$oy,2*$A,2*$B,$black); // dessine l'ellipse "englobante"
/* dessine les "flêches" et met en place le texte */ for ($i=0,$AA=$A*$A,$BB=$B*$B;$i<$n;$i++) if ($arr[$i][0]) { $phi=($v[$i+1]+$v[$i])/2; /* intersection des "flêches" avec l'ellipse "englobante" */ $px=$a*3*cos($phi*M_PI/180)/4; $py=$b*3*sin($phi*M_PI/180)/4; /* équation du 2ème degré avec 2 racines réelles et distinctes */ $U=$AA*$py*$py+$BB*$px*$px; $V=$AA*$oy*$px*$py; $W=$AA*$px*$px*($oy*$oy-$BB); /* calcule le pourcentage à afficher */ $value=number_format(100*$arr[$i][0]/$sum,2,',','').'%'; /* écrit le texte à droite */ if ($phi<90 || $phi>270) { $root=(-$V+sqrt($V*$V-$U*$W))/$U; imageline($img,$px+$cx,$py+$cy,$qx=$root+$cx,$qy=$root*$py/$px+$cy,$black); imageline($img,$qx,$qy,$qx+10,$qy,$black);
imagestring($img,$size,$qx+14,$qy-12,$arr[$i][2],$black); imagestring($img,$size,$qx+14,$qy-2,$value,$black); } else { /* écrit le texte à gauche */ $root=(-$V-sqrt($V*$V-$U*$W))/$U; imageline($img,$px+$cx,$py+$cy,$qx=$root+$cx,$qy=$root*$py/$px+$cy,$black); imageline($img,$qx,$qy,$qx-10,$qy,$black);
imagestring($img,$size,$qx-12-$ifw*strlen($arr[$i][2]),$qy-12,$arr[$i][2],$black); imagestring($img,$size,$qx-12-$ifw*strlen($value),$qy-2,$value,$black); } }
header('Content-type: image/png'); imagepng($img); imagedestroy($img); }
$arr=array( /* donnée couleur légende */ array( 40, 0xFF99CC, 'Loisirs'), array( 80, 0xFF9900, 'Assurance'), # array( 120, 0xFF9900, 'Assurance'), array( 160, 0xFFCB03, 'Credits'), array( 160, 0x99CC00, 'Carburant'), array( 200, 0x339966, 'Charges'), array( 240, 0x33CCCC, 'Rentrée'), array( 280, 0x0091C3, 'Nourriture'), array( 340, 0x969696, 'Loyer') ); # 1500 camembert($arr); /* enjoy! */ ?>
|