2012-09-13 17 views
1

再次修改此問題,因爲該解決方案在新版本庫d3(3.0.3)中無法正常工作,所以我再次請求一些幫助將非常感謝。使用setInterval設置x.domain

這裏是圖書館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)); 

我們正在改變x.domain每秒鐘有setInterval,因爲我們要產生的背景是移動的外觀,但每次運行事件d3.behavior.zoom()(縮放或平移)的x.domain自動切換到初始值。在下一個鏈接中,您可以查看問題。

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

回答

1

如果你改變了規模的域編程,你需要將規模重新分配給縮放行爲。這是因爲縮放行爲會在內部存儲縮放的克隆以計算新縮放的新域並轉換偏移量。因此,如果您不重新分配比例,它會繼續使用(舊)克隆比例。

我已更新documentation以包含關於此的註釋。

還有一個額外的複雜因素,即縮放的x和y比例應該代表縮放比例= 1時的域。因此,您實際上需要在縮放比例= 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

+0

嗨,感謝您的早期回覆, 我們實施了您給我們的推薦,並且我們每秒設置一個新域,但是我們檢測到一個錯誤,當我們應用放大功能時完美,但是當我嘗試縮放它不起作用,它不允許我縮小,但它會在圖表中進行一些移動,但始終與我設置的最後一個d3.behavior.zoom()域一起。 –

+0

我們雖然爲解決這個問題,我們必須設置d3.behavior.zoom()領域屬於規模爲1,但與你在「X」的各自的轉變,但這不容易設置,是否有辦法設置縮放行爲的域而不設置x.domain? –

+0

http://jsfiddle.net/cristian540/Uy6bW/15/ –