D3 JS时间格式

时间:2013-12-03 09:53:12

标签: javascript d3.js

我做了一个平底锅和一个缩放图表,从数据库中获取日期并在X轴上绘制它们。然后我需要在顶部添加折线图,但我很难弄清楚我正在使用的日期有什么问题。

这是我的代码:

/****
  *
  * Set the variables
  *
  ****/

  var totalValues = data.length,
      maxValue = 0,
      maxValueTarget = 0,
      maxConsumption = 0;

  data.forEach(function(d) {

    if (Math.max(d.value, d.target) > maxValue) {
      maxValue = Math.max(d.value, d.target);
    }

    if (Math.max(d.value) > maxConsumption) {
      maxConsumption = Math.max(d.value);
      maxValueTarget = maxConsumption - d.target;
    }

  });

  var dateRange = d3.extent(data, function(d){ 
    console.log('dateRange', d3.time.format("%Y-%m-%d %H:%M%:%S")(new Date(d.date)));
    return d3.time.format("%Y-%m-%d %H:%M%:%S")(new Date(d.date)); 
  });

  // Set the margin values for the graph
  var margin = {top: 60, right: 20, bottom: 30, left: 60},
      width = $('.svg-container').width() - margin.left - margin.right,
      height = 500 - margin.top - margin.bottom;

  var x = d3.time.scale()
        .domain([dateRange[0], dateRange[1]])
        .range([0, width]);

  var y = d3.scale.linear()
      .domain([0, maxValue])
      .range([height, 0]);

  var xAxis = d3.svg.axis()
      .scale(x)
      .orient("bottom")
      .tickSize(-height);

  var yAxis = d3.svg.axis()
      .scale(y)
      .orient("left")
      .ticks(5)
      .tickSize(-width);

  var valueline = d3.svg.line()
    .x(function(d,i) { 
      // console.log('d.date', d.date); 
      // console.log('x .date',x(getDate(d))); 
      console.log('valueline', d3.time.format("%Y-%m-%d %H:%M%:%S")(new Date(d.date)));
      return x(d3.time.format("%Y-%m-%d %H:%M%:%S")(new Date(d.date))) 
    })
    .y(function(d) { 
      return y(d.target); 
    });

  var zoom = d3.behavior.zoom()
      .x(x)
      .scaleExtent([-5, 200])
      .on("zoom", zoomed);

  // Set up the svg canvas
  var svg = d3.select(".svg-container svg")
      .attr("width", width + margin.left + margin.right)
      .attr("height", height + margin.top + margin.bottom)
    .append("g")
      .attr("transform", "translate(" + margin.left + "," + margin.top + ")")
      .call(zoom);

  svg.append("rect")
      .attr("width", width)
      .attr("height", height);

  svg.append("g")
      .attr("class", "x axis")
      .attr("transform", "translate(0," + height + ")")
      .call(xAxis);

  svg.append("g")
      .attr("class", "y axis")
      .call(yAxis);

  svg.append("path")    // Add the valueline path.
      .attr("class", "line target-profile")
      .attr("d", valueline(data));

  d3.select("button").on("click", reset);

  function zoomed() {
    svg.select(".x.axis").call(xAxis);
    svg.select(".y.axis").call(yAxis);
  }

  function reset() {
    d3.transition().duration(750).tween("zoom", function() {
      var ix = d3.interpolate(x.domain(), [-width / 2, width / 2]),
          iy = d3.interpolate(y.domain(), [-height / 2, height / 2]);
      return function(t) {
        zoom.x(x.domain(ix(t))).y(y.domain(iy(t)));
        zoomed();
      };
    });
  }

来自控制台日志的示例数据:

Error: Problem parsing d="MNaN,336.85547908946535LNaN,74.44679724722073LNaN,103.31392271042881LNaN,99.19004764425625LNaN,95.71731074642668LNaN,80.95817893065112LNaN,118.94123875066174LNaN,112.64690312334568LNaN,99.62413975648491LNaN,91.37638962413979LNaN,92.67866596082587LNaN,114.6003176283748LNaN,116.7707781895183LNaN,102.8798305982001LNaN,81.17522498676544LNaN,103.09687665431443LNaN,96.15140285865533LNaN,122.19692959237693LNaN,108.95712016940183LNaN,94.84912652196931LNaN,114.38327157226047LNaN,79.87294865007937LNaN,87.25251455796723LNaN,84.64796188459502LNaN,71.62519851773425LNaN,61.64107993647434LNaN,87.90365272631021LNaN,84.21386977236631LNaN,80.08999470619375LNaN,117.6389624139756LNaN,95.50026469031235LNaN,79.22181048173638LNaN,90.07411328745371LNaN,80.30704076230813LNaN,112.64690312334568LNaN,73.14452091053465LNaN,66.85018528321865LNaN,78.35362625727902LNaN,105.05029115934354LNaN,86.38433033350981LNaN,101.36050820539964LNaN,65.76495500264696LNaN,90.50820539968237LNaN,87.46956061408156LNaN,57.73425092641611LNaN,90.29115934356804LNaN,133.48332451032292LNaN,97.67072525145579LNaN,60.9899417681313LNaN,144.98676548438328LNaN,81.17522498676544LNaN,85.73319216516677LNaN,89.85706723133939LNaN,80.95817893065112LNaN,80.08999470619375LNaN,93.98094229751194LNaN,101.79460031762835LNaN,88.12069878242454LNaN,90.29115934356804LNaN,0LNaN,112.4298570672313LNaN,52.95923769190051LNaN,104.83324510322922LNaN,125.01852832186341LNaN,73.36156696664904LNaN,117.42191635786128LNaN,77.9195341450503LNaN,115.46850185283222LNaN,121.97988353626255LNaN,91.59343568025412LNaN,68.36950767601905LNaN,67.50132345156169LNaN,97.23663313922708LNaN,94.41503440974066LNaN,93.76389624139756LNaN,119.59237691900478LNaN,121.11169931180518LNaN,88.98888300688196LNaN,123.28215987294863LNaN,78.35362625727902LNaN,103.5309687665432LNaN,139.5606140815246LNaN,47.53308628904182LNaN,85.08205399682367LNaN,66.41609317098994LNaN,97.01958708311275LNaN,111.3446267866596LNaN,127.40603493912124LNaN,100.70937003705666LNaN,121.11169931180518LNaN,95.71731074642668LNaN,95.50026469031235LNaN,97.23663313922708LNaN,98.32186341979889LNaN,65.33086289041819LNaN,67.06723133933298LNaN,105.05029115934354LNaN,118.2901005823187LNaN,94.84912652196931LNaN,54.04446797247226LNaN,83.12863949179462LNaN,117.20487030174695LNaN,116.11964002117526LNaN,84.43091582848069LNaN,87.25251455796723LNaN,100.49232398094227LNaN,70.5399682371625LNaN,189.48120698782427"

正如您所看到的,x .date控制台日志的值始终相同,因为它看起来好像没有在图表上绘制任何内容。有人能告诉我哪里出错了吗?

1 个答案:

答案 0 :(得分:0)

这是我最后使用的代码。

我更改了dateRange变量,添加了一个getDate函数,并使用该函数为valueline路径设置x轴。

/****
  *
  * Set the variables
  *
  ****/

  function getDate(d) {
      return d3.time.format("%Y-%m-%d %H:%M:%S").parse(d.date);
  }

  var totalValues = data.length,
      maxValue = 0,
      maxValueTarget = 0,
      maxConsumption = 0,
      dateRange = d3.extent(data, function(d){ return new Date(d.date); });

  data.forEach(function(d) {

    if (Math.max(d.value, d.target) > maxValue) {
      maxValue = Math.max(d.value, d.target);
    }

    if (Math.max(d.value) > maxConsumption) {
      maxConsumption = Math.max(d.value);
      maxValueTarget = maxConsumption - d.target;
    }

  });

  // Set the margin values for the graph
  var margin = {top: 60, right: 20, bottom: 30, left: 60},
      width = $('.svg-container').width() - margin.left - margin.right,
      height = 500 - margin.top - margin.bottom;

  var x = d3.time.scale()
        .domain([dateRange[0], dateRange[1]])
        .range([0, width]);

  var y = d3.scale.linear()
      .domain([0, maxValue])
      .range([height, 0]);

  var xAxis = d3.svg.axis()
      .scale(x)
      .orient("bottom")
      .tickSize(-height);

  var yAxis = d3.svg.axis()
      .scale(y)
      .orient("left")
      .ticks(5)
      .tickSize(-width);

  var valueline = d3.svg.line()
    .x(function(d,i) { 
      return x(getDate(d)); })
    .y(function(d) { return y(d.target); });

  var zoom = d3.behavior.zoom()
      .x(x)
      .y(y)
      .scaleExtent([-5, 200])
      .on("zoom", zoomed);

  // Set up the svg canvas
  var svg = d3.select(".svg-container svg")
      .attr("width", width + margin.left + margin.right)
      .attr("height", height + margin.top + margin.bottom)
    .append("g")
      .attr("transform", "translate(" + margin.left + "," + margin.top + ")")
      .call(zoom);

  svg.append("rect")
      .attr("width", width)
      .attr("height", height);

  svg.append("g")
      .attr("class", "x axis")
      .attr("transform", "translate(0," + height + ")")
      .call(xAxis);

  svg.append("g")
      .attr("class", "y axis")
      .call(yAxis);

  svg.append("path")    // Add the valueline path.
      .attr("class", "line target-profile")
      .attr("d", valueline(data));

  d3.select("button").on("click", reset);

  function zoomed() {
    svg.select(".x.axis").call(xAxis);
    svg.select(".y.axis").call(yAxis);
  }

  function reset() {
    d3.transition().duration(750).tween("zoom", function() {
      var ix = d3.interpolate(x.domain(), [-width / 2, width / 2]),
          iy = d3.interpolate(y.domain(), [-height / 2, height / 2]);
      return function(t) {
        zoom.x(x.domain(ix(t))).y(y.domain(iy(t)));
        zoomed();
      };
    });
  }