Charts NVD3.js et Json

Eléphant du PHP | 103 Messages

14 oct. 2013, 01:44

Bonsoir!

Je souhaite utiliser NVD3.js http://nvd3.org/ghpages/lineWithFocus.html mais je ne saisi pas comment l'utiliser avec mes données MySQL.

Depuis une base MySQL, je pense que le mieux est d'utiliser JSON (votre avis?) :
$connexion = new PDO('mysql:host=localhost;dbname=MABASE', 'USER', 'PASSWORD');
  $connexion->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
  $connexion->setAttribute(\PDO::ATTR_DEFAULT_FETCH_MODE, \PDO::FETCH_OBJ);
  $connexion->setAttribute(\PDO::ATTR_EMULATE_PREPARES, false);
  $connexion->setAttribute(\PDO::ATTR_CASE, \PDO::CASE_LOWER);
  $data=$connexion->query('SELECT date, value FROM matable` ORDER BY  date ASC');

while( $resultat = $data->fetch() )
  {
    $rows['value'][] = $resultat;       
  }
  print json_encode($rows);
  $jsondata=json_encode($rows);
J'obtiens en gros :
{"value":[{"date":"2013-10-01","value":"685"},{"date":"2013-10-02","value":"521"},{"date":"2013-10-03","value":"54521"},{"date":"2013-10-04","value":"8484"},{"date":"2013-10-05","value":"84841"},{"date":"2013-10-06","value":"123"},{"date":"2013-10-07","value":"56"}]}
Je sais que le code dois commencer de la sorte :
<!DOCTYPE html>
<meta charset="utf-8">

<link href="novuschart/src/nv.d3.css" rel="stylesheet" type="text/css">

<style>

body {
  overflow-y:scroll;
}

text {
  font: 12px sans-serif;
}

svg {
  display: block;
}

#chart1 svg {
  height: 500px;
  min-width: 100px;
  min-height: 100px;
/*
  margin: 50px;
  Minimum height and width is a good idea to prevent negative SVG dimensions...
  For example width should be =< margin.left + margin.right + 1,
  of course 1 pixel for the entire chart would not be very useful, BUT should not have errors
*/
}

</style>
<body>

  <div id="chart" class='with-3d-shadow with-transitions'>
    <svg style="height: 500px;"></svg>
  </div>

<script src="novuschart/lib/d3.v3.js"></script>
<script src="novuschart/nv.d3.js"></script>
<script src="novuschart/src/tooltip.js"></script>
<script src="novuschart/src/utils.js"></script>
<script src="novuschart/src/models/legend.js"></script>
<script src="novuschart/src/models/axis.js"></script>
<script src="novuschart/src/models/scatter.js"></script>
<script src="novuschart/src/models/line.js"></script>
<script src="novuschart/src/models/lineWithFocusChart.js"></script>
<script src="novuschart/stream_layers.js"></script>
mais la suite bloque, l'exemple et le génerateur http://nvd3.org/livecode/#codemirrorNav indiquent :
[javascript]
<script>
nv.addGraph(function() {
var chart = nv.models.lineWithFocusChart();

chart.xAxis
.tickFormat(d3.format(',f'));

chart.yAxis
.tickFormat(d3.format(',.2f'));

chart.y2Axis
.tickFormat(d3.format(',.2f'));

d3.select('#chart svg')
.datum(testData())
.transition().duration(500)
.call(chart);

nv.utils.windowResize(chart.update);

return chart;
});
</script>
[/javascript]

puis une génerateur de data, comment y mettre mon JSON??
function testData() {
return stream_layers(3,128,.1).map(function(data, i) {
return { 
key: 'Stream' + i,
values: data
};
});
}
Merci et bonne nuit!!!

Eléphant du PHP | 103 Messages

17 oct. 2013, 22:12

Navré, je ne maîtrise pas du tout bien cette intégration qui doit pourtant être toute bête, je me casse les dents par manque de connaissance!
http://nvd3.org/ghpages/lineWithFocus.html
<?php
//CODE PHP ICI
$json_cron_meteo=json_encode($cron_meteo_rows);
?> 

<!DOCTYPE html>
<meta charset="utf-8">

<link href="novuschart/src/nv.d3.css" rel="stylesheet" type="text/css">

<style>

body {
  overflow-y:scroll;
}

text {
  font: 12px sans-serif;
}

svg {
  display: block;
}

#chart1 svg {
  height: 500px;
  min-width: 100px;
  min-height: 100px;
/*
  margin: 50px;
  Minimum height and width is a good idea to prevent negative SVG dimensions...
  For example width should be =< margin.left + margin.right + 1,
 of course 1 pixel for the entire chart would not be very useful, BUT should not have errors
*/
}

</style>
<body>

  <div id="chart" class='with-3d-shadow with-transitions'>
    <svg style="height: 500px;"></svg>
  </div>

<script src="novuschart/lib/d3.v3.js"></script>
<script src="novuschart/nv.d3.js"></script>
<script src="novuschart/src/tooltip.js"></script>
<script src="novuschart/src/utils.js"></script>
<script src="novuschart/src/models/legend.js"></script>
<script src="novuschart/src/models/axis.js"></script>
<script src="novuschart/src/models/scatter.js"></script>
<script src="novuschart/src/models/line.js"></script>
<script src="novuschart/src/models/lineWithFocusChart.js"></script>
<script src="novuschart/stream_layers.js"></script>
<script language="javascript"> 
<!-- 
nv.addGraph(function() {
   var chart = nv.models.lineWithFocusChart();
 
   chart.xAxis
       .tickFormat(d3.format(',f'));
 
   chart.yAxis
       .tickFormat(d3.format(',.2f'));
 
   chart.y2Axis
       .tickFormat(d3.format(',.2f'));
 
   d3.select('#chart svg')
       .datum(<?php $json_prod_data ?>)
     .transition().duration(500)
       .call(chart);
 
   nv.utils.windowResize(chart.update);
 
   return chart;
 });
//--> 
</script> 
Si je remet tout d'origine à savoir .datum(testData()) et la fonction test suivante :

Code : Tout sélectionner

/************************************** * Simple test data generator */ function testData() { return stream_layers(3,128,.1).map(function(data, i) { return { key: 'Stream' + i, values: data }; }); }
C'est simplement une question d’intégrer un JSON comme data!

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

18 oct. 2013, 07:43

Salut,

Soit avec php tu fait un echo 'data='. $lejson; lors de l'affichage du code JS.
Soit tu fait une requête Ajax pour obtenir la chose.
Est tu sur que c'est du json qu'il faut et pas un tableau ?

@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 103 Messages

18 oct. 2013, 17:19

Merci moogli, mais pour être tout à fait honnette, j'ai abandonné cette librairie trés peu utilisée pour le poids lourd (payant) HighCharts!
Merci!