D3多行图表行路径未显示:d属性缺失

时间:2016-02-08 19:43:29

标签: d3.js

我正在尝试使用类似于以下内容的JSON数据创建一个简单的多线图:

[
    {
        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"
    }
]

我显示基本的X和Y轴,但实际值行没有显示。查看DOM,path元素未显示d属性。

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

代码如下:

<script>

  var data = <?php echo $wellSamples ?>;

  console.log(data);

  // Set the dimensions of the 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 the date / time
  var parseDate = d3.time.format("%Y-%m-%d").parse;

  // Set the 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>  

1 个答案:

答案 0 :(得分:1)

这里有几个问题:

  1. 您的数据绑定无效。绑定数据然后调用.attr("d", line),这将调用每个点上的行函数。它需要一个整数数组 - .attr("d", line(data))
  2. 您没有尝试从该数据创建多行。我猜你想要一条线&#34; shortName&#34;?您需要嵌套数据。
  3. 您的行x访问者调用.x(function(d) { return x(d.sampleDate); }),d.sampleDate从未转换为日期,但它仍然是一个字符串。
  4. 把这一切放在一起:

    &#13;
    &#13;
    <!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 the date / time
      var parseDate = d3.time.format("%Y-%m-%d").parse;
    
      // clean up 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 the dimensions of the 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 the 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");
    
      // now we bind to nested_data, an 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 is d.values from the nesting
            return line(d.values);
          })
          .style("stroke", "green");
    
    
        </script>
      </body>
    
    </html>
    &#13;
    &#13;
    &#13;