【问题标题】:Setting x.domain with setInterval使用 setInterval 设置 x.domain
【发布时间】:2012-09-13 15:38:44
【问题描述】:

再次修改这个问题,因为在新版本的库d3(3.0.3)中解决方法不起作用,所以再次来寻求帮助将不胜感激。

这是库 d3 (3.0.3) 的新代码:

https://gist.github.com/4495104 http://bl.ocks.org/4495104/e7a7589098140dff36df7ab2a824d71072bc3be4

根据我的工作,错误应该在“491”行。

// Reset the domain relative to the current zoom offsets.
    x.domain(x0.range().map(function(x) {
      return (x - translate[0]) / scale; 
    }).map(x0.invert));

我们每秒都在用setInterval 更改x.domain,因为我们想要生成背景移动的外观,但是每次运行事件d3.behavior.zoom()(缩放或平移)时x.domain 会自动切换到初始值​​。您可以在下一个链接中查看问题。

http://jsfiddle.net/cristian540/Uy6bW/11/

【问题讨论】:

    标签: javascript svg d3.js data-visualization


    【解决方案1】:

    如果您以编程方式更改比例的域,则需要将比例重新分配给缩放行为。这是因为缩放行为在内部存储了比例的克隆,用于计算新比例的新域和平移偏移量。因此,如果您不重新分配比例,它会继续使用(旧)克隆比例。

    我已更新 documentation 以包含关于此的注释。

    还有一个复杂的问题,即缩放的 x 和 y 比例应该代表缩放比例=1 的域。因此,您实际上需要将当前比例的克隆保持在 zoom scale=1,并将偏移量应用于克隆和当前比例。

    然后,您可能还需要反转当前的缩放平移和缩放,具体取决于您需要的确切行为。

    所以它应该看起来像:

    var x0 = d3.scale.linear().domain(…).range(…), // initial scale
        x = x0.copy(); // copy to use for axes and zoom behaviour
    
    setInterval(function() {
      var translate = zoom.translate(),
          scale = zoom.scale(),
          xd = x0.domain(),
          dx = 1;
    
      // Set a new x-domain: offset by dx.
      x0.domain([xd[0] += dx, xd[1] += dx]);
    
      // Set the zoom x-domain (this resets the domain at zoom scale=1).
      zoom.x(x.domain(xd));
    
      // Reset the domain relative to the current zoom offsets.
      x.domain(x0.range().map(function(x) {
        return (x - translate[0]) / scale;
      }).map(x0.invert));
    }, 1e3);
    

    Example 这个在行动。

    【讨论】:

    • 您好,感谢您的早期响应,我们实施了您给我们的建议,我们每秒设置新域,但我们检测到错误,当我们应用放大时它工作正常但是当我尝试缩小它不起作用,它不允许我缩小但它会在图表中进行一些移动,但总是使用我设置的最后一个 d3.behavior.zoom() 域。
    • 我们虽然为了解决这个问题,我们必须将 d3.behavior.zoom() 域设置为属于比例 1 但您各自在“X”中移动的域,但这并不容易设置,有没有办法在不设置 x.domain 的情况下设置缩放行为的域?
    • 我忘了说你也需要适当地重置翻译向量。我已经更新了答案以将其与示例一起包含在内。不幸的是,我认为 D3 中有一个错误,如果重置平移向量,则不会重置漂移向量。请参阅此处进行修复:github.com/mbostock/d3/pull/810
    • 您好,感谢您的早期回复,但是我有一个疑问,您所说的与鼠标未移动时重置漂移矢量有关的错误,是在放大和然后缩小我们失去了 x.domain?。我在你给我们的例子中注意到缩小的问题继续,这与你提到的错误有关吗?
    • 对不起,我没明白你的意思,所以我的例子并没有真正解决你原来的问题。我现在已经修复它并更新了答案,希望这更有意义。您可能不需要最后一位来反转当前缩放平移/缩放。由于您没有重置平移/缩放,因此漂移矢量错误不再适用于此。
    猜你喜欢
    • 2016-03-08
    • 2019-05-01
    • 1970-01-01
    • 2021-07-27
    • 1970-01-01
    • 2014-09-12
    • 1970-01-01
    • 1970-01-01
    • 2015-11-09
    相关资源
    最近更新 更多