Libraire GD : inverser l'ordre dans un histogramme

Libraire GD : inverser l'ordre dans un histogramme - PHP - Programmation

Marsh Posté le 12-06-2009 à 16:58:38    

Bonjour,
 
J'utilise GD pour créer un histogramme de statistiques.
 
Voyez l'exemple ici : http://www.bcml.be/GD/stats_year.php
 
Ce n'est pas trop mal, sauf que je voudrais que le mois de Mai, situé comme premier mois sur l'axe horizontal, apparaisse en dernier ... Et inversément. Que le dernier soit le premier ... Je ne sais pas trop bien quel paramètre modifier et, surtout, comment ! D'avance merci !
 
Voici mon code php :
 

Code :
  1. <?php
  2. $result = mysql_query("SELECT mois, visit FROM bcmlbe ORDER BY id DESC LIMIT 12" );
  3. while ($row = mysql_fetch_array($result, MYSQL_NUM))
  4.   {
  5.   $k++;
  6.   $m++;
  7.     $visite_par_mois[$k]=$row[1];
  8.     $moistxt[$m] = $row[0];
  9.   }
  10. // on calcule le nombre de pages vues sur l'année   
  11. $max_visite = max($visite_par_mois); 
  12. // on spécifie le type d'image que l'on va créer, ici ce sera une image au format PNG   
  13. header ("Content-type: image/png" ); 
  14. // on définit la largeur et la hauteur de notre image   
  15. $largeur = 490; 
  16. $hauteur = 230; 
  17. // on crée une ressource pour notre image qui aura comme largeur $largeur et $hauteur comme hauteur (on place également un or die si la création se passait mal afin d'avoir un petit message d'alerte)   
  18. $im = @ImageCreate ($largeur, $hauteur) or die ("Erreur lors de la création de l'image" ); 
  19. // on place tout d'abord la couleur blanche dans notre table des couleurs (je vous rappelle donc que le blanc sera notre couleur de fond pour cette image).   
  20. $blanc = ImageColorAllocate ($im, 255, 255, 255); 
  21. // on place aussi le noir dans notre palette, ainsi qu'un bleu foncé et un bleu clair   
  22. $noir = ImageColorAllocate ($im, 0, 0, 0); 
  23. $bleu_fonce = ImageColorAllocate ($im, 76, 0, 153); 
  24. $bleu_clair = ImageColorAllocate ($im, 150, 100, 200); 
  25. // on dessine un trait horizontal pour représenter l'axe du temps   
  26. ImageLine ($im, 20, $hauteur-30, $largeur-15, $hauteur-30, $noir); 
  27. // on affiche le numéro des 12 mois   
  28. for ($i=1; $i<=12; $i++) {
  29.     $monthnbr = substr($moistxt[$i], -2);
  30.     $monthtxt = substr($moistxt[$i], 0, 3);
  31.     $month = $monthtxt.' '.$monthnbr;
  32.    if ($i==1) {
  33.       ImageString($im, 2, 32, $hauteur-28, $monthtxt, $bleu_fonce);
  34.    }
  35.    else {
  36.       ImageString($im, 2, ($i)*32, $hauteur-28, $monthtxt, $bleu_fonce);
  37.    } 
  38. // on dessine un trait vertical pour représenter le nombre de pages vues   
  39. ImageLine ($im, 20, 30, 20, $hauteur-30, $noir); 
  40. // on affiche les legendes sur les deux axes ainsi que différents textes (note : pour que le script trouve la police verdana, vous devrez placer la police verdana dans un repertoire /fonts/)   
  41. imagettftext($im, 10, 0, $largeur-70, $hauteur-10, $noir, "./fonts/ARIAL.TTF", "Mois" ); 
  42. imagettftext($im, 10, 0, 10, 20, $noir, "./fonts/ARIAL.TTF", "Nombre de visites" ); 
  43. imagettftext($im, 10, 0, $largeur-250, 20, $noir, "./fonts/ARIAL.TTF", "Statistiques des derniers mois..." );
  44. imagettftext($im, 8, 0, 10, 50, $noir, "./fonts/ARIAL.TTF", "6000" ); 
  45. imagettftext($im, 8, 0, 10, 105, $noir, "./fonts/ARIAL.TTF", "4000" ); 
  46. imagettftext($im, 8, 0, 10, 160, $noir, "./fonts/ARIAL.TTF", "2000" ); 
  47. // on parcourt les douze mois de l'année   
  48. for ($mois=1; $mois <= 12; $mois++) {
  49.    if ($visite_par_mois[$mois]!="0" ) {
  50.       // on calcule la hauteur du baton  
  51.       $hauteurImageRectangle = ceil(((($visite_par_mois[$mois])*($hauteur-50))/$max_visite));
  52.       if ($mois=="1" ) {
  53.          // si le mois est janvier, on affiche notre premier baton  
  54.          // on affiche le premier baton noir  
  55.          ImageFilledRectangle ($im, 32, $hauteur-$hauteurImageRectangle, 32+14, $hauteur-31, $noir);
  56.          // on affiche le second baton, bleu foncé, qui sera un peu plus petit que le noir afin de recouvrir une partie du noir  
  57.          ImageFilledRectangle ($im, 34, $hauteur-$hauteurImageRectangle+2, 32+12, $hauteur-31-1, $bleu_fonce); 
  58.          // on affiche le dernier baton, bleu clair, qui sera un peu plus petit que le bleu foncé afin de recouvrir une partie du bleu foncé (on obtiendra ainsi un effet de dégradé)  
  59.          ImageFilledRectangle ($im, 38, $hauteur-$hauteurImageRectangle+2, 32+8, $hauteur-31-1, $bleu_clair);
  60.       }
  61.       else
  62.          // si le mois est different de janvier, on affiche les autres batons  
  63.          ImageFilledRectangle ($im, ($mois)*32, $hauteur-$hauteurImageRectangle, ($mois)*32+14, $hauteur-31, $noir);
  64.          ImageFilledRectangle ($im, ($mois)*32+2, $hauteur-$hauteurImageRectangle+2, ($mois)*32+12, $hauteur-31-1, $bleu_fonce);
  65.          ImageFilledRectangle ($im, ($mois)*32+6, $hauteur-$hauteurImageRectangle+2, ($mois)*32+8, $hauteur-31-1, $bleu_clair);
  66.       }
  67.    } 
  68. // on dessine le tout   
  69. Imagepng ($im); 
  70. ?>

Reply

Marsh Posté le 12-06-2009 à 16:58:38   

Reply

Marsh Posté le 15-06-2009 à 02:53:09    

Je connais pas l'archi de ta bdd, donc ca ca doit en theorie passer :
 

Code :
  1. <?php
  2. $result = mysql_query("SELECT mois, visit FROM bcmlbe ORDER BY id DESC LIMIT 12" );
  3. while ($row = mysql_fetch_array($result, MYSQL_NUM))
  4.  {
  5.  $k++;
  6.  $m++;
  7.    $visite_par_mois[$k]=$row[1];
  8.    $moistxt[$m] = $row[0];
  9.  }
  10.  
  11.  
  12. /* modifs ici */
  13. $visite_par_mois=array_reverse($visite_par_mois);
  14. $moistxt= array_reverse($moistxt);
  15. /* fin des modifs */
  16.  
  17.  
  18. // on calcule le nombre de pages vues sur l'année  
  19. $max_visite = max($visite_par_mois);  
  20.  
  21.  
  22. // on spécifie le type d'image que l'on va créer, ici ce sera une image au format PNG  
  23. header ("Content-type: image/png" );  
  24.  
  25. // on définit la largeur et la hauteur de notre image  
  26. $largeur = 490;  
  27. $hauteur = 230;  
  28.  
  29. // on crée une ressource pour notre image qui aura comme largeur $largeur et $hauteur comme hauteur (on place également un or die si la création se passait mal afin d'avoir un petit message d'alerte)  
  30. $im = @ImageCreate ($largeur, $hauteur) or die ("Erreur lors de la création de l'image" );  
  31.  
  32. // on place tout d'abord la couleur blanche dans notre table des couleurs (je vous rappelle donc que le blanc sera notre couleur de fond pour cette image).  
  33. $blanc = ImageColorAllocate ($im, 255, 255, 255);  
  34.  
  35. // on place aussi le noir dans notre palette, ainsi qu'un bleu foncé et un bleu clair  
  36. $noir = ImageColorAllocate ($im, 0, 0, 0);  
  37. $bleu_fonce = ImageColorAllocate ($im, 76, 0, 153);  
  38. $bleu_clair = ImageColorAllocate ($im, 150, 100, 200);  
  39.  
  40.  
  41. // on dessine un trait horizontal pour représenter l'axe du temps  
  42. ImageLine ($im, 20, $hauteur-30, $largeur-15, $hauteur-30, $noir);  
  43.  
  44. // on affiche le numéro des 12 mois  
  45. for ($i=1; $i<=12; $i++) {
  46.  
  47.    $monthnbr = substr($moistxt[$i], -2);
  48.    $monthtxt = substr($moistxt[$i], 0, 3);
  49.    $month = $monthtxt.' '.$monthnbr;
  50.  
  51.   if ($i==1) {
  52.      ImageString($im, 2, 32, $hauteur-28, $monthtxt, $bleu_fonce);
  53.   }
  54.   else {
  55.      ImageString($im, 2, ($i)*32, $hauteur-28, $monthtxt, $bleu_fonce);
  56.   }  
  57. }  
  58.  
  59. // on dessine un trait vertical pour représenter le nombre de pages vues  
  60. ImageLine ($im, 20, 30, 20, $hauteur-30, $noir);  
  61.  
  62. // on affiche les legendes sur les deux axes ainsi que différents textes (note : pour que le script trouve la police verdana, vous devrez placer la police verdana dans un repertoire /fonts/)  
  63. imagettftext($im, 10, 0, $largeur-70, $hauteur-10, $noir, "./fonts/ARIAL.TTF", "Mois" );  
  64. imagettftext($im, 10, 0, 10, 20, $noir, "./fonts/ARIAL.TTF", "Nombre de visites" );  
  65. imagettftext($im, 10, 0, $largeur-250, 20, $noir, "./fonts/ARIAL.TTF", "Statistiques des derniers mois..." );
  66. imagettftext($im, 8, 0, 10, 50, $noir, "./fonts/ARIAL.TTF", "6000" );  
  67. imagettftext($im, 8, 0, 10, 105, $noir, "./fonts/ARIAL.TTF", "4000" );  
  68. imagettftext($im, 8, 0, 10, 160, $noir, "./fonts/ARIAL.TTF", "2000" );  
  69.  
  70. // on parcourt les douze mois de l'année  
  71. for ($mois=1; $mois <= 12; $mois++) {
  72.   if ($visite_par_mois[$mois]!="0" ) {
  73.      // on calcule la hauteur du baton
  74.      $hauteurImageRectangle = ceil(((($visite_par_mois[$mois])*($hauteur-50))/$max_visite));
  75.      if ($mois=="1" ) {
  76.         // si le mois est janvier, on affiche notre premier baton
  77.         // on affiche le premier baton noir
  78.         ImageFilledRectangle ($im, 32, $hauteur-$hauteurImageRectangle, 32+14, $hauteur-31, $noir);
  79.         // on affiche le second baton, bleu foncé, qui sera un peu plus petit que le noir afin de recouvrir une partie du noir
  80.         ImageFilledRectangle ($im, 34, $hauteur-$hauteurImageRectangle+2, 32+12, $hauteur-31-1, $bleu_fonce);  
  81.         // on affiche le dernier baton, bleu clair, qui sera un peu plus petit que le bleu foncé afin de recouvrir une partie du bleu foncé (on obtiendra ainsi un effet de dégradé)
  82.         ImageFilledRectangle ($im, 38, $hauteur-$hauteurImageRectangle+2, 32+8, $hauteur-31-1, $bleu_clair);
  83.      }
  84.      else {  
  85.         // si le mois est different de janvier, on affiche les autres batons
  86.         ImageFilledRectangle ($im, ($mois)*32, $hauteur-$hauteurImageRectangle, ($mois)*32+14, $hauteur-31, $noir);
  87.         ImageFilledRectangle ($im, ($mois)*32+2, $hauteur-$hauteurImageRectangle+2, ($mois)*32+12, $hauteur-31-1, $bleu_fonce);
  88.         ImageFilledRectangle ($im, ($mois)*32+6, $hauteur-$hauteurImageRectangle+2, ($mois)*32+8, $hauteur-31-1, $bleu_clair);
  89.      }
  90.   }  
  91. }  
  92. // on dessine le tout  
  93. Imagepng ($im);  
  94. ?>


Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed