d3.js - D3 multi-line chart line path not displaying: d attribute missing -


i trying create simple multi-line chart using json data similar following:

[     {         sampledate: "2014-04-14",         shortname: "pfoa",         pfclevel: "0.3500000"     },     {         sampledate: "2014-05-14",         shortname: "pfoa",         pfclevel: "0.3200000"     },     {         sampledate: "2014-04-14",         shortname: "pfos",         pfclevel: "2.5000000"     },     {         sampledate: "2014-05-14",         shortname: "pfos",         pfclevel: "2.4000000"     } ] 

i have basic x , y axis showing, actual value lines not displaying. looking @ dom path element not showing d attribute.

<path class="line" style="stroke: green;"></path> 

the code below:

<script>    var data = <?php echo $wellsamples ?>;    console.log(data);    // set dimensions of canvas / graph   var margin = {top: 30, right: 20, bottom: 30, left: 50},       width = 600 - margin.left - margin.right,       height = 270 - margin.top - margin.bottom;    // parse date / time   var parsedate = d3.time.format("%y-%m-%d").parse;    // set ranges   var x = d3.time.scale().range([0, width]);   var y = d3.scale.linear().range([height, 0]);    var xaxis = d3.svg.axis()       .scale(x)       .orient("bottom");    var yaxis = d3.svg.axis()       .scale(y)       .orient("left");    var line = d3.svg.line()       .interpolate("basis")       .x(function(d) { console.log(d.sampledate); return x(d.sampledate); })       .y(function(d) { console.log(d.pfclevel); return y(d.pfclevel); });    var svg = d3.select("#chart").append("svg")         .attr("width", width + margin.left + margin.right)         .attr("height", height + margin.top + margin.bottom)       .append("g")         .attr("transform", "translate(" + margin.left + "," + margin.top + ")");    x.domain(d3.extent(data, function(d) { return parsedate(d.sampledate); }));   y.domain(d3.extent(data, function(d) { return d.pfclevel; }));    svg.append("g")       .attr("class", "x axis")       .attr("transform", "translate(0," + height + ")")       .call(xaxis);    svg.append("g")       .attr("class", "y axis")       .call(yaxis)     .append("text")       .attr("transform", "rotate(-90)")       .attr("y", 6)       .attr("dy", ".71em")       .style("text-anchor", "end")       .text("pfc level");     var pfc = svg.selectall(".pfc")       .data(data)     .enter().append("g")       .attr("class", "pfc");    pfc.append("path")       .attr("class", "line")       .attr("d", line)       .style("stroke", "green");  </script>   

several problems here:

  1. your data-binding invalid. bind data call .attr("d", line), call line function on each point. needs awhole array -- .attr("d", line(data))
  2. you've made no attempt create more 1 line data. i'm guessing want line per "shortname"? need nest data.
  3. your line x accessor calls .x(function(d) { return x(d.sampledate); }), d.sampledate has never been converted date though, it's still string.

putting together:

<!doctype html>  <html>      <head>      <script data-require="d3@3.5.3" data-semver="3.5.3" src="//cdnjs.cloudflare.com/ajax/libs/d3/3.5.3/d3.js"></script>      <link rel="stylesheet" href="style.css" />      <script src="script.js"></script>    </head>      <body>      <div id="chart"></div>      <script>      var data = [      {          sampledate: "2014-04-14",          shortname: "pfoa",          pfclevel: "0.3500000"      },      {          sampledate: "2014-05-14",          shortname: "pfoa",          pfclevel: "0.3200000"      },      {          sampledate: "2014-04-14",          shortname: "pfos",          pfclevel: "2.5000000"      },      {          sampledate: "2014-05-14",          shortname: "pfos",          pfclevel: "2.4000000"      }  ];      // parse date / time    var parsedate = d3.time.format("%y-%m-%d").parse;      // clean data    data.foreach(function(d){      d.sampledate = parsedate(d.sampledate);      d.pfclevel = +d.pfclevel;    });      // nest data    var nested_data = d3.nest()      .key(function(d) { return d.shortname; })      .entries(data);      // set dimensions of canvas / graph    var margin = {top: 30, right: 20, bottom: 30, left: 50},        width = 600 - margin.left - margin.right,        height = 270 - margin.top - margin.bottom;      // set ranges    var x = d3.time.scale().range([0, width]);    var y = d3.scale.linear().range([height, 0]);      var xaxis = d3.svg.axis()        .scale(x)        .orient("bottom");      var yaxis = d3.svg.axis()        .scale(y)        .orient("left");      var line = d3.svg.line()        .interpolate("basis")        .x(function(d) { return x(d.sampledate); })        .y(function(d) { return y(d.pfclevel); });      var svg = d3.select("#chart").append("svg")          .attr("width", width + margin.left + margin.right)          .attr("height", height + margin.top + margin.bottom)        .append("g")          .attr("transform", "translate(" + margin.left + "," + margin.top + ")");      x.domain(d3.extent(data, function(d) { return d.sampledate; }));    y.domain(d3.extent(data, function(d) { return d.pfclevel; }));      svg.append("g")        .attr("class", "x axis")        .attr("transform", "translate(0," + height + ")")        .call(xaxis);      svg.append("g")        .attr("class", "y axis")        .call(yaxis)      .append("text")        .attr("transform", "rotate(-90)")        .attr("y", 6)        .attr("dy", ".71em")        .style("text-anchor", "end")        .text("pfc level");      // bind nested_data, array of arrays    var pfc = svg.selectall(".pfc")        .data(nested_data)        .enter()        .append("g")        .attr("class", "pfc");      pfc.append("path")        .attr("class", "line")        .attr("d", function(d){          // our inner array d.values nesting          return line(d.values);        })        .style("stroke", "green");          </script>    </body>    </html>


Comments

Popular posts from this blog

java - pagination of xlsx file to XSSFworkbook using apache POI -

Unlimited choices in BASH case statement -

apache - How do I stop my index.php being run twice for every user -