0

我正在根据以下示例创建一个可缩放的散点图:

散点图

D3 散点图示例

我应该投资什么职业?

我添加了一个按钮来将 x 轴的类别从卡路里更改为碳水化合物,并且图表已正确更新。但是当我尝试使用新域进行缩放时,缩放会使用旧域。如何更新新域的缩放功能?

当前的实现可以在这里找到。

4

1 回答 1

1

您只需要将新的比例重新绑定到行为。

首先将缩放行为函数放在一个变量中,以便您以后可以访问它:您的原始代码...

   var svg = d3.select("#scatter")
.append("svg")
  .attr("width", outerWidth)
  .attr("height", outerHeight)
.append("g")
  .attr("transform", "translate(" + margin.left + "," + margin.top + ")")
  .call(d3.behavior.zoom().x(x).y(y).scaleExtent([0, 500]).on("zoom", zoom));

应该是这样的:

  var zoomBeh = d3.behavior.zoom()
      .x(x)
      .y(y)
      .scaleExtent([0, 500])
      .on("zoom", zoom);

  var svg = d3.select("#scatter")
    .append("svg")
      .attr("width", outerWidth)
      .attr("height", outerHeight)
    .append("g")
      .attr("transform", "translate(" + margin.left + "," + margin.top + ")")
      .call(zoomBeh);

其次,在您的功能更改中,您将比例绑定到行为。所以而不是:

  function change() {
    xCat = "Carbs";
    xMax = d3.max(data, function(d) { return d[xCat]; });
    xMin = d3.min(data, function(d) { return d[xCat]; });

    x.domain([xMin, xMax]);

    var svg = d3.select("#scatter").transition();

    svg.select(".x.axis").duration(750).call(xAxis).select(".label").text(xCat);

    objects.selectAll(".dot").transition().duration(1000).attr("transform", transform);
  } 

您只需更改一行:

  function change() {
    xCat = "Carbs";
    xMax = d3.max(data, function(d) { return d[xCat]; });
    xMin = d3.min(data, function(d) { return d[xCat]; });

    // x.domain([xMin, xMax]);
    zoomBeh.x(x.domain([xMin, xMax])).y(y.domain([yMin, yMax]));

    var svg = d3.select("#scatter").transition();

    svg.select(".x.axis").duration(750).call(xAxis).select(".label").text(xCat);

    objects.selectAll(".dot").transition().duration(1000).attr("transform", transform);
  }

有关文档,请参阅http://bl.ocks.org/mbostock/3892928

于 2015-03-08T14:58:42.770 回答