У меня есть масштабирование и панорамирование для оси x, но я хотел бы добавить панорамирование для оси y. Я попытался использовать d3.behavior.zoom
и d3.event.translate[1]
, чтобы получить значение перевода y и использовать его, но значение перевода изменяется при масштабировании, поэтому, когда перетаскивание по клику перемещает ось y, масштабирование также поворачивает ось y (в неинтуитивном путь).
Я также попытался использовать два экземпляра 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>