Classe de génération de graphique

Soyez le premier à donner votre avis sur cette source.

Snippet vu 6 137 fois - Téléchargée 28 fois

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

Ajouter un commentaire

Commentaires

Messages postés
2
Date d'inscription
jeudi 11 août 2011
Statut
Membre
Dernière intervention
11 août 2011

ben C cool maintenant que JPGraph est mort..
Messages postés
26
Date d'inscription
samedi 23 décembre 2006
Statut
Membre
Dernière intervention
27 février 2008

y aurait pas un zip, c'est plus simple!
Messages postés
365
Date d'inscription
samedi 26 juin 2004
Statut
Membre
Dernière intervention
17 avril 2008

oula j'etale ma science...
Faut que je sorte le cours car weirstrass je l'ai eu qu'en exercice et maintenant que les ecrits sont passés ( et que jmen suis bien sorti =) ) ben weirstrass j'en ai un peu rien a cogner. Mais tu peux faire lagrange ca marche nikel chrome ca.
En plus le nom originel c'est : 'Polynome interpolateur de Lagrange' donc avec ca tu fais de l'interpolation de courbe

Desole pour le Weirstrass mais je dois chercher dans mes cours et ya pas mal de feuille
Sinon le niveau brevet c'est pas trop trop accessible moi j'ai vu ca en premiere année de prepa (l'année derniere) ca necessite quelque notions sur les espaces et sur la comprehension des objet qu'on manipule. Bref... Faut de la pratique.
Mais jvais essayer de te pondre un ptit tuto (de 20 lignes) sur comment faire passer une fonction polynomiale par X points (pour la concavité ou la convexité ca sera un ptit peu plus dur =) )
Marikou
Messages postés
514
Date d'inscription
mercredi 19 mars 2003
Statut
Membre
Dernière intervention
1 mars 2009

Hééé, c'est moi le premier commentaire ! Je connais le polynome de Lagrange, mais je ne connais pas le polynome de Weierstrass ... C'est quoi ? Et c'est quoi la différence par rapport à celui de Lagrange ... Kishkaya, vas-y, étale ta science !!!
++ !
L.S.
Messages postés
9433
Date d'inscription
mardi 9 octobre 2001
Statut
Membre
Dernière intervention
13 avril 2007
8
LOL
Afficher les 13 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.