HISTOGRAMME EN PHP AVEC GD. PROGRAMMATION OBJET

coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 - 3 juil. 2005 à 01:04
crazygogo Messages postés 135 Date d'inscription samedi 18 janvier 2003 Statut Membre Dernière intervention 17 avril 2009 - 7 août 2008 à 15:05
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/32484-histogramme-en-php-avec-gd-programmation-objet

crazygogo Messages postés 135 Date d'inscription samedi 18 janvier 2003 Statut Membre Dernière intervention 17 avril 2009
7 août 2008 à 15:05
il existe ArtiChow : http://www.artichow.org

je fais de la pub pour ma source mais elle permet de générer de graphiques vraiment très simplement, il suffit de renseigner des tableaux avec les données en provenance de la BDD....

http://www.phpcs.com/code.aspx?ID=47171
softwareds Messages postés 11 Date d'inscription vendredi 28 mai 2004 Statut Membre Dernière intervention 7 mai 2008
8 mai 2008 à 16:51
Très bonne source, j'ai juste dû ajouter la gestion des mois pour obtenir ce que je recherchais.
Bravo et merci.
rlftova Messages postés 8 Date d'inscription mardi 18 avril 2006 Statut Membre Dernière intervention 26 mars 2008
22 févr. 2008 à 11:11
Bonjour,

j'aurais juste une question :

comment exploiter cette source avec dans les array des variables en boucle.
par exemple $y correspond à une année, $variable correspond à ma variable, $variable[$y] étant la valeur de ma variable pour l'année $y. Comment générer le tableau avec un for ($y=$annee1;$y<=$annee2;$y++) ?

merci.
originalcompo Messages postés 65 Date d'inscription dimanche 3 avril 2005 Statut Membre Dernière intervention 9 octobre 2007 1
21 févr. 2008 à 11:12
Salut,

Pour le "serie 1", "serie 2"... les valeurs sont gérés dans le init de l'objet, et stockées dans "legende"

La 1ère version de cette classe d'histogramme utilisait des balises
, et j'utilisais le champ "legende" dans la propriété "alt" de la balise
.

En gros, l'info apparaissait lorsqu'on passait la souris sur une barre (il y avait le nom de la série suivi de la valeur entre parenthèses)

Dans la 2ième version qui est ici, j'ai ré-utilisé un tronc commun objet, mais je n'ai effectivement pas géré cette valeur, donc tu as parfaitement raison, ca ne sert à rien, je ne m'en étais pas rendu compte d'ailleurs

PS: les 2 versions du code se trouvent sur mon site,
http://mywebdev.free.fr/PHP/index.php
_klesk Messages postés 70 Date d'inscription jeudi 14 avril 2005 Statut Membre Dernière intervention 20 août 2008
16 févr. 2008 à 00:36
Bon il faut laisser tomber la seconde question, je ne voyait pas les chose correctement.

Cependant, j'aimerai afficher (par Ex:) les mois sous les chiffes que je récupèrent, les mois ou du texte différent fct de chaque barre me suis-je bien fait comprendre ?

_ _ _
| | | | _ | |
| | | | | | | | (Bon faut imaginer que c'est l'histogramme).
| | | | | | | |
|_| |_| |_| |_|

4 4 2 5
jan fev Mar Avr

Il me faudrait quelque chose comme ça !

Merci.
_klesk Messages postés 70 Date d'inscription jeudi 14 avril 2005 Statut Membre Dernière intervention 20 août 2008
15 févr. 2008 à 21:43
Une petite question a poser a l'auteur de cette source.

dans cette partie du code, ou est afficher et/ou a quoi sert "serie1", j'ai beau modifier le text ca ne change rien du tout.
Une petite explication ?

* $h1 = new TGDListeCouleur;
* $h1->init(255,0,255,
* "série 1",
* array(50, -20, 30, 7, 12));
* $maitre->add($h1);
Seconde question (je planche dessus mais a tout hasard je pose la question) :
comment decaler les chiffre de facon a rendre un poil plus claire la lecture.

