【问题标题】:bar graph does not render d3条形图不呈现 d3
【发布时间】:2016-08-29 21:07:32
【问题描述】:

我有想要用条形图绘制的活动跟踪数据。为什么我的条形图不呈现矩形?我看不到我犯的错误。我想我的数据结构是正确的,但我根本无法检查。数据由GitHub gist 提供。

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

<svg class="chart"></svg>
<script src="//d3js.org/d3.v3.min.js" charset="utf-8"></script>

<script>
  var margin = {
      top: 20,
      right: 20,
      bottom: 70,
      left: 40
    },
    width = 900 - margin.left - margin.right,
    height = 700 - margin.top - margin.bottom;



  var parseDate = d3.time.format("%H:%M:%S").parse;
  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")
    //.tickFormat(d3.time.format("%H:%M:%S"));

  var yAxis = d3.svg.axis()
    .scale(y)
    .orient("left")
    .ticks(10);

  var svg = d3.select("body").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 + ")");


  d3.json("data/testdata.json", function(data) {



    x.domain(d3.extent(data.dataset, function(d) {
      return parseDate(d.time);
    }));
    // x.domain(d3.map(data.dataset, function(d) {
    //   console.log(d.time);
    //     return parseDate(d.time)
    // }));
    // y.domain(d3.extent(data, function(d, i) {
    //     return d.dataset[i].steps;
    // }));
    y.domain([0, d3.max(data.dataset, function(d) {
      return d.steps;
    })]);

    svg.append("g")
      .attr("class", "x axis")
      .attr("transform", "translate(0," + height + ")")
      .call(xAxis)
      .selectAll("text")
      .style("text-anchor", "end")
      // .text("Time")
      .attr("dx", "-.8em")
      .attr("dy", "-.55em")
      .attr("transform", "rotate(-90)");

    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("Steps");

    svg.selectAll("bar")
      .data(data)
      .enter().append("rect")
      .style("fill", "steelblue")
      .attr("class", "bar")
      .attr("x", function(d, i) {
        return x(parseDate(d.dataset[i].time));
      })
      .attr("y", function(d, i) {
        return y(d.dataset[i].steps);
      })
      .attr("width", function(d) {
        return width / d.dataset.length
      })
      .attr("height", function(d, i) {
        return height - y(d.dataset[i].steps);
      });

  });
</script>

你能给我一个提示吗?我是否必须以另一种方式嵌套/构造我的 json?它必须是基本的,但不知何故我没有得到条形图

【问题讨论】:

    标签: html json d3.js graph


    【解决方案1】:

    好的,这是一个小提琴:https://jsfiddle.net/1nujczwh/11/

    首先你的数据集是错误的

    svg.selectAll("bar")
          .data(data)
    

    应该是

    svg.selectAll("bar")
          .data(data.dataset)
    

    除此之外,您的 x、y 和其他属性还需要一些工作。喜欢:

    return x(parseDate(d.dataset[i].time)); 
    

    应该是

    return x(parseDate(d.time));
    

    由于 d3 已经在循环遍历您的数据,因此您无需使用 array[index] 选择它们

    由于所有步骤都是 0,我不知道您希望看到什么,因此我更改了一些数据作为示例。

    我建议在属性中添加console.log(d);(我也已经为您这样做了)以查看您的数据是什么。

    【讨论】:

      猜你喜欢
      • 2021-10-28
      • 1970-01-01
      • 1970-01-01
      • 2018-09-08
      • 2014-08-21
      • 1970-01-01
      • 2016-12-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多