Tracer une courbe avec Artichow

Tracer une courbe avec Artichow - PHP - Programmation

Marsh Posté le 19-02-2011 à 20:01:47    

Bonjour,
 
Je stocke des informations sur des tracés GPS (latitude, longitude, altitude, distance, ...). A l'aide de ces infos je souhaiterai tracé une courbe représentant les dénivelés du tracé en fonction de la distance. J'ai alors pensé à utiliser la librairie jpGraph. Mais toutes les courbes réalisées avec JpGraph que j'ai pu voir sur le net sont des trucs de "petits joueurs" en terme de quantité de données représentés. Pour chaque trace GPS, j'ai deux gros tableaux : un qui contient l'accumulation des distances entre chaque point GPS (que je voudrais modéliser sur l'axe des abscisses) et un autre qui contient les altitudes de chaque points GPS (que je voudrais modéliser sur l'axe des ordonnées). Pour vous donner un exemple, je souhaiterai mes courbes se présentent comme celle-ci : http://www.tracegps.com/fichiers/100/deniv/9271de.png
 
J'ai testé pas mal de chose sur JpGraph et même Artichow mais je n'arrive pas à mettre mes deux tableaux synchro et ça me donne un rendu assez moche ... Il n'y a pas beaucoup de tutos sur le net à ce sujet mis à part de nombreux petits exemples .. Merci pour votre aide ;)


Message édité par Magg27 le 20-02-2011 à 12:50:58
Reply

Marsh Posté le 19-02-2011 à 20:01:47   

Reply

Marsh Posté le 19-02-2011 à 20:13:46    

tu asseble tes deux tableaux pour en avoir un seul distance => altitude et tu files le tout a jpgraph

Reply

Marsh Posté le 19-02-2011 à 21:17:45    

Merci flo mais j'ai le regret de te dire que ça ne marche pas ... "erreur 25044 : Cannot use auto scaling since it is impossible to determine a valid min/max value of the Y-axis (only null values)."
 
Mon code :
 

Code :
  1. <?php
  2. require_once("jpgraph/src/jpgraph.php" );
  3. require_once("jpgraph/src/jpgraph_line.php" );
  4. $lines = file("http://ns11.freeheberg.com/~mastoc/txt/1.txt" );
  5. $count_point=count($lines);
  6. $i=2;
  7. $j=0;
  8. while($i<$count_point)
  9. {
  10. $valeur=floatval($lines[$i+1]);
  11.     $values[$j][1]=$valeur;
  12. $valeur=floatval($lines[$i]);
  13.     $values[$j][2]=$valeur;
  14. $j=$j+1;
  15. $i=$i+4;
  16. }
  17. // Creation du graphique
  18. $graph = new Graph(300,200);
  19. $graph->SetScale("textlin" );
  20. // Création du système de points
  21. $lineplot=new LinePlot($values);
  22. // On rajoute les points au graphique
  23. $graph->Add($lineplot);
  24. // Affichage
  25. $graph->Stroke();
  26. ?>

Reply

Marsh Posté le 20-02-2011 à 12:50:38    

up ?
 
Finalement je vais utiliser Artichow. Pour faire plus simple, j'ai un tas de points de coordonnées X/Y que j'aimerais représenter sur un graphique et relier chaque point entre eux. Une courbe quoi ... Or sur Artichow (ou même JpGraph) on peut mettre que les valeurs de Y. C'est normal ?

Reply

Marsh Posté le 20-02-2011 à 13:07:25    

tu peux faire afficher ton tableau de points
a mon avis, il ne contient pas ce que tu penses et le problème ne vient pas de jpgraph n id'artishow


Message édité par flo850 le 20-02-2011 à 13:07:44
Reply

Marsh Posté le 20-02-2011 à 13:39:05    

Mon tableau :

 
Code :
  1. Array ( [0] => Array ( [1] => 0 [2] => 72.336647 ) [1] => Array ( [1] => 0.063 [2] => 71.963516 ) [2] => Array ( [1] => 0.101 [2] => 70.76535 ) [3] => Array ( [1] => 0.215 [2] => 71.149155 ) [4] => Array ( [1] => 0.277 [2] => 70.911964 ) [5] => Array ( [1] => 0.418 [2] => 67.300827 ) [6] => Array ( [1] => 0.47 [2] => 66.362495 ) [7] => Array ( [1] => 0.513 [2] => 65.937492 ) [8] => Array ( [1] => 0.654 [2] => 64.349159 ) [9] => Array ( [1] => 0.707 [2] => 64.338234 ) [10] => Array ( [1] => 0.745 [2] => 64.862488 ) [11] => Array ( [1] => 0.78 [2] => 65.587494 ) [12] => Array ( [1] => 0.818 [2] => 66.487495 ) [13] => Array ( [1] => 0.839 [2] => 67.012489 ) [14] => Array ( [1] => 0.868 [2] => 67.599159 ) [15] => Array ( [1] => 0.884 [2] => 67.899155 ) [16] => Array ( [1] => 0.903 [2] => 68.361671 ) [17] => Array ( [1] => 0.927 [2] => 69.340286 ) [18] => Array ( [1] => 0.946 [2] => 70.524139 ) [19] => Array ( [1] => 0.966 [2] => 71.986176 ) [20] => Array ( [1] => 0.98 [2] => 72.8778 ) [21] => Array ( [1] => 0.995 [2] => 73.725533 ) [22] => Array ( [1] => 1.016 [2] => 74.995529 ) [23] => Array ( [1] => 1.035 [2] => 75.389061 ) [24] => Array ( [1] => 1.068 [2] => 76.352623 ) [25] => Array ( [1] => 1.086 [2] => 77.063011 ) [26] => Array ( [1] => 1.111 [2] => 78.140831 ) [27] => Array ( [1] => 1.125 [2] => 78.881477 ) [28] => Array ( [1] => 1.151 [2] => 79.897263 ) [29] => Array ( [1] => 1.171 [2] => 80.571518 ) [30] => Array ( [1] => 1.198 [2] => 79.6633 ) [31] => Array ( [1] => 1.219 [2] => 79.332855 ) [32] => Array ( [1] => 1.24 [2] => 79.888298 ) [33] => Array ( [1] => 1.26 [2] => 80.627716 ) [34] => Array ( [1] => 1.275 [2] => 81.144798 ) [35] => Array ( [1] => 1.286 [2] => 81.448456 ) [36] => Array ( [1] => 1.306 [2] => 82.384422 ) [37] => Array ( [1] => 1.368 [2] => 83.644691 ) [38] => Array ( [1] => 1.394 [2] => 84.295807 ) [39] => Array ( [1] => 1.41 [2] => 85.370811 ) [40] => Array ( [1] => 1.436 [2] => 87.170807 ) [41] => Array ( [1] => 1.469 [2] => 89.320808 ) [42] => Array ( [1] => 1.508 [2] => 92.24482 ) [43] => Array ( [1] => 1.561 [2] => 96.286484 ) [44] => Array ( [1] => 1.602 [2] => 99.326805 ) [45] => Array ( [1] => 1.617 [2] => 100.740372 ) [46] => Array ( [1] => 1.648 [2] => 103.396629 ) [47] => Array ( [1] => 1.68 [2] => 105.796638 ) [48] => Array ( [1] => 1.712 [2] => 108.386635 ) [49] => Array ( [1] => 1.726 [2] => 109.711639 ) [50] => Array ( [1] => 1.745 [2] => 110.911636 ) [51] => Array ( [1] => 1.757 [2] => 111.803841 ) [52] => Array ( [1] => 1.773 [2] => 112.404716 ) [53] => Array ( [1] => 1.789 [2] => 112.930901 ) [54] => Array ( [1] => 1.838 [2] => 115.608299 ) [55] => Array ( [1] => 1.923 [2] => 119.031013 ) [56] => Array ( [1] => 1.979 [2] => 119.593163 ) [57] => Array ( [1] => 1.993 [2] => 119.588051 ) [58] => Array ( [1] => 2.026 [2] => 119.26416 ) [59] => Array ( [1] => 2.073 [2] => 118.963318 ) [60] => Array ( [1] => 2.115 [2] => 118.976097 ) [61] => Array ( [1] => 2.158 [2] => 119.156029 ) [62] => Array ( [1] => 2.198 [2] => 119.899139 ) [63] => Array ( [1] => 2.213 [2] => 120.474136 ) [64] => Array ( [1] => 2.258 [2] => 121.96035 ) [65] => Array ( [1] => 2.305 [2] => 123.025826 ) [66] => Array ( [1] => 2.354 [2] => 123.334801 ) [67] => Array ( [1] => 2.389 [2] => 124.213333 ) [68] => Array ( [1] => 2.419 [2] => 124.66333 ) [69] => Array ( [1] => 2.441 [2] => 124.840919 ) [70] => Array ( [1] => 2.461 [2] => 124.429749 ) [71] => Array ( [1] => 2.495 [2] => 124.028008 ) [72] => Array ( [1] => 2.535 [2] => 123.360619 ) [73] => Array ( [1] => 2.574 [2] => 122.624825 ) [74] => Array ( [1] => 2.61 [2] => 121.31723 ) [75] => Array ( [1] => 2.637 [2] => 119.519302 ) [76] => Array ( [1] => 2.656 [2] => 117.986198 ) [77] => Array ( [1] => 2.669 [2] => 116.824928 ) [78] => Array ( [1] => 2.679 [2] => 116.074806 ) [79] => Array ( [1] => 2.707 [2] => 115.851662 ) [80] => Array ( [1] => 2.721 [2] => 114.454849 ) )
 

Je n'ai pas mis le tableau entier car il est très gros mais je peux t'assurer que chaque cellule contient une valeur numérique même la dernière.

 

code php :

 
Code :
  1. <?php
  2. require_once "Artichow/LinePlot.class.php";
  3. $lines = file("http://ns11.freeheberg.com/~mastoc/txt/2.txt" );
  4. $count_point=count($lines);
  5. $i=2;
  6. $j=0;
  7. while($i<$count_point)
  8. {
  9. $valeur=floatval($lines[$i+1]);
  10.     $values[$j][1]=$valeur;
  11. $valeur=floatval($lines[$i]);
  12.     $values[$j][2]=$valeur;
  13. $j=$j+1;
  14. $i=$i+4;
  15. }
  16. $graph = new Graph(400, 400);
  17. $plot = new LinePlot($values);
  18. $plot->xAxis->label->setAngle(90);
  19. $plot->xAxis->setLabelInterval(100);
  20. // On affiche le graphique
  21. // Les valeurs de l'axe des X ont été automatiquement mises à jour
  22. $graph->add($plot);
  23. $graph->draw();
  24. // Finalement, la courbe représentative de log(x) apparaît très correctement
  25. ?>
 

Erreur Artichow : "Class Plot : Expected numeric values for the plot."

 


Sinon avec ce code :

 
Code :
  1. <?php
  2. require_once "Artichow/LinePlot.class.php";
  3. $lines = file("http://ns11.freeheberg.com/~mastoc/txt/2.txt" );
  4. $count_point=count($lines);
  5. $i=2;
  6. $j=0;
  7. while($i<$count_point)
  8. {
  9. $valeur=floatval($lines[$i+1]);
  10.     $tab_distance[$j]=$valeur;
  11. $valeur=floatval($lines[$i]);
  12.     $tab_altitude[$j]=$valeur;
  13. $j=$j+1;
  14. $i=$i+4;
  15. }
  16. $graph = new Graph(400, 400);
  17. $plot = new LinePlot($tab_altitude);
  18. $plot->xAxis->setLabelText($tab_distance);
  19. $plot->xAxis->label->setAngle(90);
  20. $plot->xAxis->setLabelInterval(100);
  21. // On affiche le graphique
  22. // Les valeurs de l'axe des X ont été automatiquement mises à jour
  23. $graph->add($plot);
  24. $graph->draw();
  25. // Finalement, la courbe représentative de log(x) apparaît très correctement
  26. ?>
 

J'ai bien réussi à faire ce graphique http://ns11.freeheberg.com/~mastoc/test.php mais l'échelle n'est pas bonne du tout ... Je suis encore loin de cette qualité là : http://www.tracegps.com/fichiers/100/deniv/9271de.png ..

 

Bref, si tout ceci te parle, merci pour ton aide  :)