D'avance merci. et 9/10 pour le fait du serie1,serie2,serie3,... qui (ne semble) servir à rien.
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
22 avril 2006 à 13:24
envoi ton code à coucou747@hotmail.com, je t'aiderais volontier....

mais si la variable ne s'affiche pas, c'est qu'elle n'existe pas...

vérifie aussi que dans ton include, tu n'affiches pas de texte : en http, une requette renvoi un seul fichier...
rlftova Messages postés 8 Date d'inscription mardi 18 avril 2006 Statut Membre Dernière intervention 26 mars 2008
21 avril 2006 à 14:19
Bonjour,
encore moi. La variable ne s'affiche pas, mais quand je veux faire un include du fichier dans lequel sont les variables, c'est l'image qui ne veut plus s'afficher.
As-tu une solution ???
Merci
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
19 avril 2006 à 19:34
je n'ai pas regardé le code depuis longtemps mais quand tu remplace un nombre par une variable, alors ça ne change rien...

fais un echo $var, gettype($var); pour vérifier que ta variable est corecte...
rlftova Messages postés 8 Date d'inscription mardi 18 avril 2006 Statut Membre Dernière intervention 26 mars 2008
19 avril 2006 à 19:11
J'y avais pensé mais ca ne marche pas ! Il doit y avoir quelque chose qui m'échappe !
Quand je fais :
$h1->init(204,204,204,
"série 1",
array($valeur[$annee1], $valeur[$annee2]));
Pas moyen d'afficher les barres, ca me laisse une image plate.
Merci
A+
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
19 avril 2006 à 13:22
tu remplaces les chiffres par ta variable...
rlftova Messages postés 8 Date d'inscription mardi 18 avril 2006 Statut Membre Dernière intervention 26 mars 2008
18 avril 2006 à 23:11
Une petite question de néophite. Comment puis-je inclure des variables PHP au lieu de mettre directement des chiffres ?
Merci
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
5 févr. 2006 à 14:39
"Bref, la classe, c'est plus "class" ;-)"=> si c'est juste l'effet de mode...
o00zeus00o Messages postés 17 Date d'inscription vendredi 15 mars 2002 Statut Membre Dernière intervention 31 octobre 2007
12 juil. 2005 à 09:10
Bon travail, continue ;)
originalcompo Messages postés 65 Date d'inscription dimanche 3 avril 2005 Statut Membre Dernière intervention 9 octobre 2007 1
4 juil. 2005 à 13:38
On peut quand même trouver des avantages à l'utilisation d'une classe sur une simple fonction:

Si on met de coté la partie OO, et qu'on se consacre à ce que sait faire PHP 4, la classe en tant que "structure" est plus pratique ne serais-ce que parcequ'elle permet de saisir les paramètres de manière plus intuitive, pourvu qu'on lui donne des noms suffisement parlants.

En effet, pour appeler une fonction de 10 parametres , il faut se rappeler l'ordre, etc...
Si ces paramètres sont des proprietes d'une classe, c'est plus parlant et plus joli !

Sans compter que pour dessiner, il faut une fonction principale, ok, mais qui en appelle quelques autres: si je mets tous dans une seule procedure, je ne peux plus re-utiliser la partie commune à la gestion de l'histo en css et l'histo en GD, et je dois tout re-ecrire (copier coller, si bug trouve corriger en 2 endroits...).
Donc plusieurs fonctions avec encore passage de plein de parametres...

