Précédent   Forum des professionnels en informatique > PHP > Bibliothèques et frameworks > Images > JpGraph
JpGraph Forum d'entraide pour la bibliothèque JpGraph permettant de manipuler des images en PHP. Avant de poster -> tutoriels JpGraph
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 26/07/2011, 13h45   #1
Invité de passage
 
Homme
Administrateur de base de données
Inscription : mars 2011
Messages : 21
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Suisse

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : mars 2011
Messages : 21
Points : 0
Points : 0
Par défaut Génération de graphique à partir d'une bdd

Bonjour,

J'ai un problème avec la génération de mes graphiques à partir d'une base de données. Mes données contiennent des dates et valeurs qui sont rattaché à une mesure qui sont rattaché à un indicateur.

L'indicateur possède 1 ou plusieurs mesures qui possède 1 ou plusieurs données.

Exemple de données dans la base :
Mesures :
Mesure 1
Mesure 2

Données rattachée à Mesure 1 :
01.07.2011 100
02.07.2011 200
03.07.2011 300
04.07.2011 400

Données rattachée à Mesure 2 :
03.07.2011 150
04.07.2011 300
05.07.2011 400
06.07.2011 600

Je voudrais avec ces données généré un graphique dynamiquement :

Le code ci-dessous fonctionne pas mal :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
 
<?php 
require_once ('jpgraph/jpgraph.php');
require_once ('jpgraph/jpgraph_line.php');
 
$data = $connexion->query("SELECT v.date, v.valeur, m.nom as mesure FROM indicateur_mesure im JOIN mesure m ON im.idMesure = m.idMesure JOIN valeur v ON m.idMesure = v.idMesure WHERE idIndicateur = $id ORDER BY date")->fetchAll();
 
foreach ($data as $value) {
        $xy[$value['mesure']][$value['date']] = $value['valeur'];
        $y[] = $value['date'];
    }
 
$graph = new Graph(800,600);
$graph->SetScale("textlin");
 
$graph->yaxis->HideTicks(false,false);
$graph->xgrid->Show();
$graph->xgrid->SetLineStyle("solid");
$graph->xaxis->SetTickLabels($y);
$graph->xgrid->SetColor('#E3E3E3');
 
foreach ($xy as $key => $value) {
    $lplot = new LinePlot(array_values($xy[$key]));
    if(!$preview)
        $lplot->SetLegend($key);
    $graph->Add($lplot);
}
 
$graph->stroke();
 
?>
Le problème c'est que les dates correspondent pas, y aurait il un expert JPGRAPH dans le forum ?
mbagiella est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/07/2011, 07h31   #2
Membre du Club
 
Homme Clément Viguié
Technicien SIG
Inscription : janvier 2011
Messages : 37
Détails du profil
Informations personnelles :
Nom : Homme Clément Viguié
Âge : 27
Localisation : France

Informations professionnelles :
Activité : Technicien SIG
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : janvier 2011
Messages : 37
Points : 42
Points : 42
Bonjour,
Quand tu dis les dates ne correspondent pas tu veux dire quoi par là jpgraph les interprete mal ou simplment entre 2 points de mesures tu n'as pas les mêmes dates et donc jp graph les affiche n'importe comment?
Clément FREDON est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/07/2011, 10h31   #3
Membre régulier
 
Avatar de ypcman
 
Homme Yves
Responsable en conduite du changement
Inscription : janvier 2011
Messages : 63
Détails du profil
Informations personnelles :
Nom : Homme Yves
Localisation : France

Informations professionnelles :
Activité : Responsable en conduite du changement
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : janvier 2011
Messages : 63
Points : 73
Points : 73
A tout hasard, la date 03.07.2011 doivent être fournie à jpgrah sous la forme 2011-07-03
ypcman est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/07/2011, 16h32   #4
Invité de passage
 
Homme
Administrateur de base de données
Inscription : mars 2011
Messages : 21
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Suisse

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : mars 2011
Messages : 21
Points : 0
Points : 0
Non non je ne dit pas qu'il y a un problème d'interprétation le problème vient de ma boucle for each je pense et surtout des labels.

Supposons que j'aie comme valeurs ceci :

Données rattachée à Mesure 1 :
01.07.2011 100
02.07.2011 200
03.07.2011 300
04.07.2011 400

Données rattachée à Mesure 2 :
03.07.2011 150
04.07.2011 300
05.07.2011 400
06.07.2011 600

Ben mon graphe aura les label mal positionée :

01.07.2011 100 150
02.07.2011 200 300
03.07.2011 300 400
04.07.2011 400 600

Comme ceci

au lieu de ceci

01.07.2011 100 0
02.07.2011 200 0
03.07.2011 150 150
04.07.2011 300 300
05.07.2011 0 400
06.07.2011 0 600

Si parmi vous il y a un expert, je voudrais ensuite faire une gestion de ces mesures par exemple y ajouter une granularité (jour,semaine,mois,années)

et aussi choisir un début et une fin

Mais pour l'instant j'essaie tant bien que mal à faire un graph cohérent
mbagiella est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/07/2011, 18h50   #5
Membre régulier
 
Avatar de ypcman
 
Homme Yves
Responsable en conduite du changement
Inscription : janvier 2011
Messages : 63
Détails du profil
Informations personnelles :
Nom : Homme Yves
Localisation : France

Informations professionnelles :
Activité : Responsable en conduite du changement
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : janvier 2011
Messages : 63
Points : 73
Points : 73
c'est plus clair.

Avec jpgraph, une valeur vide doit être remplacée par "-".
Ainsi, si tu as des valeurs pour janvier, février, et, avril mais pas mars, le fait de donner à mars cette valeur sera visualisé par une ligne allant de février à avril.

Tu dois donc initialiser ton tableau $xy avant d'y entrer les données.
pour celà, tu dois :
  1. trouver le nombre de ligne de ton tableau ie le mb de mesure. tu auras la valeur avec mysql_nums_rows($data)
  2. trouver la date min, la date max et donc le nb de colonne (ie de date)
  3. initialiser le tableau avec la valeur "-". celà corespond à une non valeur dans un graphe jpgraph.
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $xy=array();
    for($ligne=0;$ligne<$nb_mesure;$ligne++)
        {
        for($colonne=0;$colonne<$nb_date;$colonne++)
            {
        date_tempon=fonction_ajoutant_colonne_jours_a_une_date($date_mini,$colonne);
            $xy[$ligne][$date_tempon]="-";
            }
        }
  4. dérouler la boucle foreach qui remplacera les "-" par les données existantes
Tu trouveras le script pour la fonction sur les dates sur tout bon forum
Bon courage.
ypcman est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/08/2011, 12h23   #6
Invité de passage
 
Homme
Administrateur de base de données
Inscription : mars 2011
Messages : 21
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Suisse

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : mars 2011
Messages : 21
Points : 0
Points : 0
Wow ça c'est du code, par contre j'ai du mal à le comprendre .

que signifie date_tempon=fonction_ajoutant_colonne_jours_a_une_date($date_mini,$colonne); ?

Merci
mbagiella est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/08/2011, 15h17   #7
Membre régulier
 
Avatar de ypcman
 
Homme Yves
Responsable en conduite du changement
Inscription : janvier 2011
Messages : 63
Détails du profil
Informations personnelles :
Nom : Homme Yves
Localisation : France

Informations professionnelles :
Activité : Responsable en conduite du changement
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : janvier 2011
Messages : 63
Points : 73
Points : 73
[quote=ypcman;6151208]Oups, j'ai oublié un"$" avant date_tampon ...
c'est mieux ainsi :
Code :
1
2
3
4
5
6
7
8
9
$xy=array();
for($ligne=0;$ligne<$nb_mesure;$ligne++)
    {
    for($colonne=0;$colonne<$nb_date;$colonne++)
        {
    $date_tempon=fonction_ajoutant_colonne_jours_a_une_date($date_mini,$colonne);
        $xy[$ligne][$date_tempon]="-";
        }
    }
ypcman est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/08/2011, 11h08   #8
Invité de passage
 
Homme
Administrateur de base de données
Inscription : mars 2011
Messages : 21
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Suisse

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : mars 2011
Messages : 21
Points : 0
Points : 0
Au fait je ne comprend pas ce que dois me retourner cette fonction :


fonction_ajoutant_colonne_jours_a_une_date($date_mini,$colonne);



Merci

Pour l'instant mon graphe avec ces données :

date val mesure
2011-08-01 1 Aout
2011-08-02 2 Aout
2011-08-03 3 Aout
2011-08-04 4 Aout
2011-08-05 5 Aout
2011-08-06 6 Aout
2011-08-07 7 Aout
2011-09-01 1 Septembre
2011-09-02 2 Septembre
2011-09-03 3 Septembre
2011-09-04 4 Septembre
2011-09-05 5 Septembre
2011-09-06 6 Septembre
2011-09-07 7 Septembre

J'ai mis ce qu'il est et ce qu'il devrait être en pièce jointe

L'astuce serait de mettre un array avec le nombre de dates dans un array et l'initialiser à '-' :

J'ai réussi à faire ce que je voulais par contre mon code et assez brutal, il n'y aurait il pas une autre façon de l'écrire moin bourrin ?

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
 
/* Recherche de toutes mes dates */
$date =  $this->db->query("SELECT DISTINCT(date) FROM valeur ORDER BY date")->fetchAll();
 
 
 
/* Initialiser le tableau des dates avec 0 */
$arrayDate = Array();
foreach ($date as $value){
   $arrayDate[$value['date']] = 0'';
}
 
 
/* Recherche de toutes mes mesures */
$mesure = $this->db->query("SELECT DISTINCT(mesure) FROM valeur")->fetchAll();
 
$tab = array(); /* mon tableau qui alimentera mon graphique */
foreach ($mesure as $value){
  $tab[$value['mesure']] = $arrayDate;
  $nomMesure = $value['mesure'];
  $res = $this->db->query("SELECT date, SUM(val) as val, mesure FROM valeur WHERE mesure = '$nomMesure' GROUP BY date ORDER BY date");
  foreach ($res as $value){
      $tab[$value['mesure']][$value['date']] = $value['val'];
  }
}
 
// le vardump de celà me donne 
array
  'Aout' => 
    array
      '01 08 11' => string '1' (length=1)
      '02 08 11' => string '2' (length=1)
      '03 08 11' => string '3' (length=1)
      '04 08 11' => string '4' (length=1)
      '05 08 11' => string '5' (length=1)
      '06 08 11' => string '6' (length=1)
      '07 08 11' => string '7' (length=1)
      '01 09 11' => string '0' (length=1)
      '02 09 11' => string '0' (length=1)
      '03 09 11' => string '0' (length=1)
      '04 09 11' => string '0' (length=1)
      '05 09 11' => string '0' (length=1)
      '06 09 11' => string '0' (length=1)
  'Septembre' => 
    array
      '01 08 11' => string '0' (length=1)
      '02 08 11' => string '0' (length=1)
      '03 08 11' => string '0' (length=1)
      '04 08 11' => string '0' (length=1)
      '05 08 11' => string '0' (length=1)
      '06 08 11' => string '0' (length=1)
      '07 08 11' => string '0' (length=1)
      '01 09 11' => string '1' (length=1)
      '02 09 11' => string '2' (length=1)
      '03 09 11' => string '3' (length=1)
      '04 09 11' => string '4' (length=1)
      '05 09 11' => string '5' (length=1)
      '06 09 11' => string '6' (length=1)
      '07 09 11' => string '7' (length=1)
 
 
// et pour enfin faire un truc du genre
$graph = new Graph(280,400);
$graph->SetScale("textint");
 
$graph->xaxis->SetTickLabels($y);
$graph->xaxis->SetLabelAngle(90);
 
$aGroupBarPlot = array();
 
foreach ($xy as $key => $value) {
    $bplot = new BarPlot(array_values($xy[$key]));
    if(!$preview)
        $bplot->SetLegend($key);
    $aGroupBarPlot[] = $bplot;
}
 
$gbarplot = new GroupBarPlot($aGroupBarPlot);
$graph->add($gbarplot);
$graph->stroke();
 
 
// Merci si vous pouvez affiner corriger mon code
Images attachées
Type de fichier : png 1-12.png (6,5 Ko, 10 affichages)
Type de fichier : png Sans titre.png (15,4 Ko, 3 affichages)
mbagiella est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/08/2011, 16h17   #9
Membre régulier
 
Avatar de ypcman
 
