Advertisement
Guest User

Untitled

a guest
Jan 26th, 2015
241
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.59 KB | None | 0 0
  1. var width = 400,
  2. height = 500,
  3. shiftKey;
  4.  
  5. var svg = d3.select("body")
  6. .attr("tabindex", 1)
  7. .on("keydown.brush", keydown)
  8. .on("keyup.brush", keyup)
  9. .each(function() { this.focus(); })
  10. .append("svg")
  11. .attr("width", width)
  12. .attr("height", height);
  13.  
  14. var link = svg.append("g")
  15. .attr("class", "link")
  16. .selectAll("line");
  17.  
  18. var brush = svg.append("g")
  19. .datum(function() { return {selected: false, previouslySelected: false}; })
  20. .attr("class", "brush");
  21.  
  22. var node = svg.append("g")
  23. .attr("class", "node")
  24. .selectAll("circle");
  25.  
  26. var graph = {"nodes":[{"x":444,"y":275},{"x":378,"y":324},{"x":478,"y":278},{"x":471,"y":256},{"x":382,"y":269},{"x":371,"y":247},{"x":359,"y":276},{"x":364,"y":302},{"x":400,"y":330},{"x":388,"y":298},{"x":524,"y":296},{"x":570,"y":243},{"x":552,"y":159},{"x":502,"y":287},{"x":511,"y":313},{"x":513,"y":265},{"x":602,"y":132},{"x":610,"y":90},{"x":592,"y":91},{"x":575,"y":89},{"x":607,"y":73},{"x":591,"y":68},{"x":574,"y":73},{"x":589,"y":149},{"x":620,"y":205},{"x":621,"y":230},{"x":589,"y":234},{"x":602,"y":223},{"x":548,"y":188},{"x":532,"y":196},{"x":548,"y":114},{"x":575,"y":174},{"x":497,"y":250},{"x":576,"y":196},{"x":504,"y":201},{"x":494,"y":186},{"x":482,"y":199},{"x":505,"y":219},{"x":486,"y":216},{"x":590,"y":306},{"x":677,"y":169},{"x":657,"y":258},{"x":667,"y":205},{"x":552,"y":227},{"x":518,"y":173},{"x":473,"y":125},{"x":796,"y":260},{"x":731,"y":272},{"x":642,"y":288},{"x":576,"y":269},{"x":605,"y":187},{"x":559,"y":289},{"x":544,"y":356},{"x":505,"y":365},{"x":579,"y":289},{"x":619,"y":282},{"x":574,"y":329},{"x":664,"y":306},{"x":627,"y":304},{"x":643,"y":327},{"x":664,"y":348},{"x":665,"y":327},{"x":653,"y":317},{"x":650,"y":338},{"x":622,"y":321},{"x":633,"y":338},{"x":647,"y":357},{"x":718,"y":362},{"x":636,"y":240},{"x":640,"y":227},{"x":617,"y":249},{"x":631,"y":254},{"x":566,"y":213},{"x":713,"y":322},{"x":716,"y":298},{"x":666,"y":241},{"x":627,"y":355}],"links":[{"source":1,"target":0},{"source":2,"target":0},{"source":3,"target":0},{"source":3,"target":2},{"source":4,"target":0},{"source":5,"target":0},{"source":6,"target":0},{"source":7,"target":0},{"source":8,"target":0},{"source":9,"target":0},{"source":11,"target":10},{"source":11,"target":3},{"source":11,"target":2},{"source":11,"target":0},{"source":12,"target":11},{"source":13,"target":11},{"source":14,"target":11},{"source":15,"target":11},{"source":17,"target":16},{"source":18,"target":16},{"source":18,"target":17},{"source":19,"target":16},{"source":19,"target":17},{"source":19,"target":18},{"source":20,"target":16},{"source":20,"target":17},{"source":20,"target":18},{"source":20,"target":19},{"source":21,"target":16},{"source":21,"target":17},{"source":21,"target":18},{"source":21,"target":19},{"source":21,"target":20},{"source":22,"target":16},{"source":22,"target":17},{"source":22,"target":18},{"source":22,"target":19},{"source":22,"target":20},{"source":22,"target":21},{"source":23,"target":16},{"source":23,"target":17},{"source":23,"target":18},{"source":23,"target":19},{"source":23,"target":20},{"source":23,"target":21},{"source":23,"target":22},{"source":23,"target":12},{"source":23,"target":11},{"source":24,"target":23},{"source":24,"target":11},{"source":25,"target":24},{"source":25,"target":23},{"source":25,"target":11},{"source":26,"target":24},{"source":26,"target":11},{"source":26,"target":16},{"source":26,"target":25},{"source":27,"target":11},{"source":27,"target":23},{"source":27,"target":25},{"source":27,"target":24},{"source":27,"target":26},{"source":28,"target":11},{"source":28,"target":27},{"source":29,"target":23},{"source":29,"target":27},{"source":29,"target":11},{"source":30,"target":23},{"source":31,"target":30},{"source":31,"target":11},{"source":31,"target":23},{"source":31,"target":27},{"source":32,"target":11},{"source":33,"target":11},{"source":33,"target":27},{"source":34,"target":11},{"source":34,"target":29},{"source":35,"target":11},{"source":35,"target":34},{"source":35,"target":29},{"source":36,"target":34},{"source":36,"target":35},{"source":36,"target":11},{"source":36,"target":29},{"source":37,"target":34},{"source":37,"target":35},{"source":37,"target":36},{"source":37,"target":11},{"source":37,"target":29},{"source":38,"target":34},{"source":38,"target":35},{"source":38,"target":36},{"source":38,"target":37},{"source":38,"target":11},{"source":38,"target":29},{"source":39,"target":25},{"source":40,"target":25},{"source":41,"target":24},{"source":41,"target":25},{"source":42,"target":41},{"source":42,"target":25},{"source":42,"target":24},{"source":43,"target":11},{"source":43,"target":26},{"source":43,"target":27},{"source":44,"target":28},{"source":44,"target":11},{"source":45,"target":28},{"source":47,"target":46},{"source":48,"target":47},{"source":48,"target":25},{"source":48,"target":27},{"source":48,"target":11},{"source":49,"target":26},{"source":49,"target":11},{"source":50,"target":49},{"source":50,"target":24},{"source":51,"target":49},{"source":51,"target":26},{"source":51,"target":11},{"source":52,"target":51},{"source":52,"target":39},{"source":53,"target":51},{"source":54,"target":51},{"source":54,"target":49},{"source":54,"target":26},{"source":55,"target":51},{"source":55,"target":49},{"source":55,"target":39},{"source":55,"target":54},{"source":55,"target":26},{"source":55,"target":11},{"source":55,"target":16},{"source":55,"target":25},{"source":55,"target":41},{"source":55,"target":48},{"source":56,"target":49},{"source":56,"target":55},{"source":57,"target":55},{"source":57,"target":41},{"source":57,"target":48},{"source":58,"target":55},{"source":58,"target":48},{"source":58,"target":27},{"source":58,"target":57},{"source":58,"target":11},{"source":59,"target":58},{"source":59,"target":55},{"source":59,"target":48},{"source":59,"target":57},{"source":60,"target":48},{"source":60,"target":58},{"source":60,"target":59},{"source":61,"target":48},{"source":61,"target":58},{"source":61,"target":60},{"source":61,"target":59},{"source":61,"target":57},{"source":61,"target":55},{"source":62,"target":55},{"source":62,"target":58},{"source":62,"target":59},{"source":62,"target":48},{"source":62,"target":57},{"source":62,"target":41},{"source":62,"target":61},{"source":62,"target":60},{"source":63,"target":59},{"source":63,"target":48},{"source":63,"target":62},{"source":63,"target":57},{"source":63,"target":58},{"source":63,"target":61},{"source":63,"target":60},{"source":63,"target":55},{"source":64,"target":55},{"source":64,"target":62},{"source":64,"target":48},{"source":64,"target":63},{"source":64,"target":58},{"source":64,"target":61},{"source":64,"target":60},{"source":64,"target":59},{"source":64,"target":57},{"source":64,"target":11},{"source":65,"target":63},{"source":65,"target":64},{"source":65,"target":48},{"source":65,"target":62},{"source":65,"target":58},{"source":65,"target":61},{"source":65,"target":60},{"source":65,"target":59},{"source":65,"target":57},{"source":65,"target":55},{"source":66,"target":64},{"source":66,"target":58},{"source":66,"target":59},{"source":66,"target":62},{"source":66,"target":65},{"source":66,"target":48},{"source":66,"target":63},{"source":66,"target":61},{"source":66,"target":60},{"source":67,"target":57},{"source":68,"target":25},{"source":68,"target":11},{"source":68,"target":24},{"source":68,"target":27},{"source":68,"target":48},{"source":68,"target":41},{"source":69,"target":25},{"source":69,"target":68},{"source":69,"target":11},{"source":69,"target":24},{"source":69,"target":27},{"source":69,"target":48},{"source":69,"target":41},{"source":70,"target":25},{"source":70,"target":69},{"source":70,"target":68},{"source":70,"target":11},{"source":70,"target":24},{"source":70,"target":27},{"source":70,"target":41},{"source":70,"target":58},{"source":71,"target":27},{"source":71,"target":69},{"source":71,"target":68},{"source":71,"target":70},{"source":71,"target":11},{"source":71,"target":48},{"source":71,"target":41},{"source":71,"target":25},{"source":72,"target":26},{"source":72,"target":27},{"source":72,"target":11},{"source":73,"target":48},{"source":74,"target":48},{"source":74,"target":73},{"source":75,"target":69},{"source":75,"target":68},{"source":75,"target":25},{"source":75,"target":48},{"source":75,"target":41},{"source":75,"target":70},{"source":75,"target":71},{"source":76,"target":64},{"source":76,"target":65},{"source":76,"target":66},{"source":76,"target":63},{"source":76,"target":62},{"source":76,"target":48},{"source":76,"target":58}]}
  27.  
  28. graph.links.forEach(function(d) {
  29. d.source = graph.nodes[d.source];
  30. d.target = graph.nodes[d.target];
  31. });
  32.  
  33. link = link.data(graph.links).enter().append("line")
  34. .attr("x1", function(d) { return d.source.x; })
  35. .attr("y1", function(d) { return d.source.y; })
  36. .attr("x2", function(d) { return d.target.x; })
  37. .attr("y2", function(d) { return d.target.y; });
  38.  
  39. brush.call(d3.svg.brush()
  40. .x(d3.scale.identity().domain([0, width]))
  41. .y(d3.scale.identity().domain([0, height]))
  42. .on("brushstart", function(d) {
  43. node.each(function(d) { d.previouslySelected = shiftKey && d.selected; });
  44. })
  45. .on("brush", function() {
  46. var extent = d3.event.target.extent();
  47. node.classed("selected", function(d) {
  48. return d.selected = d.previouslySelected ^
  49. (extent[0][0] <= d.x && d.x < extent[1][0]
  50. && extent[0][1] <= d.y && d.y < extent[1][1]);
  51. });
  52. })
  53. .on("brushend", function() {
  54. d3.event.target.clear();
  55. d3.select(this).call(d3.event.target);
  56. }));
  57.  
  58. var force = d3.layout.force()
  59. .charge(-120)
  60. .linkDistance(30)
  61. .nodes(graph.nodes)
  62. .links(graph.links)
  63. .size([width, height])
  64. .start();
  65.  
  66. node = node.data(graph.nodes).enter().append("circle")
  67. .attr("r", 4)
  68. .attr("cx", function(d) { return d.x; })
  69. .attr("cy", function(d) { return d.y; })
  70. .on("mousedown", function(d) {
  71. if (!d.selected) { // Don't deselect on shift-drag.
  72. if (!shiftKey) node.classed("selected", function(p) { return p.selected = d === p; });
  73. else d3.select(this).classed("selected", d.selected = true);
  74. }
  75. })
  76. .on("mouseup", function(d) {
  77. if (d.selected && shiftKey) d3.select(this).classed("selected", d.selected = false);
  78. })
  79. .call(d3.behavior.drag()
  80. .on("dragstart", function(d1) {
  81. node.filter(function(d) { return d.selected; })
  82. .each(function(d) { d.fixed |= 2; })
  83. })
  84. .on("drag", function(d1) {
  85. node.filter(function(d) { return d.selected; })
  86. .each(function(d) {
  87. d.x += d3.event.dx;
  88. d.y += d3.event.dy;
  89.  
  90. d.px += d3.event.dx;
  91. d.py += d3.event.dy;
  92. })
  93.  
  94. force.resume();
  95. })
  96. .on("dragend", function(d) {
  97. node.filter(function(d) { return d.selected; })
  98. .each(function(d) { d.fixed &= ~6; })
  99. }));
  100.  
  101. function tick() {
  102. link.attr("x1", function(d) { return d.source.x; })
  103. .attr("y1", function(d) { return d.source.y; })
  104. .attr("x2", function(d) { return d.target.x; })
  105. .attr("y2", function(d) { return d.target.y; });
  106.  
  107. node.attr('cx', function(d) { return d.x; }).attr('cy', function(d) { return d.y; });
  108.  
  109. };
  110.  
  111. force.on("tick", tick);
  112.  
  113.  
  114. function keydown() {
  115. shiftKey = d3.event.shiftKey || d3.event.metaKey;
  116. }
  117.  
  118. function keyup() {
  119. shiftKey = d3.event.shiftKey || d3.event.metaKey;
  120. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement