Last active
August 29, 2015 14:24
-
-
Save nivas8292/e4cbdc1895d81e417d92 to your computer and use it in GitHub Desktop.
Adjacency Matrix Example
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| (function() { | |
| d3.layout.adjacencyMatrix = function() { | |
| var directed = true, | |
| size = [1,1], | |
| nodes = [], | |
| edges = [], | |
| edgeWeight = function (d) {return 1}, | |
| nodeID = function (d) {return d.id}; | |
| function matrix() { | |
| var width = size[0], | |
| height = size[1], | |
| nodeWidth = width / nodes.length, | |
| nodeHeight = height / nodes.length, | |
| constructedMatrix = [], | |
| matrix = [], | |
| edgeHash = {}, | |
| xScale = d3.scale.linear().domain([0,nodes.length]).range([0,width]), | |
| yScale = d3.scale.linear().domain([0,nodes.length]).range([0,height]); | |
| nodes.forEach(function(node, i) { | |
| node.sortedIndex = i; | |
| }) | |
| edges.forEach(function(edge) { | |
| var constructedEdge = {source: edge.source, target: edge.target, weight: edgeWeight(edge)}; | |
| if (typeof edge.source == "number") { | |
| constructedEdge.source = nodes[edge.source]; | |
| } | |
| if (typeof edge.target == "number") { | |
| constructedEdge.target = nodes[edge.target]; | |
| } | |
| var id = nodeID(constructedEdge.source) + "-" + nodeID(constructedEdge.target); | |
| if (directed === false && constructedEdge.source.sortedIndex < constructedEdge.target.sortedIndex) { | |
| id = nodeID(constructedEdge.target) + "-" + nodeID(constructedEdge.source); | |
| } | |
| if (!edgeHash[id]) { | |
| edgeHash[id] = constructedEdge; | |
| } | |
| else { | |
| edgeHash[id].weight = edgeHash[id].weight + constructedEdge.weight; | |
| } | |
| }); | |
| console.log("nodes", nodes, nodes.length) | |
| nodes.forEach(function (sourceNode, a) { | |
| nodes.forEach(function (targetNode, b) { | |
| var grid = {id: nodeID(sourceNode) + "-" + nodeID(targetNode), source: sourceNode, target: targetNode, x: xScale(b), y: yScale(a), weight: 0, height: nodeHeight, width: nodeWidth}; | |
| var edgeWeight = 0; | |
| if (edgeHash[grid.id]) { | |
| edgeWeight = edgeHash[grid.id].weight; | |
| grid.weight = edgeWeight; | |
| }; | |
| if (directed === true || b < a) { | |
| matrix.push(grid); | |
| if (directed === false) { | |
| var mirrorGrid = {id: nodeID(sourceNode) + "-" + nodeID(targetNode), source: sourceNode, target: targetNode, x: xScale(a), y: yScale(b), weight: 0, height: nodeHeight, width: nodeWidth}; | |
| mirrorGrid.weight = edgeWeight; | |
| matrix.push(mirrorGrid); | |
| } | |
| } | |
| }); | |
| }); | |
| console.log("matrix", matrix, matrix.length) | |
| return matrix; | |
| } | |
| matrix.directed = function(x) { | |
| if (!arguments.length) return directed; | |
| directed = x; | |
| return matrix; | |
| } | |
| matrix.size = function(x) { | |
| if (!arguments.length) return size; | |
| size = x; | |
| return matrix; | |
| } | |
| matrix.nodes = function(x) { | |
| if (!arguments.length) return nodes; | |
| nodes = x; | |
| return matrix; | |
| } | |
| matrix.links = function(x) { | |
| if (!arguments.length) return edges; | |
| edges = x; | |
| return matrix; | |
| } | |
| matrix.edgeWeight = function(x) { | |
| if (!arguments.length) return edgeWeight; | |
| if (typeof x === "function") { | |
| edgeWeight = x; | |
| } | |
| else { | |
| edgeWeight = function () {return x}; | |
| } | |
| return matrix; | |
| } | |
| matrix.nodeID = function(x) { | |
| if (!arguments.length) return nodeID; | |
| if (typeof x === "function") { | |
| nodeID = x; | |
| } | |
| return matrix; | |
| } | |
| matrix.xAxis = function(calledG) { | |
| var nameScale = d3.scale.ordinal() | |
| .domain(nodes.map(nodeID)) | |
| .rangePoints([0,size[0]],1); | |
| var xAxis = d3.svg.axis().scale(nameScale).orient("top").tickSize(4); | |
| calledG | |
| .append("g") | |
| .attr("class", "am-xAxis am-axis") | |
| .call(xAxis) | |
| .selectAll("text") | |
| .style("text-anchor", "end") | |
| .attr("transform", "translate(-10,-10) rotate(90)"); | |
| } | |
| matrix.yAxis = function(calledG) { | |
| var nameScale = d3.scale.ordinal() | |
| .domain(nodes.map(nodeID)) | |
| .rangePoints([0,size[1]],1); | |
| yAxis = d3.svg.axis().scale(nameScale) | |
| .orient("left") | |
| .tickSize(4); | |
| calledG.append("g") | |
| .attr("class", "am-yAxis am-axis") | |
| .call(yAxis); | |
| } | |
| return matrix; | |
| } | |
| })(); |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| { | |
| "nodes":[ | |
| {"name":"Myriel","group":1}, | |
| {"name":"Napoleon","group":1}, | |
| {"name":"Mlle.Baptistine","group":1}, | |
| {"name":"Mme.Magloire","group":1}, | |
| {"name":"CountessdeLo","group":1}, | |
| {"name":"Geborand","group":1}, | |
| {"name":"Champtercier","group":1}, | |
| {"name":"Cravatte","group":1}, | |
| {"name":"Count","group":1}, | |
| {"name":"OldMan","group":1}, | |
| {"name":"Labarre","group":2}, | |
| {"name":"Valjean","group":2}, | |
| {"name":"Marguerite","group":3}, | |
| {"name":"Mme.deR","group":2}, | |
| {"name":"Isabeau","group":2}, | |
| {"name":"Gervais","group":2}, | |
| {"name":"Tholomyes","group":3}, | |
| {"name":"Listolier","group":3}, | |
| {"name":"Fameuil","group":3}, | |
| {"name":"Blacheville","group":3}, | |
| {"name":"Favourite","group":3}, | |
| {"name":"Dahlia","group":3}, | |
| {"name":"Zephine","group":3}, | |
| {"name":"Fantine","group":3}, | |
| {"name":"Mme.Thenardier","group":4}, | |
| {"name":"Thenardier","group":4}, | |
| {"name":"Cosette","group":5}, | |
| {"name":"Javert","group":4}, | |
| {"name":"Fauchelevent","group":0}, | |
| {"name":"Bamatabois","group":2}, | |
| {"name":"Perpetue","group":3}, | |
| {"name":"Simplice","group":2}, | |
| {"name":"Scaufflaire","group":2}, | |
| {"name":"Woman1","group":2}, | |
| {"name":"Judge","group":2}, | |
| {"name":"Champmathieu","group":2}, | |
| {"name":"Brevet","group":2}, | |
| {"name":"Chenildieu","group":2}, | |
| {"name":"Cochepaille","group":2}, | |
| {"name":"Pontmercy","group":4}, | |
| {"name":"Boulatruelle","group":6}, | |
| {"name":"Eponine","group":4}, | |
| {"name":"Anzelma","group":4}, | |
| {"name":"Woman2","group":5}, | |
| {"name":"MotherInnocent","group":0}, | |
| {"name":"Gribier","group":0}, | |
| {"name":"Jondrette","group":7}, | |
| {"name":"Mme.Burgon","group":7}, | |
| {"name":"Gavroche","group":8}, | |
| {"name":"Gillenormand","group":5}, | |
| {"name":"Magnon","group":5}, | |
| {"name":"Mlle.Gillenormand","group":5}, | |
| {"name":"Mme.Pontmercy","group":5}, | |
| {"name":"Mlle.Vaubois","group":5}, | |
| {"name":"Lt.Gillenormand","group":5}, | |
| {"name":"Marius","group":8}, | |
| {"name":"BaronessT","group":5}, | |
| {"name":"Mabeuf","group":8}, | |
| {"name":"Enjolras","group":8}, | |
| {"name":"Combeferre","group":8}, | |
| {"name":"Prouvaire","group":8}, | |
| {"name":"Feuilly","group":8}, | |
| {"name":"Courfeyrac","group":8}, | |
| {"name":"Bahorel","group":8}, | |
| {"name":"Bossuet","group":8}, | |
| {"name":"Joly","group":8}, | |
| {"name":"Grantaire","group":8}, | |
| {"name":"MotherPlutarch","group":9}, | |
| {"name":"Gueulemer","group":4}, | |
| {"name":"Babet","group":4}, | |
| {"name":"Claquesous","group":4}, | |
| {"name":"Montparnasse","group":4}, | |
| {"name":"Toussaint","group":5}, | |
| {"name":"Child1","group":10}, | |
| {"name":"Child2","group":10}, | |
| {"name":"Brujon","group":4}, | |
| {"name":"Mme.Hucheloup","group":8} | |
| ], | |
| "links":[ | |
| {"source":1,"target":0,"value":1}, | |
| {"source":2,"target":0,"value":8}, | |
| {"source":3,"target":0,"value":10}, | |
| {"source":3,"target":2,"value":6}, | |
| {"source":4,"target":0,"value":1}, | |
| {"source":5,"target":0,"value":1}, | |
| {"source":6,"target":0,"value":1}, | |
| {"source":7,"target":0,"value":1}, | |
| {"source":8,"target":0,"value":2}, | |
| {"source":9,"target":0,"value":1}, | |
| {"source":11,"target":10,"value":1}, | |
| {"source":11,"target":3,"value":3}, | |
| {"source":11,"target":2,"value":3}, | |
| {"source":11,"target":0,"value":5}, | |
| {"source":12,"target":11,"value":1}, | |
| {"source":13,"target":11,"value":1}, | |
| {"source":14,"target":11,"value":1}, | |
| {"source":15,"target":11,"value":1}, | |
| {"source":17,"target":16,"value":4}, | |
| {"source":18,"target":16,"value":4}, | |
| {"source":18,"target":17,"value":4}, | |
| {"source":19,"target":16,"value":4}, | |
| {"source":19,"target":17,"value":4}, | |
| {"source":19,"target":18,"value":4}, | |
| {"source":20,"target":16,"value":3}, | |
| {"source":20,"target":17,"value":3}, | |
| {"source":20,"target":18,"value":3}, | |
| {"source":20,"target":19,"value":4}, | |
| {"source":21,"target":16,"value":3}, | |
| {"source":21,"target":17,"value":3}, | |
| {"source":21,"target":18,"value":3}, | |
| {"source":21,"target":19,"value":3}, | |
| {"source":21,"target":20,"value":5}, | |
| {"source":22,"target":16,"value":3}, | |
| {"source":22,"target":17,"value":3}, | |
| {"source":22,"target":18,"value":3}, | |
| {"source":22,"target":19,"value":3}, | |
| {"source":22,"target":20,"value":4}, | |
| {"source":22,"target":21,"value":4}, | |
| {"source":23,"target":16,"value":3}, | |
| {"source":23,"target":17,"value":3}, | |
| {"source":23,"target":18,"value":3}, | |
| {"source":23,"target":19,"value":3}, | |
| {"source":23,"target":20,"value":4}, | |
| {"source":23,"target":21,"value":4}, | |
| {"source":23,"target":22,"value":4}, | |
| {"source":23,"target":12,"value":2}, | |
| {"source":23,"target":11,"value":9}, | |
| {"source":24,"target":23,"value":2}, | |
| {"source":24,"target":11,"value":7}, | |
| {"source":25,"target":24,"value":13}, | |
| {"source":25,"target":23,"value":1}, | |
| {"source":25,"target":11,"value":12}, | |
| {"source":26,"target":24,"value":4}, | |
| {"source":26,"target":11,"value":31}, | |
| {"source":26,"target":16,"value":1}, | |
| {"source":26,"target":25,"value":1}, | |
| {"source":27,"target":11,"value":17}, | |
| {"source":27,"target":23,"value":5}, | |
| {"source":27,"target":25,"value":5}, | |
| {"source":27,"target":24,"value":1}, | |
| {"source":27,"target":26,"value":1}, | |
| {"source":28,"target":11,"value":8}, | |
| {"source":28,"target":27,"value":1}, | |
| {"source":29,"target":23,"value":1}, | |
| {"source":29,"target":27,"value":1}, | |
| {"source":29,"target":11,"value":2}, | |
| {"source":30,"target":23,"value":1}, | |
| {"source":31,"target":30,"value":2}, | |
| {"source":31,"target":11,"value":3}, | |
| {"source":31,"target":23,"value":2}, | |
| {"source":31,"target":27,"value":1}, | |
| {"source":32,"target":11,"value":1}, | |
| {"source":33,"target":11,"value":2}, | |
| {"source":33,"target":27,"value":1}, | |
| {"source":34,"target":11,"value":3}, | |
| {"source":34,"target":29,"value":2}, | |
| {"source":35,"target":11,"value":3}, | |
| {"source":35,"target":34,"value":3}, | |
| {"source":35,"target":29,"value":2}, | |
| {"source":36,"target":34,"value":2}, | |
| {"source":36,"target":35,"value":2}, | |
| {"source":36,"target":11,"value":2}, | |
| {"source":36,"target":29,"value":1}, | |
| {"source":37,"target":34,"value":2}, | |
| {"source":37,"target":35,"value":2}, | |
| {"source":37,"target":36,"value":2}, | |
| {"source":37,"target":11,"value":2}, | |
| {"source":37,"target":29,"value":1}, | |
| {"source":38,"target":34,"value":2}, | |
| {"source":38,"target":35,"value":2}, | |
| {"source":38,"target":36,"value":2}, | |
| {"source":38,"target":37,"value":2}, | |
| {"source":38,"target":11,"value":2}, | |
| {"source":38,"target":29,"value":1}, | |
| {"source":39,"target":25,"value":1}, | |
| {"source":40,"target":25,"value":1}, | |
| {"source":41,"target":24,"value":2}, | |
| {"source":41,"target":25,"value":3}, | |
| {"source":42,"target":41,"value":2}, | |
| {"source":42,"target":25,"value":2}, | |
| {"source":42,"target":24,"value":1}, | |
| {"source":43,"target":11,"value":3}, | |
| {"source":43,"target":26,"value":1}, | |
| {"source":43,"target":27,"value":1}, | |
| {"source":44,"target":28,"value":3}, | |
| {"source":44,"target":11,"value":1}, | |
| {"source":45,"target":28,"value":2}, | |
| {"source":47,"target":46,"value":1}, | |
| {"source":48,"target":47,"value":2}, | |
| {"source":48,"target":25,"value":1}, | |
| {"source":48,"target":27,"value":1}, | |
| {"source":48,"target":11,"value":1}, | |
| {"source":49,"target":26,"value":3}, | |
| {"source":49,"target":11,"value":2}, | |
| {"source":50,"target":49,"value":1}, | |
| {"source":50,"target":24,"value":1}, | |
| {"source":51,"target":49,"value":9}, | |
| {"source":51,"target":26,"value":2}, | |
| {"source":51,"target":11,"value":2}, | |
| {"source":52,"target":51,"value":1}, | |
| {"source":52,"target":39,"value":1}, | |
| {"source":53,"target":51,"value":1}, | |
| {"source":54,"target":51,"value":2}, | |
| {"source":54,"target":49,"value":1}, | |
| {"source":54,"target":26,"value":1}, | |
| {"source":55,"target":51,"value":6}, | |
| {"source":55,"target":49,"value":12}, | |
| {"source":55,"target":39,"value":1}, | |
| {"source":55,"target":54,"value":1}, | |
| {"source":55,"target":26,"value":21}, | |
| {"source":55,"target":11,"value":19}, | |
| {"source":55,"target":16,"value":1}, | |
| {"source":55,"target":25,"value":2}, | |
| {"source":55,"target":41,"value":5}, | |
| {"source":55,"target":48,"value":4}, | |
| {"source":56,"target":49,"value":1}, | |
| {"source":56,"target":55,"value":1}, | |
| {"source":57,"target":55,"value":1}, | |
| {"source":57,"target":41,"value":1}, | |
| {"source":57,"target":48,"value":1}, | |
| {"source":58,"target":55,"value":7}, | |
| {"source":58,"target":48,"value":7}, | |
| {"source":58,"target":27,"value":6}, | |
| {"source":58,"target":57,"value":1}, | |
| {"source":58,"target":11,"value":4}, | |
| {"source":59,"target":58,"value":15}, | |
| {"source":59,"target":55,"value":5}, | |
| {"source":59,"target":48,"value":6}, | |
| {"source":59,"target":57,"value":2}, | |
| {"source":60,"target":48,"value":1}, | |
| {"source":60,"target":58,"value":4}, | |
| {"source":60,"target":59,"value":2}, | |
| {"source":61,"target":48,"value":2}, | |
| {"source":61,"target":58,"value":6}, | |
| {"source":61,"target":60,"value":2}, | |
| {"source":61,"target":59,"value":5}, | |
| {"source":61,"target":57,"value":1}, | |
| {"source":61,"target":55,"value":1}, | |
| {"source":62,"target":55,"value":9}, | |
| {"source":62,"target":58,"value":17}, | |
| {"source":62,"target":59,"value":13}, | |
| {"source":62,"target":48,"value":7}, | |
| {"source":62,"target":57,"value":2}, | |
| {"source":62,"target":41,"value":1}, | |
| {"source":62,"target":61,"value":6}, | |
| {"source":62,"target":60,"value":3}, | |
| {"source":63,"target":59,"value":5}, | |
| {"source":63,"target":48,"value":5}, | |
| {"source":63,"target":62,"value":6}, | |
| {"source":63,"target":57,"value":2}, | |
| {"source":63,"target":58,"value":4}, | |
| {"source":63,"target":61,"value":3}, | |
| {"source":63,"target":60,"value":2}, | |
| {"source":63,"target":55,"value":1}, | |
| {"source":64,"target":55,"value":5}, | |
| {"source":64,"target":62,"value":12}, | |
| {"source":64,"target":48,"value":5}, | |
| {"source":64,"target":63,"value":4}, | |
| {"source":64,"target":58,"value":10}, | |
| {"source":64,"target":61,"value":6}, | |
| {"source":64,"target":60,"value":2}, | |
| {"source":64,"target":59,"value":9}, | |
| {"source":64,"target":57,"value":1}, | |
| {"source":64,"target":11,"value":1}, | |
| {"source":65,"target":63,"value":5}, | |
| {"source":65,"target":64,"value":7}, | |
| {"source":65,"target":48,"value":3}, | |
| {"source":65,"target":62,"value":5}, | |
| {"source":65,"target":58,"value":5}, | |
| {"source":65,"target":61,"value":5}, | |
| {"source":65,"target":60,"value":2}, | |
| {"source":65,"target":59,"value":5}, | |
| {"source":65,"target":57,"value":1}, | |
| {"source":65,"target":55,"value":2}, | |
| {"source":66,"target":64,"value":3}, | |
| {"source":66,"target":58,"value":3}, | |
| {"source":66,"target":59,"value":1}, | |
| {"source":66,"target":62,"value":2}, | |
| {"source":66,"target":65,"value":2}, | |
| {"source":66,"target":48,"value":1}, | |
| {"source":66,"target":63,"value":1}, | |
| {"source":66,"target":61,"value":1}, | |
| {"source":66,"target":60,"value":1}, | |
| {"source":67,"target":57,"value":3}, | |
| {"source":68,"target":25,"value":5}, | |
| {"source":68,"target":11,"value":1}, | |
| {"source":68,"target":24,"value":1}, | |
| {"source":68,"target":27,"value":1}, | |
| {"source":68,"target":48,"value":1}, | |
| {"source":68,"target":41,"value":1}, | |
| {"source":69,"target":25,"value":6}, | |
| {"source":69,"target":68,"value":6}, | |
| {"source":69,"target":11,"value":1}, | |
| {"source":69,"target":24,"value":1}, | |
| {"source":69,"target":27,"value":2}, | |
| {"source":69,"target":48,"value":1}, | |
| {"source":69,"target":41,"value":1}, | |
| {"source":70,"target":25,"value":4}, | |
| {"source":70,"target":69,"value":4}, | |
| {"source":70,"target":68,"value":4}, | |
| {"source":70,"target":11,"value":1}, | |
| {"source":70,"target":24,"value":1}, | |
| {"source":70,"target":27,"value":1}, | |
| {"source":70,"target":41,"value":1}, | |
| {"source":70,"target":58,"value":1}, | |
| {"source":71,"target":27,"value":1}, | |
| {"source":71,"target":69,"value":2}, | |
| {"source":71,"target":68,"value":2}, | |
| {"source":71,"target":70,"value":2}, | |
| {"source":71,"target":11,"value":1}, | |
| {"source":71,"target":48,"value":1}, | |
| {"source":71,"target":41,"value":1}, | |
| {"source":71,"target":25,"value":1}, | |
| {"source":72,"target":26,"value":2}, | |
| {"source":72,"target":27,"value":1}, | |
| {"source":72,"target":11,"value":1}, | |
| {"source":73,"target":48,"value":2}, | |
| {"source":74,"target":48,"value":2}, | |
| {"source":74,"target":73,"value":3}, | |
| {"source":75,"target":69,"value":3}, | |
| {"source":75,"target":68,"value":3}, | |
| {"source":75,"target":25,"value":3}, | |
| {"source":75,"target":48,"value":1}, | |
| {"source":75,"target":41,"value":1}, | |
| {"source":75,"target":70,"value":1}, | |
| {"source":75,"target":71,"value":1}, | |
| {"source":76,"target":64,"value":1}, | |
| {"source":76,"target":65,"value":1}, | |
| {"source":76,"target":66,"value":1}, | |
| {"source":76,"target":63,"value":1}, | |
| {"source":76,"target":62,"value":1}, | |
| {"source":76,"target":48,"value":1}, | |
| {"source":76,"target":58,"value":1} | |
| ] | |
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <!DOCTYPE html> | |
| <html> | |
| <head> | |
| <title>Adjacency Matrix Layout</title> | |
| <style> | |
| svg { | |
| width: 1250px; | |
| height: 850px; | |
| border: 1px solid gray; | |
| } | |
| g.am-axis text { | |
| font-size: 8px; | |
| } | |
| .domain { | |
| fill: none; | |
| } | |
| .tick > line{ | |
| stroke: black; | |
| stroke-width: 1px; | |
| stroke-opacity: .25; | |
| } | |
| </style> | |
| </head> | |
| <body> | |
| <svg></svg> | |
| <script src="http://d3js.org/d3.v3.min.js" type="text/JavaScript"></script> | |
| <script src="adjacency_matrix.js"></script> | |
| <script> | |
| var svg = d3.select('svg'); | |
| d3.json('data.json', function(err, data) { | |
| var adjacencyMatrix = d3.layout.adjacencyMatrix() | |
| .size([1200, 800]) | |
| .nodes(data.nodes) | |
| .links(data.links) | |
| .directed(false) | |
| .nodeID(function(d) {return d.name;}); | |
| var matrixData = adjacencyMatrix(); | |
| var colorScale = d3.scale.category20b(); | |
| svg.append('g') | |
| .attr('transform', 'translate(' + 50 + ',' + 50 + ')') | |
| .attr('id', 'adjacencyG') | |
| .selectAll('rect') | |
| .data(matrixData) | |
| .enter().append('rect') | |
| .attr('x', function(d) {return d.x;}) | |
| .attr('y', function(d) {return d.y;}) | |
| .attr('width', function(d) {return d.width;}) | |
| .attr('height', function(d) {return d.height;}) | |
| .style('stroke', 'black') | |
| .style('stroke-width', '1px') | |
| .style('stroke-opacity', .1) | |
| .style('fill', function(d) {return colorScale(d.source.group);}) | |
| .style('fill-opacity', function(d) {return d.weight * .8;}) | |
| d3.select('#adjacencyG') | |
| .call(adjacencyMatrix.xAxis) | |
| .call(adjacencyMatrix.yAxis); | |
| }); | |
| </script> | |
| </body> | |
| </html> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment