Mam zoom i pan działa na osi X, ale chciałbym dodać panoramowanie dla osi Y. Próbowałem użyć d3.behavior.zoom
i d3.event.translate[1]
, aby uzyskać wartość translacji y i użyć tej wartości, ale wartość translate zmienia się podczas powiększania, więc podczas gdy przeciąganie z kliknięciem przesuwa oś y, powiększanie powoduje również przesunięcie osi y (w sposób nieintuicyjny).D3: Czy możliwe jest powiększanie + przesuwanie jednej osi i przesuwanie tylko drugiej?
Próbowałem również użyć dwóch instancji d3.behavior.zoom
, jednej dla osi X i jednej dla osi Y, ale tylko ostatnia dodana jest wywoływana na zdarzeniach powiększania.
Oto przykład, który działa na zoom i pan w kierunku x, że Chciałbym również dodać y panoramowanie też (ale nie y powiększanie):
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>
W ten Przykład Podejmuję próbę użycia wartości y z d3.event.translate[1]
i działa ona w przypadku przeciągania, ale niepożądane zachowanie polega na tym, że w zależności od tego, gdzie mysz jest powiększana, zmienia ona również wartość translacji dla osi 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()' jest chainable z 'x() 'i' y()'; Podaję tylko 'x()', więc zachowanie zoomu zmienia tylko oś X. Ale wciąż zgłasza tłumienie wartości dla osi Y, które chciałbym wykorzystać do przetłumaczenia tej osi - problem polega na tym, że są one powiększane, a nie tylko przesuwane. – Beau
Jestem również w trakcie tworzenia JSFiddle. – Beau
Może to: http://bl.ocks.org/jgbos/9752277 – altocumulus