IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bibliothèques et frameworks PHP Discussion :

[JpGraph] Génération de graphique à partir d'une bdd


Sujet :

Bibliothèques et frameworks PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mars 2011
    Messages
    23
    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 : 23
    Par défaut [JpGraph] 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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 ?

  2. #2
    Membre confirmé
    Homme Profil pro
    Technicien SIG
    Inscrit en
    Janvier 2011
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Janvier 2011
    Messages : 37
    Par défaut
    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?

  3. #3
    Membre émérite Avatar de ypcman
    Homme Profil pro
    Retraité codeur !
    Inscrit en
    Janvier 2011
    Messages
    601
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité codeur !
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2011
    Messages : 601
    Par défaut
    A tout hasard, la date 03.07.2011 doivent être fournie à jpgrah sous la forme 2011-07-03

  4. #4
    Membre averti
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mars 2011
    Messages
    23
    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 : 23
    Par défaut
    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

  5. #5
    Membre émérite Avatar de ypcman
    Homme Profil pro
    Retraité codeur !
    Inscrit en
    Janvier 2011
    Messages
    601
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité codeur !
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2011
    Messages : 601
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
      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.

  6. #6
    Membre averti
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mars 2011
    Messages
    23
    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 : 23
    Par défaut
    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

  7. #7
    Membre émérite Avatar de ypcman
    Homme Profil pro
    Retraité codeur !
    Inscrit en
    Janvier 2011
    Messages
    601
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité codeur !
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2011
    Messages : 601
    Par défaut
    [quote=ypcman;6151208]Oups, j'ai oublié un"$" avant date_tampon ...
    c'est mieux ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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]="-";
            }
        }

  8. #8
    Membre averti
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mars 2011
    Messages
    23
    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 : 23
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 Images attachées   

  9. #9
    Membre émérite Avatar de ypcman
    Homme Profil pro
    Retraité codeur !
    Inscrit en
    Janvier 2011
    Messages
    601
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité codeur !
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2011
    Messages : 601
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

Discussions similaires

  1. Génération de pdf à partir d'une bdd
    Par glesker dans le forum Autres langages pour le Web
    Réponses: 1
    Dernier message: 27/10/2008, 22h08
  2. génération d'un fichier texte a partir d'une BDD
    Par devoracle dans le forum Forms
    Réponses: 7
    Dernier message: 02/11/2006, 12h11
  3. [JpGraph] Générer un graphique à partir d'une requête
    Par shun dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 31/01/2006, 20h24
  4. Réponses: 3
    Dernier message: 03/08/2005, 12h21
  5. [Listview] Remplissage à partir d'une bdd mysql
    Par Cybher dans le forum C++Builder
    Réponses: 2
    Dernier message: 18/07/2005, 10h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo