|
|
- <!doctype html>
- <html>
- <head>
- <title>Graph | Groups</title>
-
- <style>
- body {font: 10pt arial;}
- </style>
-
- <script type="text/javascript" src="http://www.google.com/jsapi"></script>
- <script type="text/javascript" src="../../vis.js"></script>
-
- <script type="text/javascript">
- var nodes = null;
- var edges = null;
- var graph = null;
-
- google.load('visualization', '1');
-
- // Set callback to run when API is loaded
- google.setOnLoadCallback(draw);
-
- // Called when the Visualization API is loaded.
- function draw() {
- // Create and populate a data table.
- nodes = new google.visualization.DataTable();
- nodes.addColumn('number', 'id');
- nodes.addColumn('string', 'text');
- nodes.addColumn('number', 'group');
-
- edges = new google.visualization.DataTable();
- edges.addColumn('number', 'from');
- edges.addColumn('number', 'to');
- edges.addColumn('number', 'length');
- edges.addColumn('string', 'color');
- var color = 'gray';
- var len = undefined;
-
- // randomly create some nodes
- var nodeCount = parseInt(document.getElementById('nodeCount').value);
- var nodeOffset = 0;
- var groupMin = 0;
- var groupMax = parseInt(document.getElementById('groupCount').value);
- var group = groupMin;
- var groupLeader = new Array(); // will contain the node id with the most links of each group
- while (group < groupMax) {
- // randomly create some nodes
- var i = 0;
- var cols = parseInt(Math.sqrt(nodeCount));
- var connectionCount = new Array();
- while (i < nodeCount) {
- nodes.addRow([i + nodeOffset, i + nodeOffset + '', group]);
- connectionCount[i] = 0;
-
- // create links in a scale-free-graph way
- if (i == 1) {
- var from = i;
- var to = 0;
- edges.addRow([from + nodeOffset, to + nodeOffset, len, color]);
- connectionCount[from]++;
- connectionCount[to]++;
- }
- else if (i > 1) {
- var conn = (i - 1) * 2;
- var rand = Math.floor(Math.random() * conn);
- var cum = 0;
- var j = 0;
- while (j < connectionCount.length && cum < rand) {
- cum += connectionCount[j];
- j++;
- }
-
- var from = i;
- var to = j;
- edges.addRow([from + nodeOffset, to + nodeOffset, len, color]);
- connectionCount[from]++;
- connectionCount[to]++;
- }
-
- i++;
- }
-
- // calculate the node with the most number of connections
- var leader = 0;
- for (c in connectionCount) {
- if (connectionCount[c] > connectionCount[leader])
- leader = parseInt(c);
- }
-
- if (group > groupMin) {
- // connect to the leader of this group to the leader of a random other group
- var from = leader + nodeOffset;
- var to = groupLeader[groupMin + parseInt(Math.random() * (group - groupMin))];
- edges.addRow([from, to, len, color]);
- }
-
- // add this leader to the list
- groupLeader[group] = leader + nodeOffset;
-
- nodeOffset += nodeCount;
- group++;
- }
-
- // specify options
- var options = {
- width: '600px',
- height: '600px',
- stabilize: false,
- nodes: {
- style: 'dot'
- },
- edges: {
- length: 50
- }
- };
-
- // Instantiate our graph object.
- graph = new vis.Graph(document.getElementById('mygraph'));
-
- // Draw our graph with the created data and options
- graph.draw(nodes, edges, options);
- }
- </script>
- </head>
-
- <body>
- <form onsubmit= "javascript: draw(); return false;">
- Number of groups:
- <input type="text" value="6" id="groupCount" style="width: 50px;">
- Number of nodes per group:
- <input type="text" value="7" id="nodeCount" style="width: 50px;">
- <input type="submit" value="Go">
- </form>
- <br>
-
- <div id="mygraph"></div>
-
- <div id="info"></div>
- </body>
- </html>
|