@parisjs 31 Octobre 2012
Un graphe est un ensemble de points, dont certaines paires sont directement reliées par un (ou plusieurs) lien(s).
Exemples :
réseaux sociaux
graphes hypertextes
graphes de dépendances de classes
...
Un outil de visualisation bien conçu
peut permettre à l'utilisateur d'observer des structures dans un graphe qu'il serait difficile ou impossible à voir dans le graphe sous sa forme brute.
nodedef>name VARCHAR,label VARCHAR
toto,noeud Toto
tutu,noeud Tutu
edgedef>node1 VARCHAR, node2 VARCHAR
toto,tutu
<!DOCTYPE html> <html lang="fr"> <head> <meta charset="utf-8" /> <!-- sigma files import --> <script src="sigma.min.js"></script> <script src="sigma.forceatlas2.js"></script> <!-- demo files import --> <script src="parisjs.js"></script> <link rel="stylesheet" href="parisjs.css"> </head> <body> <div id="container"></div> </body> </html>
body {
background-color: #eee;
}
div#container {
box-shadow: 0px 2px 8px #333;
-moz-box-shadow: 0px 2px 8px #333;
-webkit-box-shadow: 0px 2px 8px #333;
background-color: #fff;
position: absolute;
width: 900px;
height: 90%;
margin-top: 5%;
margin-left: -450px;
left: 50%;
}
var sigInst = sigma.init(
document.getElementById('container')
).graphProperties({
minNodeSize: 0.5,
maxNodeSize: 5
});
var loader = new XMLHttpRequest(); loader.open('GET', 'graphe.gdf'); loader.onreadystatechange = function() { if (loader.readyState == 4) { initGraph(loader.responseText); } } loader.send();
var lines = rawData.split(/\r?\n/), line, parsingEdges = false, parsingNodes = false; // On parcourt les lignes: for (var i = 0; i < lines.length; i++) { line = lines[i]; if (line.match(/^[Nn]odedef>/)) { // On récupère les attributs des noeuds parsingNodes = true; } else if (line.match(/^[Ee]dgedef>/)) { // On récupère les attributs des arcs parsingEdges = true; } else if (parsingEdges) { // On ajoute les arcs } else if (parsingNodes) { // On ajoute les noeuds } }
var nodeAttributes, edgeAttributes; // [...] if (line.match(/^nodedef>/i)) { // Récupérer les attributs des noeuds parsingNodes = true; nodeAttributes = line.replace( /^nodedef>/i, '' ).split(/,/g).map(function(s) { return s.replace(/ .*/, ''); }); } else if (line.match(/^edgedef>/i)) { // Récupérer les attributs des arcs parsingEdges = true; edgeAttributes = line.replace( /^edgedef>/i, '' ).split(/,/g).map(function(s) { return s.replace(/ .*/, ''); }); } // [...]
// [...] var node = {}, nodeId, values = line.split(/,/g); nodeAttributes.forEach(function(attr, i) { if (attr === 'name' || attr === 'id') nodeId = values[i]; else node[attr] = values[i]; }); if (nodeId) sigInst.addNode(nodeId, node); // [...]
// [...] var edge = {}, source, target, values = line.split(/,/g); edgeAttributes.forEach(function(attr, i) { if (attr === 'node1') source = values[i]; else if (attr === 'node2') target = values[i]; else edge[attr] = values[i]; }); if (source && target) sigInst.addEdge(++edgesCount, source, target, edge); // [...]
var R = 100, i = 0, L = sigInst.getNodesCount(); sigInst.iterNodes(function(n) { // Position n.x = Math.cos(Math.PI*(i++)/L)*R; n.y = Math.sin(Math.PI*(i++)/L)*R; // Couleur n.color = n.attr.sex === 'female' ? '#D37' : n.attr.sex === 'male' ? '#33D' : '#888'; // Taille n.size = n.degree; });
// On lance l'algo... sigInst.startForceAtlas2(); // ... et on l'arrête 8 secondes plus tard: window.setTimeout(function() { sigInst.stopForceAtlas2(); }, 8000);