title: d3 zoom function issues in v4
body: <p>I am facing issues with the zoom function in D3 while using v4. It throws up an error saying that zoom.translate is not defined. I am mostly using the following code from this answer <a href="https://stackoverflow.com/questions/41905384/d3-focus-on-node-on-click">d3 focus on node on click</a>, which worked perfectly for v3. However, as I was having issues with v3 as it has restrictions with data where the source and nodes are in the form of strings(instead of indices) <a href="https://stackoverflow.com/questions/41916842/d3-json-file-with-source-and-index-as-strings-rather-than-indices">D3 JSON file with source and index as strings rather than indices</a>, I switched to v4. </p>
  
  <pre><code>&lt;!DOCTYPE html&gt;
  &lt;meta charset="utf-8"&gt;
  &lt;style&gt;
  
  .links line {
    stroke: #999;
    stroke-opacity: 0.6;
  }
  
  .nodes circle {
    stroke: #fff;
    stroke-width: 1.5px;
  }
  
  &lt;/style&gt;
  &lt;svg width="960" height="600"&gt;&lt;/svg&gt;
  &lt;script src="https://d3js.org/d3.v4.min.js"&gt;&lt;/script&gt;
  &lt;script&gt;
  
  
  var svg = d3.select("svg"),
      width = +svg.attr("width"),
      height = +svg.attr("height")
      active = d3.select(null);
  
  var zoom = d3.zoom()
      .scaleExtent([1, 8])
      .on("zoom", zoomed);     
  
  var color = d3.scaleOrdinal(d3.schemeCategory20);
  
  var simulation = d3.forceSimulation()
      .force("link", d3.forceLink().id(function(d) { return d.id; }))
      .force("charge", d3.forceManyBody())
      .force("center", d3.forceCenter(width / 2, height / 2));
  
  d3.json("graph.json", function(error, graph) {
    if (error) throw error;
  
    var link = svg.append("g")
        .attr("class", "links")
      .selectAll("line")
      .data(graph.links)
      .enter().append("line")
        .attr("stroke-width", function(d) { return Math.sqrt(d.value); });
  
    var node = svg.append("g")
        .attr("class", "nodes")
      .selectAll("circle")
      .data(graph.nodes)
      .enter().append("circle")
        .attr("r", 5)
        .attr("fill", function(d) { return color(d.group); })
        .call(d3.drag()
            .on("start", dragstarted)
            .on("drag", dragged)
            .on("end", dragended))
              .on("click", clicked);
  
    node.append("title")
        .text(function(d) { return d.id; });
  
    simulation
        .nodes(graph.nodes)
        .on("tick", ticked);
  
    simulation.force("link")
        .links(graph.links);
  
    function ticked() {
      link
          .attr("x1", function(d) { return d.source.x; })
          .attr("y1", function(d) { return d.source.y; })
          .attr("x2", function(d) { return d.target.x; })
          .attr("y2", function(d) { return d.target.y; });
  
      node
          .attr("cx", function(d) { return d.x; })
          .attr("cy", function(d) { return d.y; });
    }
  });
  
  function dragstarted(d) {
    if (!d3.event.active) simulation.alphaTarget(0.3).restart();
    d.fx = d.x;
    d.fy = d.y;
  }
  
  function dragged(d) {
    d.fx = d3.event.x;
    d.fy = d3.event.y;
  }
  
  function dragended(d) {
    if (!d3.event.active) simulation.alphaTarget(0);
    d.fx = null;
    d.fy = null;
  }
  
  function clicked(d){
    if (active.node() === this) return reset();
    active.classed("active", false);
    active = d3.select(this).classed("active", true);
  
    var bbox = active.node().getBBox(),
        bounds = [[bbox.x, bbox.y],[bbox.x + bbox.width, bbox.y + bbox.height]];
  
    var dx = bounds[1][0] - bounds[0][0],
        dy = bounds[1][1] - bounds[0][1],
        x = (bounds[0][0] + bounds[1][0]) / 2,
        y = (bounds[0][1] + bounds[1][1]) / 2,
        scale = Math.max(1, Math.min(8, 0.9 / Math.max(dx / width, dy / height))),
        translate = [width / 2 - scale * x, height / 2 - scale * y];
  
    svg.transition()
        .duration(750)
        .call(zoom.translate(translate).scale(scale).event);
  } 
  
  function reset() {
    active.classed("active", false);
    active = d3.select(null);
  
    svg.transition()
        .duration(750)
        .call(zoom.translate([0, 0]).scale(1).event);
  } 
  
  function zoomed() {
    console.log(d3.event)
    g.style("stroke-width", 1.5 / d3.event.scale + "px");
    g.attr("transform", "translate(" + d3.event.translate + ")scale(" + d3.event.scale + ")");
  }        
  
  &lt;/script&gt;
  </code></pre>
  
  <p>I changed <code>d3.behaviour.zoom()</code> to <code>d3.zoom()</code> and even changed </p>
  
  <pre><code>.call(zoom.translate(translate).scale(scale).event);
  </code></pre>
  
  <p>to </p>
  
  <pre><code>.call(d3.zoom().on("zoom", function () {
          svg.attr("transform", d3.event.transform)
  }));
  </code></pre>
  
  <p>which throws up a strange error, error: unknown type: wheel</p>
  
  <p>What would be the best way to go about overcoming this situation?</p>