Page 1 sur 1

Histogramme : nb de fois chaque valeur

Posté : 15 sept. 2008, 23:04
par jay64
Bonjour,

J'ai une requete qui me renvoie 10 résultats avec le champ "note" qui a par exemple :

3 fois la valeur 12
4 fois la valeur 13
2 fois la valeur 15
1 fois la valeur 17

Je voudrais dessiner un histogramme avec en abscisses les notes (12, 13, 15 et 17) en en ordonnées le nombre d'occurences de chaque notes. Je suis parti sur l'exemple de graphique d'artichow selon le code ci-dessous :
require_once "../Artichow/BarPlot.class.php";

$graph = new Graph(400, 400);
$graph->setAntiAliasing(TRUE);

$values = array(19, 42, 15, -25, 3);
$plot = new BarPlot($values);
$plot->setBarColor(
  new Color(250, 230, 180)
);
$plot->setSpace(5, 5, NULL, NULL);

$plot->barShadow->setSize(3);
$plot->barShadow->setPosition(Shadow::RIGHT_TOP);
$plot->barShadow->setColor(new Color(180, 180, 180, 10));
$plot->barShadow->smooth(TRUE);

$graph->add($plot);
$graph->draw();

Pourriez-vous me dire sur quel type de requête partir et surtout comment corriger ce code pour y intégrer les données de ma requête et obtenir le résultat attendu ?

Merci

Jérôme

Posté : 15 sept. 2008, 23:33
par sadeq
D'abord, pour la question où agir pour intégrer le résultat de la requête, la réponse est simple : bien sûr, au niveau des valeurs (les notes) que tu mets dans l'exemple dans un tableau array()
$values = array(19, 42, 15, -25, 3);
Il faut donc obtenir le tableau $values à partir d'une requête SQL.

Pour la seconde question concernant la requête qui doit retourner les groupes de notes et leurs nombres d'occurrences, elle peut être comme suit :

Code : Tout sélectionner

SELECT note, count(note) as nb FROM table_notes GROUP BY note ORDER BY nb
Elle retourne les notes groupées donc uniques ainsi que leurs comptes et fait un classement par nombre croissant.

Il reste donc à exécuter cette requête et lire son résultat par mysql_fetch_array() pour construire le tableau $values :
$resultat = mysql_query("SELECT note, count(note) as nb FROM table_notes GROUP BY note ORDER BY nb");
$values = array();
$nombres = array();
while ($resultat && $row = mysql_fetch_array($resultat)){
   $values[] = $row["note"];
   $nombres[] = $row["nb"];
}

Posté : 15 sept. 2008, 23:47
par jay64
Ok, je comprends presque tout, merci. En adaptant, j'ai donc ceci :
<?php
$RefMatch = 1;

require_once "../Artichow/BarPlot.class.php";

require_once('../Connections/connection_top_stats.php');
mysql_select_db($database_connection_top_stats, $connection_top_stats);

$resultat = mysql_query("SELECT Texte, COUNT(*) as Occurences FROM Votes WHERE IdMatch = '$RefMatch' GROUP BY Texte ORDER BY Texte"); 
$values = array(); 
$nombres = array(); 
while ($resultat && $row = mysql_fetch_array($resultat))
{ 
   $values[] = $row["Texte"]; 
   $nombres[] = $row["Occurences"]; 
} 

$graph = new Graph(400, 400);
$graph->setAntiAliasing(TRUE);

//$values = array(19, 42, 15, -25, 3);
$plot = new BarPlot($values);
$plot->setBarColor(
  new Color(250, 230, 180)
);
$plot->setSpace(5, 5, NULL, NULL);

$plot->barShadow->setSize(3);
$plot->barShadow->setPosition(Shadow::RIGHT_TOP);
$plot->barShadow->setColor(new Color(180, 180, 180, 10));
$plot->barShadow->smooth(TRUE);

$graph->add($plot);
$graph->draw();
?>
Le hic, c'est que maintenant, j'ai l'erreur suivante :
Parse error: syntax error, unexpected ')', expecting '(' in /homepages/15/d256505805/htdocs/graphiques/detail_note_match.php on line 29
et en pluc, je ne vois pas où se joue le lien sur le graphique entre note et occurences

Posté : 16 sept. 2008, 09:35
par sadeq
Rien de grave regarde la ligne n°29 du programme detail_note_match.php, il y a des parenthèses non respectées.

Pour l'usage de Artichow voir : http://artichow.org et le Forum : http://artichow.org/forum/list.php?2

Oui, une chose, d'après la doc d'Artichow le tableau $values doit contenir les valeurs de mesure des séries de l'axe X, c'est à dire les valeurs qui en principe figureront dans l'axe des Y et qui expriment la taille des barres. Il me semble donc que tu as inversé le truc. $values doit contenir dans ton cas les nombres d'occurrences des notes et non pas les notes. Et les notes sont les barres donc les séries de l'axe des X.

Donc voici une proposition :
<?php 
   // On inclue le fichier qui nous permettra de dessiner des histogrammes
   require_once "Artichow-php5/BarPlot.class.php";

   // Ici, le graphique mesurera 400 x 400 pixels.
   $graph = new Graph(400, 400);

   // L'anti-aliasing permet d'afficher des courbes plus naturelles,
   // mais cette option consomme beaucoup de ressources sur le serveur.
   $graph->setAntiAliasing(TRUE);

   // Etiquettes de l'axe X
   $notes = array(5, 10, 15); // classé par note ordre ascendant
   
   // Les valeurs à afficher sur l'histogramme (Axe Y)
   $nombres_notes = array(2, 5, 3); //chaque nombre correspond à l'emplacement d'une note
   
   // On créé l'histogramme à base des valeurs de l'axe Y
   $plot = new BarPlot($nombres_notes);
   
   // On spécifie les noms des séries X
   $plot->xAxis->setLabelText($notes); 
   
   // On donne des titres aux axes XY
   $plot->yAxis->title->set("Nombres de notes");
   $plot->xAxis->title->set("Notes");
   
   // Ajoute une couleur de fond aux barres
   $plot->setBarColor(
      new Color(250, 230, 180)
   );

   // On ajoute 5 % d'espace à gauche et à droite de l'histogramme.
   // On ne change pas l'espace du haut et du bas de l'histogramme.
   $plot->setSpace(
      5, /* Gauche */
      5, /* Droite */
      NULL, /* Haut */
      NULL /* Bas */
   );

   // On choisit une ombre de 3 pixels
   $plot->barShadow->setSize(3);
   // On place l'ombre sur les côtés haut et droit.
   // Si vous utilisez Artichow pour PHP 4 & 5, transformez Shadow::RIGHT_TOP en SHADOW_RIGHT_TOP
   $plot->barShadow->setPosition(Shadow::RIGHT_TOP);
   // On veut une ombre de couleur grise
   $plot->barShadow->setColor(new Color(180, 180, 180, 10));
   // On choisit de lisser les extrémités de l'ombre
   $plot->barShadow->smooth(TRUE);

   // Une fois votre histogramme correctement paramétré, il est nécessaire de l'ajouter au graphique
   $graph->add($plot);

   // Afficher à l'écran
   $graph->draw();
?>