Alexis Jacomy
I am a data-visualization engineer from Nantes, France. I frequently speak in conferences and meetups about data visualization, web technologies, and networks mapping.
@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);
By Alexis Jacomy
@parisjs, 31 Octobre 2012
I am a data-visualization engineer from Nantes, France. I frequently speak in conferences and meetups about data visualization, web technologies, and networks mapping.