D3 has a force directed layout here. Is there a way to add zooming to this graph? Currently, I was able to capture the mouse wheel event but am not really sure how to write the redraw function itself. Any suggestions?
var vis = d3.select("#graph")
.append("svg:svg")
.call(d3.behavior.zoom().on("zoom", redraw)) // <-- redraw function
.attr("width", w)
.attr("height", h);
Update 6/4/14
See also Mike Bostock’s answer here for changes in D3 v.3 and the related example. I think this probably supersedes the answer below.
Update 2/18/2014
I think @ahaarnos’s answer is preferable if you want the entire SVG to pan and zoom. The nested
gelements in my answer below are really only necessary if you have non-zooming elements in the same SVG (not the case in the original question). If you do apply the behavior to agelement, then a backgroundrector similar element is required to ensure that thegreceives pointer events.Original Answer
I got this working based on the zoom-pan-transform example – you can see my jsFiddle here: http://jsfiddle.net/nrabinowitz/QMKm3/
It was a bit more complex than I had hoped – you have to nest several
gelements to get it to work, set the SVG’spointer-eventsattribute toall, and then append a background rectangle to receive the pointer events (otherwise it only works when the pointer is over a node or link). Theredrawfunction is comparatively simple, just setting a transform on the innermostg:This effectively scales the entire SVG, so it scales stroke width as well, like zooming in on an image.
There is another example that illustrates a similar technique.