Message édité par Magg27 le 20-02-2011 à 13:43:32
Reply

Marsh Posté le 20-02-2011 à 20:24:05    

Personne n'a une solution pour reproduire ce graphique : http://www.tracegps.com/fichiers/100/deniv/9271de.png avec Artichow ? J'ai pas arrêté de scruter le net et je ne vois que des graphiques en fonction de jour de la semaine, d'année ou des petits array tout pourris du genre array(-3,2,1,4,5) ... Ca ne m'avance pas beaucoup ..


Message édité par Magg27 le 20-02-2011 à 20:25:23
Reply

Marsh Posté le 21-02-2011 à 09:58:52    

Dans mon appli Astres (cf signature), j'ai un module de production de stats (y'en a nombreux types). Si, effectivement, j'en produit un bon nombre avec comme axe X, des dates/semaine/mois/années, j'en ai aussi avec des nombres. Par ailleurs, j'ai inclus une couche d'abstraction qui permet d'utiliser indifféremment JPGraph et Artichow. Regardes, si y'aurait pas des fonctions dans mon code qui pourraient t'aider ;)


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 21-02-2011 à 18:36:17    

C'est vraiment très ympa à toi rufo mais je m'y perd dans ta réalisation ... Je vois pas trop où cherché .. T'aurais moyen de me pondre un graphique un peu comme celui-ci : http://www.tracegps.com/fichiers/100/deniv/9271de.png en réutilisant mon petit code ? :

 
Code :
  1. <?php
  2. require_once "Artichow/LinePlot.class.php";
  3. $lines = file("http://ns11.freeheberg.com/~mastoc/txt/2.txt" );
  4. $count_point=count($lines);
  5. $i=2;
  6. $j=0;
  7. while($i<$count_point)
  8. {
  9. $valeur=floatval($lines[$i+1]);
  10. $tab_distance[$j]=$valeur;
  11. $valeur=floatval($lines[$i]);
  12. $tab_altitude[$j]=$valeur;
  13. $j=$j+1;
  14. $i=$i+4;
  15. }
  16. $graph = new Graph(400, 400);
  17. $plot = new LinePlot($tab_altitude);
  18. $plot->xAxis->setLabelText($tab_distance);
  19. $plot->xAxis->label->setAngle(90);
  20. $plot->xAxis->setLabelInterval(100);
  21. // On affiche le graphique
  22. // Les valeurs de l'axe des X ont été automatiquement mises à jour
  23. $graph->add($plot);
  24. $graph->draw();
  25. // Finalement, la courbe représentative de log(x) apparaît très correctement
  26. ?>
 

