Classe de génération de graphique

Contenu du snippet

Hop voilà ma première source :)

Donc pour mes besoins j'ai créé une classe qui me génère des graphiques (histogrammes) à partir de données récupérées dans une table MySQL.

Cette classe est assez spécifique par rapport à mes besoins mais le code peut toujours servir à certain :) Référez-vous à la capture pour vous donner une idée du résultat final.

N'hésitez pas à commenter le code et/ou à poser des questions.

Bye Bye ^^

PS: La classe SQL n'est par fournit mais je pense que vous comprendrez aisément le fonctionnement de celle-ci dans mon code.

Source / Exemple :


<?php

/* Librairie SQL nécessaire pour récupérer les données */
include_once("include/sql.class.inc");

/************************

    • LIBRAIRIE GRAPHIQUE **
                                                • /
class Graphique { var $image = NULL; // variable de l'image var $titre = NULL; // Titre du graphique var $donnees = NULL; // Tableau[..] contenant les valeurs à traiter var $max = NULL; // valeur maximale des données var $norme = NULL; // Norme de l'analyse var $format = NULL; // Format de l'image retourné (png, jpg ou gif) var $taille_x = 600; // Largeur de l'image (défaut avec zoom 1 = 600) var $taille_y = 330; // Hauteur de l'image (défaut avec zoom 1 = 330) var $max_histo = 11; // Nombre maximal d'histogrammes pouvant être affiché var $id_producteur = NULL; // id du producteur var $id_produit = NULL; // id du type de produit analysé var $id_analyse = NULL; // id du type d'analyse effectué var $print_courbe = true; // Tracer la courbe ? true ou false var $print_valeur = true; // Afficher les valeurs aux sommets des histogrammes ? true ou false var $print_titre = true; // Afficher le titre du graphique ? true ou false var $print_norme = true; // Afficher la norme ? true or false /************
    • PRIVATE **
                        • /
/* Initialisation */ function Init() { /* Vérification que la variable image n'est pas déjà initialisé à quelque chose */ if ( $this->image ) imagedestroy($this->image); /* Initialise la variable image */ $this->image = imagecreate($this->taille_x, $this->taille_y); } /* Reset toutes les variables */ function Flush() { if ( $this->image ) imagedestroy( $this->image ); $this->image = NULL; $this->donnees = NULL; $this->zoom = NULL; $this->max = NULL; $this->norme = NULL; } /* Récupération des données à traiter dans la base de données */ /* Utilisation de la class SQL */ function GetDonnees() { if ( $this->donnees ) $this->donnees = NULL; $mysql = new SQL(); $mysql->Connect(); $sql = $mysql->ExecQuery("SELECT DATE_FORMAT(date_analyse,'%d-%m-%Y') as date, resultat FROM analyses WHERE `type_produits#` = '$this->id_produit' AND `num_producteur#` = '$this->id_producteur' AND `num_type_analyse#` = '$this->id_analyse' ORDER BY date_analyse ASC"); if ( $this->donnees ) $this->donnees = NULL; $this->donnees = array(); while( $data = mysql_fetch_array($sql) ) { $this->donnees[] = array("date"=>$data[0], "resultat"=>$data[1]); } $mysql->Free(); $sql = $mysql->ExecQuery("SELECT norme_z_analyse FROM type_analyse WHERE num_type_analyse = '$this->id_analyse'"); $tuple = mysql_fetch_array($sql); if ( $this->norme ) $this->norme = NULL; $this->norme = $tuple["norme_z_analyse"]; $mysql->Disconnect(); unset($sql); unset($mysql); } /* Retourne le plus grand des résultats à traiter */ function GetMax() { $this->max = 0; $nb = count( $this->donnees ); /* Nombre de données à traiter */ for($i=0;$i<$nb;$i++) { if ( $this->donnees[$i]["resultat"] > $this->max ) { $this->max = $this->donnees[$i]["resultat"]; } } if ( $this->norme > $this->max ) $this->max = $this->norme; unset($nb); } /* Défini une couleur de fond pour l'image */ /* Couleur de fond par défaut : blanc */ function SetBackground($red=255,$green=255,$blue=255) { if ( !is_null($this->image) ) { if ( is_int($red) && is_int($green) && is_int($blue) ) { imagecolorallocate($this->image, $red, $green, $blue); } } } /* Poisitionne le titre du graphique et l'affiche */ function SetTitre() { if ( !is_null($this->image) ) { $text_color = imagecolorallocate($this->image,0,0,0); $text_x = ($this->taille_x-(strlen($this->titre)*imagefontwidth(3)))/2; imagestring($this->image, 3, $text_x, 5, $this->titre, $text_color); unset($text_x); unset($text_color); } } /* Trace les axes x et y et les bords */ function SetAxes() { if ( !is_null($this->image) ) { $line_color = imagecolorallocate($this->image,0,0,0); imageline($this->image, 80, 40, 80, 250, $line_color); imageline($this->image, 80, 250, 550, 250, $line_color); imageline($this->image, 0, 0, 0, $this->taille_y-1, $line_color); imageline($this->image, 0, $this->taille_y-1, $this->taille_x-1, $this->taille_y-1, $line_color); imageline($this->image, $this->taille_x-1, $this->taille_y-1, $this->taille_x-1, 0, $line_color); imageline($this->image, $this->taille_x-1, 0, 0, 0, $line_color); unset($line_color); } } /* Trace les points horizontaux */ function SetXY() { $line_color = imagecolorallocate($this->image,0,0,0); $text_color = imagecolorallocate($this->image,0,0,0); $coord_x = 80; /* Coordonnée x de la position de l'axe Y */ $nb = count( $this->donnees ); /* Nombre de données à traiter */ // Trace les intervalles sur l'axe X et affiche les dates des zones */ for($i=0;$i<$nb;$i++) { imageline($this->image, $coord_x, 245, $coord_x, 255, $line_color); $text_size = strlen($this->donnees[$i]["date"])*imagefontwidth(2); $x = ((40-imagefontheight(2))/2)+$coord_x; $y = 250 + $text_size + 5; imagestringup($this->image, 2, $x, $y, $this->donnees[$i]["date"], $text_color); $coord_x += 40; } /* Trace les intervalles sur l'axe Y et affiche l'échelle */ /* Seuls 5 points "référence" sont tracés sur l'axe Y */ for($i=0;$i<=5;$i++) { $text_y = ((210/5)*$i)+40; $valeur = round(($this->max/5)*(5-$i),0); /* Pas de chiffre à virgule, que des entiers */ imageline($this->image,75,$text_y,85,$text_y,$line_color); imagestring($this->image,2,50,($text_y-(imagefontheight(2)/2)),$valeur,$line_color); } unset($line_color); unset($text_color); unset($coord_x); unset($text_size); unset($x); unset($y); unset($valeur); unset($text_y); unset($nb); } /* Tracage des histogrammes */ function SetHistogramme() { $coord_x = 80; $nb = count( $this->donnees ); /* Nombre de données à traiter */ $line_color = imagecolorallocate($this->image, 255, 0, 0); $text_color = imagecolorallocate($this->image, 0, 0, 0); for($i=0;$i<$nb;$i++) { /* Calcule de la coordonnée Y du haut de l'histogramme */ /* valeur_max <-> coord_max => y = (coord_max*valeur_x)/valeur_max */ $coord_y = (250*$this->donnees[$i]["resultat"])/$this->max; if ( $coord_y == 250 ) $coord_y = 40; else $coord_y = (250-$coord_y)+40; imagerectangle($this->image, $coord_x, $coord_y, $coord_x+40, 250, $line_color); /* Affichage des valeurs au sommet des histogrammes */ if ( $this->print_valeur ) { $text_x = $coord_x+((40-(strlen($this->donnees[$i]["resultat"])*imagefontwidth(1)))/2); if ( $i != 0 && $i != count($this->donnees) ) { if ( $this->donnees[$i-1]["resultat"] > $this->donnees[$i]["resultat"] && $this->donnees[$i+1]["resultat"] > $this->donnees[$i]["resultat"] ) $text_y = $coord_y+4; else $text_y = $coord_y-10; } else { $text_y = $coord_y-10; } imagestring($this->image, 1, $text_x, $text_y, $this->donnees[$i]["resultat"], $text_color); } $coord_x += 40; } unset($coord_x); unset($coord_y); unset($text_x); unset($text_y); unset($coord_zero); unset($line_color); unset($text_color); unset($nb); } /* Trace la courbe d'évolution des analyses */ function TraceCourbe() { $coord_x = 80; $nb = count( $this->donnees ); /* Nombre de données à traiter */ $line_color = imagecolorallocate($this->image, 0, 0, 255); /* Parcours du tableau jusqu'à n-1 car on a besoin des valeur à l'indice i et i+1 */ for($i=0;$i<$nb-1;$i++) { $coord_y1 = (250*$this->donnees[$i]["resultat"])/$this->max; $coord_y2 = (250*$this->donnees[$i+1]["resultat"])/$this->max; if ( $coord_y1 == 250 ) $coord_y1 = 40; else $coord_y1 = (250-$coord_y1)+40; if ( $coord_y2 == 250 ) $coord_y2 = 40; else $coord_y2 = (250-$coord_y2)+40; imageline($this->image,$coord_x+20,$coord_y1,$coord_x+60,$coord_y2,$line_color); $coord_x += 40; } unset($coord_x); unset($coord_y1); unset($coord_y2); unset($line_color); unset($nb); } /* Trace la droite représentant la norme */ function TraceNorme() { $color = imagecolorallocate($this->image, 0, 0, 0); $line_color = imagecolorallocate($this->image, 0, 255, 0); $coord_y = (250*$this->norme)/$this->max; $coord_y = (250-$coord_y)+40; $text_y = $coord_y-(imagefontheight(2)/2); imageline($this->image, 75, $coord_y, 85, $coord_y, $color); imagestring($this->image, 2, 50, $text_y, round($this->norme,0), $color); imageline($this->image, 80, $coord_y, 550, $coord_y, $line_color); unset($line_color); unset($color); unset($coord_y); unset($text_y); } /***********
    • PUBLIC **
                      • /
/* Constructeur de la classe */ function Graphique($titre, $format="png", $print_courbe=true, $print_valeur=true, $print_titre=true, $print_norme=true, $red=255, $green=255, $blue=255, $id_analyse, $id_produit, $id_producteur) { $this->format = $format; if ( $titre ) $this->titre = $titre; $this->print_courbe = $print_courbe; $this->print_valeur = $print_valeur; $this->print_titre = $print_titre; $this->print_norme = $print_norme; $this->id_producteur = $id_producteur; $this->id_analyse = $id_analyse; $this->id_produit = $id_produit; $this->Init(); $this->SetBackground($red, $green, $blue); } /* Génération du graphique */ function Generer() { $this->GetDonnees(); $this->GetMax(); $this->SetAxes(); $this->SetXY(); $this->SetHistogramme(); if ( $this->print_titre ) $this->SetTitre(); if ( $this->print_courbe ) $this->TraceCourbe(); if ( $this->print_norme ) $this->TraceNorme(); } /* Affiche l'image */ function Afficher() { if ( $this->image ) { switch( $this->format ) { case "png": header('Content-type: image/png'); imagepng($this->image); break; case "jpg": header('Content-type: image/jpg'); imagejpeg($this->image); break; case "gif": header("Content-type: image/gif"); imagegif($this->image); break; default: header('Content-type: image/png'); imagepng($this->image); break; } } } /* Sauvegarde l'image du graphique dans un fichier */ function Save( $filename ) { if ( $this->image ) { switch( $this->format ) { case "png": imagepng($this->image, $filename); break; case "jpg": imagejpeg($this->image, $filename, 100); break; case "gif": imagegif($this->image, $filename); break; default: imagepng($this->image, $filename); break; } } } } ?>

Conclusion :


<?
include_once("include/graph.class.inc");

$graph = new Graphique("Un graphique de test","png",true,true,true,true,255,255,255,2,24,229);

$graph->Generer();

$graph->Afficher();

$graph->Save("graph.png");

$graph->Flush();

unset($graph);
?>

A voir également

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.