Bref, la classe, c'est plus "class" ;-)
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
4 juil. 2005 à 13:24
c'est une bonne source, je ne dis pas le contraire, j'ai simplement dit que je n'aurais pas utilisé l'objet ici...
mon chat peut miauler, manger, se nourrir, bouger, griffer...
ta liste de point, bah elle a une moyenne, une médiane, un écartype, elle peut être une class!
ton histogramme, il peut s'afficher et c'est tout !
évidement, il peut s'afficher de plusieurs façons, mais ça pourrait être un paramètre de fonction... voila, la diférence avec mon chat...
originalcompo Messages postés 65 Date d'inscription dimanche 3 avril 2005 Statut Membre Dernière intervention 9 octobre 2007 1
4 juil. 2005 à 13:09
C'est vrai qu'on ne voit pas les choses du même point de vue:
"une class chat héréditaire de la class animaux..."

Moi je suis partie du principe qu'un Histogramme, c'etait plusieurs listes de points, et qu'une liste de points... c'est une liste de points !

j'ai donc fait une classe histogramme (TGDHistogramme) héreditaire de la classe
liste de points pour histo (TListePourSerieHisto) héréditaire de la classe "données" (TListeSimple)

Si je dois faire un camenbert, je ferais une classe Camembert (TGDCamenbert) héréditaire de la classe "données" (TListeSimple)

Ah, euhhh... et elle est où la différence avec ton chat ?

Bon, allez, je laisse tomber, d'toute facon, c'est vrai que parler d'objet avec php 4, c'est n'importe quoi... en tout cas j'suis content de m'être tromper et d'apprendre que t'as fait de l'objet ailleurs, n'empêche que pour ceux qui connaissent pas l'objet, le code est quand même un bon tuto à mon sens...
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
4 juil. 2005 à 12:39
lol, je n'ai fait qu'exprimer mon point de vue...
je n'ai pas découvert la POO en php, mais en C++...
On ne programme pas de la même façon, mais j'ai déja croisé des programmeurs qui comme toi mettent des classes partout...
Moi, personellement, je mets des structs en C++, et ça ne me dérance pas plus que ça, c'est une fonctionalitée comme une autre... (et ne dis pas que la struct est au c++ ce que le goto est à la programmation !)
je fais aussi de la POO en javascript.
J'aimes bien le php, pour mon blog, j'avais fait une class Page, on pouvait ajouter des commentaire a travers une fonction, on pouvait voter pour un sondage, on pouvait la suprimer... Elle pouvait s'afficher, elle pouvait afficher un sondage et des RSS...

quand tu portes un code C++ en code C, tu transformes chaque class en une struct et plein de fonctions, donc ta class a plein de sorties... On ne devrait pas pouvoir transformer une class en une seule fonction, la, on peut faire une fonction dessiner_histogramme($array_stat, $array_couleurs, $dimx, $dimy); dans un livre de C++, on ne voit pas de class miauler, on voit une class chat héréditaire de la class animaux...
originalcompo Messages postés 65 Date d'inscription dimanche 3 avril 2005 Statut Membre Dernière intervention 9 octobre 2007 1
4 juil. 2005 à 12:06
Là, je suis à OBLIGE de répondre au 2ième paragraphe.

La POO (tu verras ça dans n'importe quel livre) est basée sur 3 principes de base:
- L'encapsulation (présente dans php 5 mais pas dans 4)
- L'héritage
- Le polymmorphisme (simulé dans php)

Tout ca à partir d'une structure appelé "classe"

La programmation objet, c'est une philosophie de programmation, pas un truc destiné à être utilisé à partir de "n" paramètres de sorties, mais au contraire tout le temps (je reviens sur
ce point à la fin du message).

L'introduction de la POO a changé le mode de pensée du programmeur : les données sont maitre de leur contenu, c'est à dire qu'elles se gèrent elles même (fonctions incluses dans l'objet pour le gérer, et non pas fonction externe qui gère les données)

De plus, un des principaux but pour lequel la POO a été introduite est d'avoir un code facilement modifiable, transformable, maintenable, notamment grace à la notion d'heritage.

