Artichow : Forum Artichow !
Aller à la page:  Précédente1234Suivante
Page courante:2 sur 4
Re: Graphiques en chandeliers
Auteur: doji_style (IP enregistrée)
Date: le 3 décembre 2009, 03:03

Bonsoir peofofo,

Oki merci, je regarderai ça de plus près dans les jours qui viennent et reviendrai vers toi si j'ai des questions - ce qui est plus que probable étant donné mes limites en matière de programmation objets, hélas. :(


Merci beaucoup encore pour ton aide, très sympa de ta part. ;)

A plus.

Re: Graphiques en chandeliers
Auteur: doji_style (IP enregistrée)
Date: le 3 décembre 2009, 15:39

Une autre question qui me tarabuste... ^^

Est_il possible en modifiant la classe LinePlot (et/ou Plot?) de colorier la ligne qui joint les points de 2 couleurs différentes voire plus (au lieu d'une seule maintenant)?

Par exemple, il serait intéressant de pouvoir colorier le segment de ligne entre 2 points d'une certaine couleur lorsque le prochain point a une valeur égale ou supérieure au point précédent, et d'une autre couleur dans le cas inverse.

J'imagine que ça doit être possible, en utilisant une fonction de callback par exemple dans la classe afin de déterminer la couleur du prochain segment de ligne à tracer... par contre niveau somme de boulot à effectuer j'avoue je sais pas trop...

Qq'un aurait une idée à ce sujet? :)

Re: Graphiques en chandeliers
Auteur: peofofo (IP enregistrée)
Date: le 3 décembre 2009, 18:47

Bonsoir,

Il te suffit de changer le background dans linePlot.class.php :
// Draw area
$driver->filledPolygon($background, $polygonArea);

Tu le remplaces par:
// $this->datay correspond au point concerné.

if($this->datay>10){// Point sup a 10
$background = new Color(100, 180, 154, 12);
}
else{// Autres cas
$background = new Color(10, 18, 15, 12);
}
// Draw area
$driver->filledPolygon($background, $polygonArea);

Bye




Message édité 1 fois. Dernière modification le le 03/12/09 à 19:02

Re: Graphiques en chandeliers
Auteur: doji_style (IP enregistrée)
Date: le 3 décembre 2009, 23:31

Salut,

j'ai dû mal m'exprimer, ce dont j'ai besoin ce n'est pas de changer la couleur de background du plot, mais de la LIGNE qui est tracée entre chaque point (X,Y).

J'ai essayé ton code ça ne donne rien, du coup j'ai été chercher du côté de la fonction: public function drawComponent(..), et j'ai inclus ce code:


if($value > 9950) {
$this->lineColor = new Color(0, 255, 0, 12);
}
else {
$this->lineColor = new Color(255, 0, 0, 12);
}

dans la boucle qui commence par: foreach($polygon->all() as $point) { ...

en effet j'ai remarqué la ligne $value = $this->datay[$key]; et me semble que la variable $value doit être celle qui contient les valeurs de Y en chaque point.

Le résultat c'est que la ligne change en effet de couleur, mais impossible de changer plusieurs fois de couleur, j'ai l'impression que la ligne prend une certaine couleur au 1er point X,Y (suivant la valeur de $value, cf mon code ci-dessus) et la *conserve* pour tous les points, qq soit la valeur des Y suivants.

=========
EDIT: je m'aperçois qu'en fait la ligne entière prend la couleur correspondant à la valeur du *dernier* point affiché, pas du 1er. Mais mm si certains points sont au-dessus du seuil et d'autres au-dessous, on ne voit jamais 2 couleurs différentes, la ligne a tjours la mm couleur du début à la fin du plot. Je continue à chercher.
=========

Mais bon je me trompe p-ê, en tous cas j'espère, je suis certain qu'on doit pouvoir faire ce que je demande, le tout est de savoir s'il faut entièrement ré-écrire cette classe ou pas. :)

P.S.
Sinon je n'arrive pas à récupérer la valeur des variables à l'intérieur de la classe LinePlot.class pendant le runtime, j'ai une fonction qui permet normalement de le faire (elle écrit la valeur des variables dans un fichier et lit ce fichier périodiquement) mais là ça veut pas... une idée?



Message édité 1 fois. Dernière modification le le 03/12/09 à 23:45

Re: Graphiques en chandeliers
Auteur: doji_style (IP enregistrée)
Date: le 4 décembre 2009, 00:36

Juste pour montrer un exemple de ske je désire faire:



(ignorer les 3 lignes autres que celle qui serpente en bleu et rouge)

Le but final c'est donc de faire en sorte de peindre la ligne en bleu par ex. quand le prochain point a une valeur supérieure au précédent, et en rouge dans le cas contraire (inférieure au précédent).

La classe le texte en couleur non?

Bon Oki je sors tout' suite... => =>

Re: Graphiques en chandeliers
Auteur: doji_style (IP enregistrée)
Date: le 4 décembre 2009, 03:20

Bon je viens de faire un 1er essai des graphes en chandeliers, et c'est pas trop mal. Voici un exemple de résultat sur un bout de données:



comme tu peux voir pour l'instant j'ai mis les labels de côté vu qu'ils prennent beaucoup de place et "bouffent" l'espace des chandeliers.

Il y a juste 2 petites choses à améliorer (qui sont liées):

1- les ombres doivent vraiment être de simples bouts de lignes, c-à-d avoir une largeur de 1 ou 2 pixels max

2- lié à ça sans doute, comme tu peux voir les ombres sont parfois mal centrées par rapport au centre de la bougie. Ceci-dit en regardant de plus près, on dirait que le côté gauche des ombres est bien centré, donc en ramenant la largeur de ces ombres à 1 pixel et en ajustant p-ê ça devrait le faire (ouais facile à dire je sais ^^).


Sinon un ch'tit soucy, vu que je contrôle la génération d'images depuis un browser via des scripts Ajax (Javascript), je préfère générer des *fichiers* images au lieu d'avoir le script php qui renvoie le contenu png vers le browser directement.

Du coup je finis par un: $graph->draw("temp.png"); au lieu du classique $graph->draw();

mais ça n'a pas l'air de vouloir marcher, aucun fichier n'est généré (alors que si je le fais en mode classique ça marche, cf l'image ci-dessus). Tu as une idée d'où ça pourrait venir? P-ê une classe que tu aurais modifiée...?

Merci d'avance. ;)

Re: Graphiques en chandeliers
Auteur: peofofo (IP enregistrée)
Date: le 4 décembre 2009, 15:29

Bonjour doji_style,

Pour le point 1. J'ai mis en taille fixe 3 pixels.
Pour mettre 1px :
Dans le fichier BartPlot.class.php
Ligne 336, il te faut remplacer:
$barStop1 = $barStart1 + 3;
par :
$barStop1 = $barStart1 + 1;

A mon avis ton graphique est trop petit pour la quantité de points.
Il faut rajouter des pixels.

Le point 2 est le même problème que le 1.
Le point de départ est centré par rapport au centre:
$barStart1 = $barPosition/2 + $barSize/2 + ($this->identifier - 1) * $this->barSpace + $position->x;
Tu peus mettre en place une mise a l'échelle automatique a la place de mettre le chiffre en pixel.
par exemple :
$barStop1 = $barStart1 + ceil($barSize/5);// A toi de définir le chiffre (5 est un exemple)

Pour ta question sur Ajax, j'ai l'impression que c'est plus par des problèmes de temps de réponses.

Si tu souhaites obtenir un fichier image a partir de GD, il va te falloir encore ajouter du temps a chaque actualisation.

Je te déconseille de mettre de l'Ajax sur une image GD.
Ajax diminue fortement le temps de réponse.

Si tu veus un graph en temps réel, il te faut le faire uniquement en Javascript&html ou Applet Java, mais pas en PHP.

Me mieux est encore d'utiliser les servlets (applets Java).


Pour le graph de courbe, j'ai donné un exemple que je n'ai pas testé.
J'ai compris ce que tu cherches a obtenir.
Je regarderais quand j'aurais un moment.

Re: Graphiques en chandeliers
Auteur: doji_style (IP enregistrée)
Date: le 4 décembre 2009, 17:31

Bonjour peofofo,

je viens de faire le changement 1) et là bien vu, on se rapproche sérieusement de ce que je cherchais: :-)



