Des histogrames , camembert 3d et éclatés créé au vol en php

Soyez le premier à donner votre avis sur cette source.

Snippet vu 9 757 fois - Téléchargée 16 fois

Contenu du snippet

// peut être appelée dans votre code pour créer au vol un graphique (histogramme 2 ou 3D , camembert 2 ou 3d)
//exemple => <img src="cree_graphique.php?titre=Titre du graphique&n=1&noms=categorie1;categorie2;categorie3&valeurs=1234,500,734&pertinences=0,3,5&saisies=saisie1;saisie2&la=700&ha=120&type=4&auvol=1" />';
// ou comme une procédure incluse pour creer un fichier image graphq.gif dans le dossier images/ du repertoire courant de cree_graphique.php
// à inclure dans votre code php par include_once('cree_graphique.php');//include_path inutile car dans dossier courant
//exemple => if (cree_graphique($titre,$q,etc...,false)) print <img src="graph$q.gif">;

Source / Exemple :


<?php
// peut être appelée dans votre code pour créer au vol un graphique (histogramme 2 ou 3D , camembert 2 ou 3d)
//exemple => <img src="cree_graphique.php?titre=Titre du graphique&n=1&noms=categorie1;categorie2;categorie3&valeurs=1234,500,734&pertinences=0,3,5&saisies=saisie1;saisie2&la=700&ha=120&type=4&auvol=1" />'; 
// ou comme une procédure incluse  pour creer un fichier image graphq.gif dans le dossier images/ du repertoire courant de cree_graphique.php
// à inclure dans votre code php par include_once('cree_graphique.php');//include_path inutile car dans dossier courant 
//exemple => if (cree_graphique($titre,$q,etc...,false)) print <img src="graph$q.gif">;
 
//.................................... début de l'exécution

if (isset($_GET['auvol'])) //renvoyer l'image au vol
{
header("Content-type: image/gif");
$im=cree_graphique($_GET['titre'],$_GET['n'],$_GET['noms'],$_GET['valeurs'],$_GET['pertinences'],$_GET['saisies'],strval($_GET['la']),strval($_GET['ha']),strval($_GET['type']),true);
imagegif($im); //fabrication et renvoi
imagedestroy($im);//libération mémoire
}// sinon la procedure incluse ci-dessous  est appelée directement par le code

//......................................fin du l'exécution

//******************** FONCTION de fabrication du graphique