Homme Yves
Responsable en conduite du changement
Inscription : janvier 2011
Messages : 63
Détails du profil
Informations personnelles :
Nom : Homme Yves
Localisation : France

Informations professionnelles :
Activité : Responsable en conduite du changement
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : janvier 2011
Messages : 63
Points : 73
Points : 73
Tu as besoin de cette fonction pour générer l'ensemble des dates entre 2 dates données.
Si ta date la plus ancienne est le 26 février 2011, et la plus récente le 15 mars 2011, tu dois générer : 2011-02-26, 2011-02-27,2011-02-28, 2011-03-01, 2011-03-02 ,..., 2011-03-14, 2011-03-15 même si tu n'as pas de valeurs pour ces 18 jours. Cela te donneras des abscisses propres et les jours sans valeurs ayant "-" comme valeur, le graphe les ignorera.
A quoi sert la fonction ? A générer ces dates sous la forme "YYYY-mm-dd".
Exemple : tu es le 26 février 2011 et tu veux connaitre la date 5 jours plus tard.
tu entres comme argument "2011-02-26, 5" et la fonction te retournes "2011-03-03".
Exemple de code source pour cette fonction :

Code :
1
2
3
4
5
6
 
fonction_ajoutant_colonne_jours_a_une_date($date_entree,$nb_jours)
{
$date_sortie=date("Y-m-d", mktime(0, 0, 0, date("m",$date_entree), date("d",$date_entree), date("Y",$date_entree)) + $nb_jours*24*3600);
return $date_sortie;
}
A tester, il y a peut-être un ; mal placé
Bon courage.
ypcman est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/08/2011, 11h29   #10
Membre régulier
 
Avatar de ypcman
 
Homme Yves
Responsable en conduite du changement
Inscription : janvier 2011
Messages : 63
Détails du profil
Informations personnelles :
Nom : Homme Yves
Localisation : France

Informations professionnelles :
Activité : Responsable en conduite du changement
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : janvier 2011
Messages : 63
Points : 73
Points : 73
Bonjour.
la solution peut être nettement plus simple en fonction de ce que tu cherches à afficher.
  • dans ton premier jeu de données, tu as 2 jeu de mesures sur des périodes quasi identiques (mesure 1 du 1 au 4 juillet, et mesure 2 du 3 au 7 juillet)
  • dans ton deuxième jeu de données tu as 2 jeu de mesures, une sur chaque mois (août et septembre)