Les ombres sont bien centrées, sans avoir eu à effectuer la modif 2), c'est ske j'espérais ds mon post précédent. :)

Bon dans l'idéal les ombres sont plus fines mais on va pas chipoter.

Il me semble que les bougies pour lesquelles Close=Open (qu'on appelle des "dojis", cf mon pseudo ^^) n'ont pas de corps de mm largeur que les autres bougies, voir par ex. l'avant dernière bougie sur le graphe, le trait horizontal au milieu de la bougie devrait avoir la largeur d'un corps de bougie et pas d'une ombre. Dis-moi juste quelle partie du code est à vérifier, j'essaierai de "fixer" ce petit pbm moi-mm.

Autre souci, la graduation de l'axe des X n'apparaît pas et j'en ai besoin. J'ai ajouté les instructions de type $plot->xAxis->setLabelText($Time); etc... mais rien n'apparaît. Mais bon là encore pointe-moi sur la zone de code à modifier et j'essaierai moi-mm, j'ai pris déjà beaucoup de ton temps et je voudrais pas abuser de ta bonne volonté. ;)

Par ailleurs affiner ce graphique en chandeliers (bougies) est plus important pour moi que résoudre le pbm de ligne bleu et rouge (mm si bien sûr ça m'aiderait), donc ne perds pas trop de temps avec cette histoire de ligne bi-colore, je peux qd mm bosser tel que c'est là.

Pour finir, niveau Ajax je te "rassure" c'est très léger, principalement pour faire les requêtes php et passer les paramètres de formulaire puis afficher l'image créée, rien de très évolué ou qui bouffe du cpu (en tous cas pour ce script). J'ai comparé d'ailleurs exécution direct du php ou appel via Ajax et y'a pas de différence notoire.

Ah oui au fait, la question de la création de fichier en utilisant la syntaxe:

$graph->draw("image.png");

avec un nom de fichier png en paramètre, tu as une idée? Ca ne marche tjours pas, aucun fichier image de crée, alors qu'en mode normal (envoi données image direct sur browser) ça marche impecc. Avec la librairie d'origine Artichow ça marche sans pbm et le fichier image est bien crée.



Message édité 2 fois. Dernière modification le le 04/12/09 à 17:43

Re: Graphiques en chandeliers
Auteur: peofofo (IP enregistrée)
Date: le 4 décembre 2009, 23:49

Essai ceci :
$graph->draw("image.png",0); //Deuxième chiffre rotation image a 90°
1 pour effectuer la rotation.
Si tu ne veus pas enregistrer ton image et faire une rotation, tu peus mettre:
$graph->draw(NULL, 0);
// Le code ajouté par Clandé pour obtenir un diagramme horizontale.


Pour la graduation de l'axe X, tu dois mettre ton array. Ton array est sous forme de date?

Re: Graphiques en chandeliers
Auteur: doji_style (IP enregistrée)
Date: le 5 décembre 2009, 01:05

Je viens d'essayer: $graph->draw("image.png",0); mais rien à faire, l'image est tjours affichée directement dans le browser au lieu de créer un fichier image.

Je suppose que celà doit être dû à une modif' de la classe Graph... est-ce qu'avec la mm version de Artichow que tu m'as envoyée tu arrives à exécuter cette commande?

=======================
EDIT: je viens de voir que dans la version Artichow modifiée, la classe Graph a été modifiée entre autres au niveau de la fonction draw(). Je comprends maintenant le pourquoi du 2nd argument pour la rotation. :)

Par contre je comprends pas dans le code de draw() pkoi le bloc if($file === NULL) { ... } n'est pas suivi d'un else { ... } car dans le cas où un nom de fichier image est passé en paramètre bah aucune ligne de code n'est exécutée par draw()... du coup pas étonnant qu'aucun fichier ne soit créé. M'enfin c'est juste mon interprétation, j'attends de voir ske tu en penses, en tous cas tjours pas moyen de générer un fichier. :(
=========================


Sinon pour la graduation de l'axe des X, j'avais tapé 10 lignes d'explications que je viens d'effacer car m'est venue la solution :-)

En effet il faut penser à ajouter: $plot->setXAxisZero(false);

lorsque l'on définit un YMin différent de zéro, ce que j'ai dû faire car les valeurs sont comprises pour ce jeu de données entre 9600 et 9700.

Du coup ça commence à rendre de mieux en mieux: :-)



Bon faudrait que j'essaie de ramener les ombres à 1pix de largeur, c'est important qd je visualise plusieurs dizaines de bougies, ce qui arrive souvent.

De plus, en overlay, je vais m'attacher à calculer et dessiner par dessus ce graphe des courbes de moyenne et/ou autre indicateurs, il est donc important que chaque élement graphique ne prenne pas plus d'espace que ce dont il a normalement besoin. J'espère ne pas avoir trop de soucis qd je passer de $plot-> à $group-> ...

En tous cas c'est vraiment super pour moi de pouvoir générer de tels graphes en contrôlant absolument tout, depuis les données jusqu'au format d'affichage, de plus l'affichage pour ce plot est quasi instantanné sur mon PC, cool! :)

Bonne fin de soirée.





Message édité 1 fois. Dernière modification le le 05/12/09 à 01:35

Aller à la page:  Précédente1234Suivante
Page courante:2 sur 4


Seules les personnes enregistrées peuvent poster sur ce forum.