function cree_graphique($titre,$q,$noms,$val,$pertinence,$saisies,$la,$ha,$type,$auvol)  //le grahique ne tient pas compte des pondérations, donne simplement la proportion
{
//prevenir erreur si $type=0 (aucun graphique)
if ($type==0) $type=4;  //sinon 1 - barres 2D , 2 - barres 3D , 3 - camembert 2D, 4 - camembert 3D
//affichage ou non du degré de pertinece des réponses
$aff_pertinence=($pertinence!='');
//Il y a des saisies utilisateurs autres que les catagories noms, à représenter dans le graphique
$saisie=($saisies!='');
// créer l'image sur fond gris
$im = imagecreate($la, $ha); 
imagefilledrectangle($im, 0,0, $la, $ha,imagecolorallocate($im,153,153,153));
//encadrer en noir
imagerectangle($im, 0,0, $la-1, $ha-1,imagecolorallocate($im,0,0,0));
//titre du graphique en blanc
imagestring($im, 3, 10,2,$titre,imagecolorallocate($im,255,255,255));

//choix de la couleur de base à nuancer
switch ($q%6)
{
case 0 : $c="vert";break ;
case 1 : $c="cyan";break ;
case 2 : $c="magenta";break;
case 3 : $c="rouge";break ;
case 4 : $c="bleu";break ;
case 5 : $c="jaune";break ;
}
//mettre en tableau les valeurs envoyées, en allongeant de 1 pour prévoir les saisies 
$t=split(';',$noms); 
$max=count($t); // max+1 valeurs , pour prévoir les saisies
$v=array($max); //valeurs en pourcentage
$nom=split(';',$noms);array_push($nom,'');
$v0=split(';',$val);array_push($v0,0);
$p0=split(';',$pertinence);array_push($p0,0);
$co=array($max);
if ($saisie)
{
$nom[$max]="Autres saisies ... ";
$mul=10;
if ($aff_pertinence) $p0[$max]=10;
$z=split(';',$saisies);
$v0[$max]=count($z)*$mul; //nb de saisies multipliées par 10 pour les voir...
}
else $max=$max-1;
//calcul des pourcentages
$s=0;
for ($i=0;$i<=$max;$i++) $s+=$v0[$i];
if ($s==0) $s=100; //prevenir somme nulle
for ($i=0;$i<=$max;$i++) $v[$i]=100*$v0[$i]/$s;
//aspect du graphique
$e=40; //épaisseur pour la 3D
$cx=2*$la/3 ;$cy=$ha/2+$e/2+4; // centre du camembert
if ($type==4) {$lac=$la/2.5;$hac=$ha/2.5;$angle0=0;} else {$lac=$la/2;$hac=$ha/2;$angle0=0;}  //grand axe/petit axe - angle0 fait tourner le camembert dans son plan...
// decalage vertical de la legende
$dh=$ha/(2+$max);

if ($type<3) // ***********************************  barres horizontales 2 ou 3D
{
//rechercher maxi du pourcentage
$maxi=0;for ($i=0;$i<=$max;$i++) {if ($v[$i]>$maxi) {$maxi=$v[$i];$j=$i;$ech=100/$v[$i];}}
//le prendre (j) comme référence à 100% et recalculer v(i)
for ($i=0;$i<=$max;$i++) {if ($i==$j) $v[$i]=2*$la/3-40; else $v[$i]=$ech*$v[$i]*(2*$la/3-40)/100;}

//legende + barres 2D

for ($i=0;$i<=$max;$i++)
{
if ($aff_pertinence) $s='('.$p0[$i].') '; else $s='';
imagestring($im, 2, 40,$dh+ $i*$dh, $s.formate($nom[$i],35).$v0[$i],couleur($im,'noir',0,10));//legende
if ($type==1) $co[$i]=couleur($im,$c,$i-1,$max); else $co[$i]=couleur($im,$c,$i,$max); //plus clair en 3D
imagefilledrectangle($im, 10,$dh+  $i*$dh, 30,$dh +15 + $i*$dh,$co[$i]);
if ($type==1) $d=0; else $d=6; //ajustage pour 3D  [$i]=couleur($im,$c,$i-1,$max); else $co[$i]=couleur($im,$c,$i,$max); //plus clair en 3D
imagefilledrectangle($im, $la/3 +30 - $d, $dh + $d + $i*$dh, $la/3 + 30 - $d + $v[$i],$dh + 15 + $i*$dh,$co[$i]); // face avant - barres 2D
}

if ($type==2) // si barres 3D 
for ($f=0;$f<7;$f++) // mise en relief par glissments et nuances
{
for ($i=0;$i<=$max;$i++) 
{
$co[$i]=couleur($im,$c,$i-0.5,$max); //extrémité droite
imagefilledrectangle($im,$la/3 + 30 -$f + $v[$i],$dh + $i*$dh+$f, $la/3 + 30 -$f+1 + $v[$i],$dh + 8+$f + $i*$dh,$co[$i]); 
$co[$i]=couleur($im,$c,$i-0.8,$max);//face supérieure
imagefilledrectangle($im, $la/3 -$f + 30,$dh + $f+ $i*$dh, $la/3 + 30 -$f + $v[$i],$f+1 + $dh + $i*$dh,$co[$i]); 
}
}
}

else // ****************************************  représentations circulaires : camembert 2D ou 3D
{
//bloc couleur + légende
for ($i=0;$i<=$max;$i++)
{
$co[$i]=couleur($im,$c,$i-1,$max);
imagefilledrectangle($im, 10,$dh+  $i*$dh, 30,$dh +15 + $i*$dh,$co[$i]);
$co[$i]=couleur($im,$c,$i-0.5,$max);//couleurs un peu plus sombre pour les tranches...0.5 pour ne pas les confondre avec le dessus
if ($aff_pertinence) $s='('.$p0[$i].') '; else $s=''; 
imagestring($im, 2, 40, $dh + $i*$dh, $s.formate($nom[$i],35).$v0[$i].'  ('.number_format($v[$i],1,'.',' ').'%)',couleur($im,'noir',0,10));// 26 premiers caractères 
}
//camembert
$deb=$angle0; 
//epaisseur en faisant glisser vers le haut les ellipses sectorisées vides
for ($f=0;$f<$e;$f++)
{
for ($i=0;$i<=$max;$i++)
{
$fin=$deb+$v[$i]*3.6;
$x=$cx;$y=$cy;
if ($type==4) {$x=$cx+$lac/10*cos(($fin+$deb)/2*pi()/180);$y=$cy+$hac/10*sin(($fin+$deb)/2*pi()/180);}
if ($type==4) imagefilledarc($im ,$x , $y -$f, $lac ,$hac , $deb, $fin ,$co[$i],IMG_ARC_PIE); else imagefilledarc($im ,$x , $y -$f, $lac ,$hac , $deb, $fin ,$co[$i],IMG_ARC_NOFILL ); // si type 2D inutile de remplir
$deb=$fin;
}
}
$deb=$angle0;
// finir par le dessus plus clair, avec des étisuettes en blanc 
for ($i=0;$i<=$max;$i++)
{
$co[$i]=couleur($im,$c,$i-1,$max);
$fin=$deb+$v[$i]*3.6;
$x=$cx;$y=$cy;
if ($type==4) {$x=$cx+$lac/10*cos(($fin+$deb)/2*pi()/180);$y=$cy+$hac/10*sin(($fin+$deb)/2*pi()/180);}
imagefilledarc($im ,$x , $y -$e, $lac ,$hac , $deb, $fin ,$co[$i],IMG_ARC_PIE);//avec remplissage
//etiquettes % avec couleurs légende
$co[$i]=couleur($im,'blanc',0,10);
$x=$cx+$lac/2*cos(($fin+$deb)/2*pi()/180);
$y=$cy-10+$hac/2*sin(($fin+$deb)/2*pi()/180);
imagestring($im, 3, $x,$y-$e,  number_format($v[$i],1,'.',' ').'%',$co[$i]);
$deb=$fin;
}
}

if ($auvol) return $im;  // retourner le handle de l'image 
else  //sinon créer le fichier image dans le  dossier images/
{
imagegif($im,'images/graph'.$q.'.gif');
imagedestroy($im);//libération mémoire
return true;
}
}

//couleurs et dégradés  $d niveau du dégradé - $e niveau de degradation maxi 
function couleur($im,$co,$d,$nb)
{
$e=255/($nb+1);
$comp=255-$e*($d+1);
if ($comp<0) $comp=0;
if ($comp>255) $comp=255;
$co=strtoupper($co);
if ($co=="NOIR") return imagecolorallocate($im,0,0,0); 
else if ($co=="BLANC") return imagecolorallocate($im,$comp,$comp,$comp);
else if ($co=="JAUNE")return imagecolorallocate($im,$comp,$comp,0);
else if ($co=="CYAN") return imagecolorallocate($im,0,$comp,$comp);
else if ($co=="MAGENTA") return imagecolorallocate($im,$comp,0,$comp);
else if ($co=="ROUGE") return imagecolorallocate($im,$comp,0,0);
else if ($co=="VERT") return imagecolorallocate($im,0,$comp,0);
else if ($co=="BLEU") return imagecolorallocate($im,0,0,$comp);
else return imagecolorallocate($im,0,0,0);
}

function formate($s,$nb)
{
$s.='..........................................';
return substr($s,0,$nb).'... : ';
}

?>

Conclusion :


Trés pratique pour dépouiller instantanément un sondage, questionnaire ... cf copie d'écran

A voir également

Ajouter un commentaire

Commentaires

Messages postés
157
Date d'inscription
dimanche 15 octobre 2006
Statut
Membre
Dernière intervention
27 août 2010
4
Pas mal !!!
Messages postés
24
Date d'inscription
dimanche 16 février 2003
Statut
Membre
Dernière intervention
18 mars 2010

Ok merci, en fait j'ai simplement remplacé le premier pour faire un essais par celui-ci :

imagettftext($im,10, $ang ,10,20, imagecolorallocate($im,255,255,255), './polices/comic.ttf',$titre);

J'ai évidement ajouté un dossier polices là ou se trouve le fichier qui va l'appeller :p Il est vrai que maintenant, le titre du graph est plus chouette!!

J'en ai profité pour virer aussi la pertinence et la saisie qui ne me servait pas ainsi que la création d'image au vol.. Un bon tuto en fait ton code pour moi ;)

Encore merci
Messages postés
46
Date d'inscription
jeudi 2 novembre 2006
Statut
Membre
Dernière intervention
5 juin 2010

imagettftext est plus complet car il permet de choisir une police et son orientation ...
tu remplace imagestring par imagettftext dans le code en ajoutant les arguments necessaires..
Messages postés
24
Date d'inscription
dimanche 16 février 2003
Statut
Membre
Dernière intervention
18 mars 2010

OK merci, et pour ce que tu indique au niveau du remplacement de imagestring, j'en trouve 3 dans le code. Mais je pige pas lequel il faut remplacer et surtout pourquoi le remplacer par une fonction. Comment on va l'appeller après? (Pas trop fort à ce niveau là moi)
Messages postés
46
Date d'inscription
jeudi 2 novembre 2006
Statut
Membre
Dernière intervention
5 juin 2010

Content que cela puisse servir. En fait, j'ai fait cet outil graphique pour un dépouillement au vol d'un questionnaire, ou les réponses aux questions peuvent être pondérées ( 1, 2 , etc... selon la pertinence de la réponse.
D'autre part certaines questions peuvent demander des saisies de l'utilisateur (réponses de leur cru). Le graphique tient seulement compte du nombre (pondéré avec une valeur 10) de saisies des utilisateurs pour cette question. C'était utile pour mon application création de qcm , que tu peux consulter pour mieux comprendre à l'adresse http://claude.barbe3.free.fr/Wperso/Questionnaires/qcm.php
d'où la réponse à tes ques tions :
J'avais prévu cette option pertinence pour pondérer les secteurs du camembert, ou les barres... On peut donner une importance plus grande pour certaines réponses d'un questionnaire par exemple. L'option n'est finalement pas utilisée ici (il faudrait multiplier v0(i) par p0(i)), mais cela pourrait être utile. Sinon faire sauter cet argument...

- Idem pour les saisies ...
Afficher les 9 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.