Hors, j'ai parcouru la semaine quelques uns des codes php les plus populaires du site, et j'en ai ouvert une vingtaine, ceux dont les appréciations étaient bonnes: AUCUN (j'en ai peut-être sauté un, je dis pas) n'utilisait la notion d'héritage, le SEUL des 3 points principaux de la POO présent dans PHP 4 !!!


C'est pour ca que j'ai trouvé que le code fourni pouvait ammener quelque chose d'INSTRUCTIF à la communauté:
il utilise l'héritage, et m'a permis de faire mes modifications en une heure (je ne connaissais pas du tout GD), parceque le code que j'avais écrit était suffisamment générique à la base.


CONCLUSION

1) manipuler des classes ne signifie pas que l'on sait programmer en objet
(c'est comme connaitre connaitre des théorèmes par coeur: on peut savoir s'en servir pour faire des petites démonstrations, mais ca veut pas dire qu'on sait les utiliser pour démontrer des choses compliquées. )

2) je reviens sur les "n sorties" necessaires pour utiliser une classe.
C'est tout à fait faux, et en plus c'est un truc de base qu'on retrouve sur tout les bouquins: la philosophie POO, dans le cas des stats, ce serait créér un objet TDonnees de base sur lequel on va faire toutes les manips de données, et qui va avoir des fonctions abstraites "dessiner()", "inverser()" etc... qui seront implémentées dans des classes descendantes Thistogramme, TCamembert, puisqu'elles seront spécifiques à l'objet descendant...

3) Tes affirmations sur la POO montrent bien que tu à découvert par toi-même la POO à partir de PHP, et pas à partir d'un vrai langage OO, je te conseilles donc de lire un bouquin qui en parle, parceque là, t'es en train de prendre de très mauvaises habitudes, exactement comme moi quand j'utilise des "
" au lieu '
', sauf que je pense sincèrement que c'est un peu plus grave dans ton cas, vu que c'est une erreur de raisonnement: tu vas exactement à l'inverse de la philosophie OO ...

Cordialement
OC.

Ceci dit en toute amitié, perso, même si je râle quand on me dit d'utiliser telle ou telle méthode plutôt qu'une autre parcequ'on gagne 1/100 de seconde au bout de 100000 itérations, je fini quand même par le faire...
Et depuis un mois que je me suis mis à PHP, je suis pas tombé sur un seul script qui utilisait l'héritage, à part des tutoriaux sans but précis, donc c'est normal si on a pas fait de POO avec un vrai langage OO de ne pas savoir tout ca. Normal mais vraiment dommage.
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
4 juil. 2005 à 11:14
en php, ce qui limite la fin d'une instruction, ce n'est pas le retour à la ligne, c'est le point virgule...

d'un point de vue objet, c'est sur que c'est plus simple pour créer des histogrammes, mais SELON MOI, un histogramme qui se présenterais sous forme OO devrait avoir plus de possibilitées de personalisations que add_stats... On devrait pouvoir choisir entre 3d et 2d, une échelle, les dimentions, couleurs, légende... Si elle ne reçoit qu'une série statistique, alors une fonction devrait suffire... Une class a plusieurs entrées et plusieurs sorties, je crois que dans ton script, tu as plusieurs entrées, mais une seule sortie, tu devrais proposer CSS/2d/3d, et la, la class serait plus apropriée... Une class doit donc avoir plusieurs sortie, je n'ai pas de grandes conaissances en stats, mais si j'avais fait une class qui cré des histogrammes, je l'aurais appelée stat, elle aurait pu permetre de calculer les moyennes, les médianes, les quartiles, d'afficher des boites à moustaches, des histogrammes, des camemberts...

Enfin voila, ça reste mon avis, certains programmeurs utilisent des class la ou une fonction de cinq lignes peut faire l'affaire, personellement, je ne fais des class que quand on a plusieurs entrées et plusieurs sorties, tu fais diférement, et c'est pas forcément plus mal, même si les class ne sont pas faites pour ça à l'origine...
originalcompo Messages postés 65 Date d'inscription dimanche 3 avril 2005 Statut Membre Dernière intervention 9 octobre 2007 1
4 juil. 2005 à 10:53
Ne t'en fais pas, je n'ais pas mal interprété ce que tu as écris. Je voulais juste que tu me dises si toi aussi tu trouvais le code interressant d'un point de vue "objet"...

Par contre je connaissais pas l'écriture
'

'
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
4 juil. 2005 à 09:24
Je n'ai pas dit que cette source était nulle, j'ai dit que j'avais trouvé quelques optimisations !
C'est un bon code, mais on peut faire plus optimisé...
ne le prends pas comme une erreur, prends ça comme une meilleur option...

PS :

'
'."\n"
est moins rapide que :
'

'
originalcompo Messages postés 65 Date d'inscription dimanche 3 avril 2005 Statut Membre Dernière intervention 9 octobre 2007 1
4 juil. 2005 à 01:15
Bon, pour les côtes et les doubles côtes, t'es dur!
le seul endroit où j'ai laissé les doubles, c qu'il y avait quelque chose à interpréter.
De plus est-ce certain (par exemple) que (même au centième de seconde près sur 100000 itérations)

"
\n" : interpréter une chaine de 8 caractères

soit plus lent que

'
'."\n" : concatener une chaine de 6 caractères avec
l'interprétation d'une chaine de 2 caractères ?

Sinon, c'est bien de voir les optimisations, mais que penses tu du fond?

Parceque là, c'est comme si tu critiquais "Notre Dame de Paris"
sur les fautes d'orthographe du manuscrit original de Victor Hugo, sans te soucier de l'histoire en elle même.

(PS: je me prends pas pour le victor Hugo de la programmation lol)


Perso, je pense que l'ensemble des 3 scripts est un bon exemple
pour ceux qui connaissent les classes et qui veulent avoir une idée de ce qu'apporte la programmation objet
(et je sais, PHP 4 n'est pas un langage orienté objet !)

C'est pour cette unique raison que j'ai re-publié un nouveau source histogramme, sinon, je l'aurai gardé pour moi, vu le nombre de sources qui doivent faire ca...

(encore que je suis content, j'ai pas trouvé ma représentation sur le site de jpgraph, donc elle a quelque chose d'original !)


Quand à la 3ieme couleur, je laisse ceux qui éventuellement voudraient utiliser ce source faire toutes les modifs qu'ils veulent: trivial pour quelqu'un comme toi, un bon exercice de compréhension pour un débutant... Perso, je trouve que c'est très bien comme ca, et en plus ca a l'air d'etre une norme, en tout cas pour jpgraph qui n'utilise qu'une seule même couleur pour les 2 faces en perspective !
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
3 juil. 2005 à 23:05
pour le someil... question d'habitude...

pour le code, j'ai trouvé quelque chose à redire : tu peux augmenter la vitesse d'exécution de ta class css :
-les doubles guillemets sont à éviter, mieux vaut utiliser les simples, ils sont plus rapide d'exécution.
-les sont préférables aux quand les types sont identiques.

sinon, tu peux mettre une troisième couleur comme on voit trois cotés...
originalcompo Messages postés 65 Date d'inscription dimanche 3 avril 2005 Statut Membre Dernière intervention 9 octobre 2007 1
3 juil. 2005 à 10:07
Dégradé rajouté!
originalcompo Messages postés 65 Date d'inscription dimanche 3 avril 2005 Statut Membre Dernière intervention 9 octobre 2007 1
3 juil. 2005 à 02:28
C'est vraiment pas ça le plus dur...
Dès que j'aurais un moment, je "corrigerais" ça...
A propos, tu dors jamais, toi ?
Bonne nuit !
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
3 juil. 2005 à 01:04
je n'ai pas pris le temps de regarder le code (je le ferais sous peu) mais je tiens quand même à dire que quand on fait de la 3d, il faut savoir mettre différentes teintes de couleurs pour montrer les expositions différentes des différentes faces...
Rejoignez-nous