//noprotect var width = 960, height = 500; var color = d3.scale.category20(); var force = d3.layout.force() .linkDistance(1000) .size([width, height]); var svg = d3.select("body").append("svg") .attr("width", width) .attr("height", height) var zoomable_layer = svg.append('g'); zoom = d3.behavior.zoom() .scaleExtent([0.5,4]) .on('zoom', function() { zoomable_layer .attr('transform', "translate(" + zoom.translate() + ")scale(" + zoom.scale() + ")"); }); svg.call(zoom); d3.json("node_link_ontology.json", function(error, graph) { var thickness = d3.scale.sqrt() .domain([1, d3.max(graph.links, function(d) {return d.value;})]) .range([0.1, 10]); nodeLabelID = []; graph.nodes.forEach(function(d) { nodeLabelID[d.id] = d.name; }); force .nodes(graph.nodes) .links(graph.links) .start(); var link = zoomable_layer.selectAll(".link") .data(graph.links) .enter().append("line") .attr("class", "link") .style("stroke-width", function(d) { return thickness(d.value); }); link.append("title") .text(function(d) { return nodeLabelID[d.source.id] + " -> " + nodeLabelID[d.target.id]; }); var node = zoomable_layer.selectAll(".node") .data(graph.nodes) .enter().append("circle") .attr("class", "node") .attr("r", 2.5) .style("fill", function(d) { return color(d.group); }) .call(force.drag); node.append("title") .text(function(d) { return d.name; }); force.on("tick", function() { 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; }); }); });