Mise à jour 6/4/14
Voir aussi La réponse de Mike Bostock ici pour les changements dans D3 v.3 et le exemple connexe . Je pense que cela remplace probablement la réponse ci-dessous.
Mise à jour 18/02/2014
Je pense que la réponse de @ahaarnos est préférable si vous voulez que le SVG entier fasse un panoramique et un zoom. L'imbrication g
dans ma réponse ci-dessous ne sont vraiment nécessaires que si vous avez des éléments sans zoom dans le même SVG (ce qui n'est pas le cas dans la question originale). Si vous faire appliquer le comportement à un g
puis un élément d'arrière-plan rect
ou un élément similaire est nécessaire pour garantir que le g
reçoit les événements liés aux pointeurs.
Réponse originale
Je l'ai fait fonctionner en me basant sur le zoom-pan-transform exemple - vous pouvez voir mon jsFiddle ici : http://jsfiddle.net/nrabinowitz/QMKm3/
C'était un peu plus complexe que je ne l'avais espéré - vous devez imbriquer plusieurs g
pour qu'il fonctionne, définissez les paramètres du SVG comme suit pointer-events
à l'attribut all
et ajoutez ensuite un rectangle d'arrière-plan pour recevoir les événements du pointeur (sinon, cela ne fonctionne que lorsque le pointeur se trouve sur un nœud ou un lien). Le site redraw
est relativement simple, il suffit de définir un transformateur sur l'objet le plus interne g
:
var vis = d3.select("#chart")
.append("svg:svg")
.attr("width", w)
.attr("height", h)
.attr("pointer-events", "all")
.append('svg:g')
.call(d3.behavior.zoom().on("zoom", redraw))
.append('svg:g');
vis.append('svg:rect')
.attr('width', w)
.attr('height', h)
.attr('fill', 'white');
function redraw() {
console.log("here", d3.event.translate, d3.event.scale);
vis.attr("transform",
"translate(" + d3.event.translate + ")"
+ " scale(" + d3.event.scale + ")");
}
Cela met effectivement à l'échelle l'ensemble du SVG, et donc la largeur du trait également, comme un zoom sur une image.
Il y a un autre exemple qui illustre une technique similaire.