.
ce n'est pas du tout la même chose.
Si tu souhaites comparer des mois entre eux, tu créé simplement un tableau avec n lignes (nb de mois) et 31 colonnes que tu remplis de "0" (0 et non pas - car c'est un bar et non pas une line).
J'ai repris tes données avec le bout de code suivant en en supprimant certains jours et en donnant des valeurs plus parlantes.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
<?php
require_once ('jpgraph/jpgraph.php');
require_once ('jpgraph/jpgraph_bar.php');
 
 /*
 date val mesure
2011-08-01 10 Aout
2011-08-02 20 Aout
// 2011-08-03 13 Aout
2011-08-04 24 Aout
2011-08-05 35 Aout
2011-08-06 16 Aout
2011-08-07 7 Aout
2011-09-01 13 Septembre
2011-09-02 21 Septembre
// 2011-09-03 13 Septembre
2011-09-04 42 Septembre
// 2011-09-05 25 Septembre
2011-09-06 36 Septembre
2011-09-07 17 Septembre
 */
 
 for($indice=0;$indice<31;$indice++)
	{
	$tabVal[0][$indice]=0;
	$tabVal[1][$indice]=0;
	}
// attention les dates sont décalées : le 2 est noté dans [1] !!!
// $tabVal[]=array(10,20,0,24,35,16,7); 
$tabVal[0][0]=10;
$tabVal[0][1]=20;
$tabVal[0][3]=24;
$tabVal[0][4]=35;
$tabVal[0][5]=16;
$tabVal[0][6]=7;
 
// $tabVal[]=array(13,21,0,42,0,36,17);
$tabVal[1][0]=13;
$tabVal[1][1]=21;
$tabVal[1][3]=42;
$tabVal[1][5]=36;
$tabVal[1][6]=17;
 
 
 
 
 $tabMesure=array("AOUT","SEPT");
 
$graph = new Graph(600,200,'auto');    
$graph->SetScale("textlin");
$graph->SetShadow();
$graph->img->SetMargin(40,30,40,40);
 
// Setup labels
// $lbl = array("01","02","03","04","05","06","07");
// $graph->xaxis->SetTickLabels($lbl);  
 
$graph->xaxis->title->Set('2011');
$graph->xaxis->title->SetFont(FF_FONT1,FS_BOLD);
 
$graph->title->Set('exemple');
$graph->title->SetFont(FF_FONT1,FS_BOLD);
 $indice=0;
 foreach($tabVal as $val)
	{
	$bplot[$indice] = new BarPlot($val);
	$bplot[$indice]->SetLegend($tabMesure[$indice]);
	$indice++;
	}
 
$gbarplot = new GroupBarPlot($bplot);
$gbarplot->SetWidth(0.6);
$graph->Add($gbarplot);
 
$graph->Stroke();
?>
et en image :

Ou bien tu ne veux que les dates pou lesquelles tu as des valeurs, ce qui donnes :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
<?php
/*
require_once("../include/Util.php");
require_once ('../include/jpgraph/jpgraph.php');
require_once ('../include/jpgraph/jpgraph_bar.php');
*/
require_once ('jpgraph/jpgraph.php');
require_once ('jpgraph/jpgraph_bar.php'); 
 /*
 date val mesure
2011-08-01 10 Aout
2011-08-02 20 Aout
// 2011-08-03 13 Aout
2011-08-04 24 Aout
2011-08-05 35 Aout
2011-08-06 16 Aout
2011-08-07 7 Aout
2011-09-01 13 Septembre
2011-09-02 21 Septembre
// 2011-09-03 13 Septembre
2011-09-04 42 Septembre
// 2011-09-05 25 Septembre
2011-09-06 36 Septembre
2011-09-07 17 Septembre
 */
 
 $tabVal[]=array(10,20,0,24,35,16,7);
 $tabVal[]=array(13,21,0,42,0,36,17);
 $tabMesure=array("AOUT","SEPT");
 
$graph = new Graph(450,200,'auto');    
$graph->SetScale("textlin");
$graph->SetShadow();
$graph->img->SetMargin(40,30,40,40);
 
// Setup labels
$lbl = array("01","02","03","04","05","06","07");
$graph->xaxis->SetTickLabels($lbl);  
 
$graph->xaxis->title->Set('2011');
$graph->xaxis->title->SetFont(FF_FONT1,FS_BOLD);
 
$graph->title->Set('exemple');
$graph->title->SetFont(FF_FONT1,FS_BOLD);
 $indice=0;
 foreach($tabVal as $val)
	{
	$bplot[$indice] = new BarPlot($val);
	$bplot[$indice]->SetLegend($tabMesure[$indice]);
	$indice++;
	}
 
$gbarplot = new GroupBarPlot($bplot);
$gbarplot->SetWidth(0.6);
$graph->Add($gbarplot);
 
$graph->Stroke();
?>
ce qui donnes en image :
Images attachées
Type de fichier : png test_jpgraph_07.png (4,2 Ko, 38 affichages)
Type de fichier : png test_jpgraph_08.png (5,2 Ko, 36 affichages)
ypcman est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 15/08/2011, 13h27   #11
Invité de passage
 
Homme
Administrateur de base de données
Inscription : mars 2011
Messages : 21
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Suisse

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : mars 2011
Messages : 21
Points : 0
Points : 0
Wow merci pour tous ces détails
mbagiella est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/08/2011, 12h39   #12
Rédacteur/Modérateur
 
Avatar de andry.aime
 
Homme Andry Aimé
Inscription : septembre 2007
Messages : 5 128
Détails du profil
Informations personnelles :
Nom : Homme Andry Aimé
Localisation : Ile Maurice

Informations forums :
Inscription : septembre 2007
Messages : 5 128
Points : 7 269
Points : 7 269
Bonjour,

Si tu veux utiliser directement GD sans télécharger JpGraph pour un Histogramme, voici un tutoriel Création de graphes statistiques et géométriques avec PHP et la librairie GD

A+.
andry.aime est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 07h40.


 
 
 
 
Partenaires

Hébergement Web