Il marche bien. Comme tu peux le voir ici : http://ns11.freeheberg.com/~mastoc/test.php c'est juste la mise en page qui me pose problème.


Message édité par Magg27 le 21-02-2011 à 18:37:07
Reply

Marsh Posté le 22-02-2011 à 11:22:12    

La surcouche que j'ai développée se trouve dans /Astres/Support/Stats/StatsLibrary.php. Sa mise en oeuvre se trouve dans les fichiers qui se trouvent dans /Astres/Support/Stats/ et don le nom commence par "Process...".
 
La fonction "surcouche" se nomme createGraphicStats(). Pour utiliser directement celle pour Artichow, faut prendre createGraphicArtichowStats().
 
Je pense que l'un de tes pbs, si j'ai bien compris, outre le grand nb de données à afficher, est que l'axe X n'a pas des valeurs espacées de manière identique (pas un intervalle). Tu peux donc résoudre ton pb comme ça : http://www.artichow.org/doc/Axis#method.addTick
Ne pas activer la gestion de l'axe X automatique et générer des ticks (fonction addTick()). Dans mon appli, de mémoire, je n'avais pas ce cas de figure à gérer.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 22-02-2011 à 11:22:12   

Reply

Marsh Posté le 22-02-2011 à 18:09:07    

Oui voilà tu as presque tout compris. Ma courbe est aussi obligée d'utiliser des points de coordonnées précis (c'est-à-dire X et Y) et pas seulement une succession de valeurs Y indépendantes de X. Pourquoi ?

 

Les traces GPS s'obtiennent avec un petit appareil mobile qui enregistre les points aussi bien à l'arrêt qu'en déplacement. Typiquement, on peut avoir ce genre de relevé :

 


Kilomètres parcourus (km) (X) |  Altitude (m) (Y)

 

0 (Départ)                           | 100
0.5                                    |  105
1                                       |  90
2                                       |  95
2 (Pause café)                     |   95
2 (Pause café)                     |   95
2 (Pause café)                     |   95
2 (Pause café)                     |   95
2 (Pause café)                     |   95
2.5 (Reprise)                       |   96
3 (Arrivée)                          |   100

 


Maintenant que j'ai mes tableaux kilomètre et altitude, et si j'utilise seulement mes altitudes pour tracer ma courbe, on est d'accord que ma courbe va continuer à évoluer au fil des kilomètres durant la pause café ... et ça fausse tout puisque la longeur de l'axe des abscisses ne sera pas forcément représentative de la distance totale du parcours.
Donc ce n'est pas seulement une histoire d'échelle ou de ticks à configurer ...

 

Mon projet serait-il plus facile à réaliser avec jpgraph par exemple ? jpgraph a l'air de présenter davantage de doc (essentiellement anglophone) mais je n'ai pas encore ce qu'il me faut ..

 

Merci rufo de m'avoir fait découvrir ton appli mais effectivement il n'y a pas le même cas de figure que moi.

 

Merci pour ton aide  :)


Message édité par Magg27 le 22-02-2011 à 19:19:25
Reply

Marsh Posté le 22-02-2011 à 19:45:38    

Bon en fait j'ai trouvé mon bonheur  :) (voyez par vous-même : http://ns11.freeheberg.com/~mastoc/test.php ). Petite librairie JS peu connu apparemment : http://www.jscharts.com/ . Ca fait de jolies graphique très rapide à charger : c'est époustouflant ... Facile à customiser. Seul bémol on dirait qu'il y a des droits dessus ... La licence coûte 149$ (cf : en bas de la page d'accueil). On peut bien sûr l'utiliser gratuitement à titre personnel mais je ne sais pas si j'ai bien le droit de l'utiliser sur mon site perso en ligne ... Qu'en pensez-vous ?


Message édité par Magg27 le 22-02-2011 à 19:46:18
Reply

Marsh Posté le 23-02-2011 à 10:22:49    

Pour un site perso sans but commercial, tu peux.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 23-02-2011 à 15:07:58    

OK Merci pour ton aide rufo  ;)  A+

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed