我有縮放和平移工作的X軸,但我想補充平移Y軸。我嘗試使用d3.behavior.zoom
和d3.event.translate[1]
來獲得y翻譯值並使用該值,但當縮放發生時翻譯值發生變化,因此點擊拖動確實會平移y軸,縮放也會以非直觀方式平移y軸。D3:是否可以縮放+平移一個軸,只平移另一個軸?
我也嘗試使用兩個d3.behavior.zoom
實例,一個用於x軸,另一個用於y軸,但只有最後一個添加的縮放事件被調用。
下面是在x方向縮放和平移,我還想加上y平移過(但不Ÿ變焦)工作的例子:
var x = d3.scale.linear()
.domain([0, 800])
.range([0, 800]);
var y = d3.scale.linear()
.domain([0, 800])
.range([0, 800]);
var rectangleSelector = d3.select('svg')
.append('g')
.selectAll('rect')
.data([[0, 0], [50, 50], [100, 100]])
.enter()
.append('rect')
.attr('fill', 'black')
.attr('x', d => x(d[0]))
.attr('y', d => y(d[1]))
.attr('width', d => x(d[0] + 40) - x(d[0]))
.attr('height', d => y(40));
d3.select('svg')
.call(d3.behavior.zoom().x(x).on('zoom',() => {
rectangleSelector
.attr('x', d => x(d[0]))
.attr('y', d => y(d[1]))
.attr('width', d => x(d[0] + 40) - x(d[0]))
.attr('height', d => y(40));
}));
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>
<svg width="800" height="800"></svg>
在這示例我嘗試使用來自d3.event.translate[1]
的y值,它適用於拖動,但不希望的行爲是根據用戶的鼠標放大的位置還會更改y軸的轉換值。
var x = d3.scale.linear()
.domain([0, 800])
.range([0, 800]);
var y = d3.scale.linear()
.domain([0, 800])
.range([0, 800]);
var rectangleSelector = d3.select('svg')
.append('g')
.selectAll('rect')
.data([[0, 0], [50, 50], [100, 100]])
.enter()
.append('rect')
.attr('fill', 'black')
.attr('x', d => x(d[0]))
.attr('y', d => y(d[1]))
.attr('width', d => x(d[0] + 40) - x(d[0]))
.attr('height', d => y(40));
d3.select('svg')
.call(d3.behavior.zoom().x(x).on('zoom',() => {
var translateY = d3.event.translate[1];
rectangleSelector
.attr('x', d => x(d[0]))
.attr('y', d => y(d[1] + translateY))
.attr('width', d => x(d[0] + 40) - x(d[0]))
.attr('height', d => y(40));
}));
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>
<svg width="800" height="800"></svg>
'd3.behavior.zoom()'與'X()'和'ÿ環連接()';我只指定'x()',所以縮放行爲只會改變x軸。但是它仍然會報告y軸的翻譯值,我想用它來翻譯該軸 - 問題在於它們受縮放影響,而不是平移。 – Beau
我正在製作JSFiddle。 – Beau
也許這個:http://bl.ocks.org/jgbos/9752277 – altocumulus