Graphe a baton

Signaler
Messages postés
379
Date d'inscription
mardi 6 décembre 2005
Statut
Membre
Dernière intervention
8 octobre 2008
-
Messages postés
379
Date d'inscription
mardi 6 décembre 2005
Statut
Membre
Dernière intervention
8 octobre 2008
-
bonjour,
je debute dans le graphisme en image PHP
sa m a tout l air d un domaine interessant une fois qu'on sait le maitriser
seulement je ne parviens pas a faire d histogramme qui va du bas vers le haut cad qui a pour origine de base le bas de l image
voici mon script pour le moment

<?php
header ("Content-type: image/png");
$w=500;                   /* largeur de l'image */
$h=250;                   /* hauteur de l'image */
//enregistrer les valeurs
$values=array('janvier'=>120,'fevrier'=>200);   
//compter le nb de valeurs a afficher
$nb_bar =  count($values);


$captions=array_keys($values);//prendre les noms associés aux valeurs du tableau
$values=array_values($values);//prendre les valeurs du tableau
//determinons les valurs minimales et maximales d un array
$value_temp = $values;
asort($value_temp, SORT_NUMERIC);//trie de l array en mode croissant
$minvalue = $value_temp[0];
rsort($value_temp, SORT_NUMERIC);//trie de l array en mode décroissant
$maxvalue = $value_temp[0];


$img=imagecreate($w+10,$h); 
$BleuPale = imagecolorallocate($img, 10, 150, 255);
$bleu = imagecolorallocate($img, 10, 150, 255);
$orange = imagecolorallocate($img, 255, 128, 0);
$bleuclair = imagecolorallocate($img, 156, 227, 254);
$noir = imagecolorallocate($img, 0, 0, 0);
$blanc = imagecolorallocate($img, 255, 255, 255);
//intervalle
$interval = 9;
for($i = 0; $i < $h; $i++)
{imageline($img,0,$i,$w,$i,$noir);
$i=$i+$interval;
}
$prof = 5;// profondeur
//creation des batons
$distance = round($w / $nb_bar - 0.25,1);//largeur d'un baton arrondi par défaut$ecart ($maxvalue - $minvalue )/ $h; //echelle du graphe soit 1px $ecart
for($i = 0; $i < $nb_bar; $i++)
{
$X1 = 10;
$X2 = $X1+$distance;
$Y2 = 20;
$Y1 = floor(10 + ($values[$i] / $h)*100);
$point = array($X1,$Y1,$X2,$Y1,$X2,$Y2,$X1,$Y2);
if($i % 2 ==0){imagefilledpolygon($img,$point,4,$orange);}
  else{imagefilledpolygon($img,$point,4,$bleuclair);}
  imagepolygon($img,$point,4,$noir);

imagestring($img,2,$X1-40+$distance/2,0,$captions[$i].'('.$values[$i].')',$noir);
$X1 = $X2 + 10;
}


   imagepng($img, 'coucou.png');
   imagedestroy($img);
   echo '';
?>

4 réponses

Messages postés
1406
Date d'inscription
mercredi 17 août 2005
Statut
Membre
Dernière intervention
28 août 2007
8
Salut,

Et si je te dis :"JpGraph" ?
Tu ne te sucides pas hein !

A+
Messages postés
379
Date d'inscription
mardi 6 décembre 2005
Statut
Membre
Dernière intervention
8 octobre 2008

mdr,
non non tkt je ne me suiciderai pour rien au monde
j avai dej entendu parler de JPgraph, seulement je sais que'on peut le faire par soit meme il est vrai que ce sera moins bien mais c une satisfaction personnelle apres
mais je ve tente de regarder cela de plus pres ke mm tout en cherchant d autre part a faire le graph moi mm
lol
merci ke mm ++
Messages postés
10840
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
23
Hello,

j'ai pas envie de mater ton code de bon matin...lol, mais bon, ce n'est pas très compliqué : tu as les coordonnées des grafs que tu traces. Suffit de modifier les bons...quel est ton problème précisément ?
Messages postés
379
Date d'inscription
mardi 6 décembre 2005
Statut
Membre
Dernière intervention
8 octobre 2008

en fait, j'ai deux problèmes :
- premièrement, lorsque l'on dessine un polygone, on utilise ceci
//avec array de type $point = array(X1,Y1,X2,Y2,X3,Y3,X4,Y4);
$point = array($X1,$Y1,$X2,$Y1,$X2,$Y2,$X1,$Y2);
imagefilledpolygon($img,$point,4,$orange);

les valeurs X sont faciles a donné et 2 valeurs Y sur les 4 sont faciles a données(ils sont en bas de l'image et forme la base), les deux autres doit etre un calcul a faire pour dire à quelle hauteur faut se positionner pour un histogramme classique avec la base en bas (comme celui en dessous) et non pas un histogramme je vais dire inversé avec la base en haut

 et voila ce que g trouver cette nuit qui me semble donné le résultat satisfaisant

$distance = round($w / $nb_bar -0.25,1);//largeur de barre arrondi par défaut
$echelle = ($maxvalue - $minvalue )/ $h; //echelle des barres
for($i = 0; $i < $nb_bar; $i++)
{
$X1 = $distance * $i;
$X2 = $X1 + $distance;
$Y1 = $h;
$Y2 = floor($h - ($values[$i] - $minvalue * $echelle));
$point = array($X1,$Y1,$X2,$Y1,$X2,$Y2,$X1,$Y2);
imagefilledpolygon($img,$point,4,$orange);
}

 - deuxiemement, un probleme avec la couleur d arriere plan de l image
auquel g exposé le pb sur le lien suivant http://www.phpcs.com/infomsg_PB-TRANSPARENCE-IMAGE-PHP_758835.aspx
le fait est que je ne parviens pas a obtenir un arriere plan blanc