添加轴会占用我的数据

时间:2017-12-24 18:44:09

标签: d3.js

我遵循D3教程,但添加轴使我的一半数据消失,我不明白为什么。我认为也许轴占据了数据对数据的意义空间,所以我在转换属性上增加了10px,但它没有任何区别。

var GIST = "https://gist.githubusercontent.com/charisseysabel/f8f48fbf11b8a1b0d62cbe2d6bdc2aa6/raw/2ead1537adb822fbd59a666afd5334d525480a13/nano-2017.tsv"

var width = 1000,
height = 550,
margin = {top: 20, right: 30, bottom: 30, left: 4};

var y = d3.scaleLinear()
.range([height, 0]);

var yScale = d3.scaleLinear()
    .range([height, 0]);
var xScale = d3.scaleLinear()
    .range([0, width]);

var xAxis = d3.axisLeft(yScale);
var yAxis = d3.axisBottom(xScale);

var chart = d3.select(".chart")
.attr("width", width)
.attr("height", height);

chart.append("g")
    .attr("transform", "translate(10, 0)")
    .call(xAxis);

chart.append("g")
    .attr("transform", "translate(0, 540)")
    .call(yAxis);

d3.tsv(GIST, type, function(error, data) {
  y.domain([0, d3.max(data, function(d) { return d.value; })]);

  var barWidth = width / data.length;

  var bar = chart.selectAll("g")
      .data(data)
      .enter().append("g")
        .attr("transform", function(d, i) {
          return "translate(" + ((i * barWidth) + 10) + ",0)"; }
    );

  bar.append("rect")
      .attr("y", function(d) { return y(d.value); })
      .attr("height", function(d) { return height - y(d.value); })
      .attr("width", barWidth - 1);

  bar.append("text")
      .attr("x", (barWidth / 2) - 2)
      .attr("y", function(d) { return y(d.value) + 3; })
      .attr("dy", ".75em")
      .text(function(d) { return d.value; });
});

function type(d) {
  d.value = +d.value;
  return d;
}

1 个答案:

答案 0 :(得分:3)

当你这样做时......

var bar = chart.selectAll("g").etc...

...您正在选择已存在于SVG中的组元素,即轴,并将数据绑定到它们。

有两种简单的解决方案:

  1. 将创建轴的代码移至d3.tsv的底部,即附加条形。
  2. 选择不存在的内容,例如 var bar = chart.selectAll(null).etc。要详细了解selectAll(null)背后的逻辑,请查看my answer here