{ "metadata": { "kernelspec": { "codemirror_mode": { "name": "python", "version": 3 }, "display_name": "Python 3", "language": "python", "name": "python3" }, "name": "", "signature": "sha256:7966c84f255ddf4c2149a099eccbeff36baeb57b929859c66e287860941bc018" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "markdown", "metadata": [], "source": [ "> This is one of the 100 recipes of the [IPython Cookbook](http://ipython-books.github.io/), the definitive guide to high-performance scientific computing and data science in Python.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 6.4. Visualizing a NetworkX graph in the IPython notebook with d3.js" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "1. Let's import the packages." ] }, { "cell_type": "code", "collapsed": false, "input": [ "import json\n", "import numpy as np\n", "import networkx as nx\n", "import matplotlib.pyplot as plt\n", "%matplotlib inline" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 1 }, { "cell_type": "markdown", "metadata": {}, "source": [ "2. We load a famous social graph published in 1977, called **Zachary's Karate club graph**. This graph represents the friendships between members of a Karate Club. The club's president and the instructor were involved in a dispute, resulting in a split-up of this group. Here, we simply display the graph with matplotlib (using `networkx.draw()`)." ] }, { "cell_type": "code", "collapsed": false, "input": [ "g = nx.karate_club_graph()\n", "plt.figure(figsize=(6,4));\n", "nx.draw(g)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "display_data", "png": "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\n+xoZe9/wer4qTCQS0Rw/P/pfYaFE5QnL2RLRsYICmuPnR8XFxfV1ee+FJk2akK6urkT7uru705w5\nc+izzz4jTU1NCtqxgz7U0aGHUpzvIb0u09eld2+6efMmPXjwoNbnzrWJj48nHx8fcnNzo8uXL9M3\n33xD6enptGLFComeyxoaGtb53DckJIQmT54s0/Ux9j7j4KvC5E0YaisWU3h4uKIv653QUIuC//e/\n/6WsrCwKDg6mMb6+NH/VKuqho0PREhwbTUQ9dHVpwuzZFBsbS5cuXSJ9fX1q27Yt7d+/nwBIdA3X\nrl0jLy8vat++Pd26dYs2b95ML168oPnz55OOjo7E92JkZES5ubk1bk9ISKCnT59S//79JW6TMfaP\nhu56s5rxotbyUcT7Z6mnh1WrVuHGjRsSJR8BQGJiIszMzCqWBCwvROGlplZnIYrQ/fvRrVs3BAYG\nVrR39epVeHh4oF+/fkhOTq7xvBcuXICbmxvU1dVhZ2eHgwcPylXtql+/frVOtQoICMDixYtlbp+x\n9xn3fFVUTk4OxSQl0XA52hhORDcSEyWeMtLY+C9cSFv19WU+/rsmTah9r1707NkzGjNmDFlbW9Pk\nyZPp8OHDlJ2dXeNxLi4utGDBApo8eTKJxWIa4+tL32/fTjnOzhTo4UHGGhokICKLJk3ISF2dgjw8\naGpwMD1MT6eHjx6RlpYWzZo1q6K9zp0707Vr12jQoEHUpUsXWr16daXHCWfPniVnZ2fq3bs3lZSU\nUEREBN27d48+/vhjatJE9v/FjYyMavzsFBcX0759+2jSpEkyt8/Ye62hoz+rnqIShsoLNbyP5E16\nMtPVxcCBA2FhYYHly5fjypUr2LhxIwYPHgx9fX14e3tjzZo1iIuLq9IrLi0tRdeuXSum4PTs2ROH\nDh1CdnY2/vzzT6irq8Pb2xvz58+vOCYuLg4CgQD379+v8Z7u37+PoUOHwsXFBStXroStrS2a/JOc\nFRUVpdD3b9KkSdi1a1e128LDw9GzZ0+Fno+x9wkX2WjkioqK6IsvviAHBwcSCAQVP0KhsOK/jY2N\n5eohqSotLa3XSU+TJ9NFKZLWypOetuzeTWN8fSkpKYkCAwNp0KBBNHr0aFq3bh05ODjQ77//TqdO\nnaIRI0aQSCSiwYMH0+DBg6lfv35kaGhIe/bsoW7dulHz5s3p5s2bFLRqFU365BMSaGiQSVkZXbt0\n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\nY4wp2f8DKwE2SDXe644AAAAASUVORK5CYII=\n", "text": [ "" ] } ], "prompt_number": 2 }, { "cell_type": "markdown", "metadata": {}, "source": [ "3. Now, we're going to display this graph in the notebook with d3.js. The first step is to bring this graph to Javascript. We choose here to export the graph in JSON. Note that d3.js generally expects each edge to be an object with a `source` and a `target`. Also, we specify which side each member has taken (`club` attribute)." ] }, { "cell_type": "code", "collapsed": false, "input": [ "from networkx.readwrite import json_graph\n", "data = json_graph.node_link_data(g)\n", "with open('graph.json', 'w') as f:\n", " json.dump(data, f, indent=4)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 3 }, { "cell_type": "markdown", "metadata": {}, "source": [ "4. The next step is to create an HTML object that will contain the visualization. Here, we create a `
` element in the notebook. We also specify a few CSS styles for nodes and links (also called edges)." ] }, { "cell_type": "code", "collapsed": false, "input": [ "%%html\n", "
\n", "" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "
\n", "" ], "metadata": {}, "output_type": "display_data", "text": [ "" ] } ], "prompt_number": 4 }, { "cell_type": "markdown", "metadata": {}, "source": [ "5. The last step is trickier. We write the Javascript code to load the graph from the JSON file, and display it with d3.js. Knowing the basics of d3.js is required here (see the documentation of d3.js). We also give detailled explanations in the code comments below. (http://d3js.org)" ] }, { "cell_type": "code", "collapsed": false, "input": [ "%%javascript\n", "// We load the d3.js library from the Web.\n", "require.config({paths: {d3: \"http://d3js.org/d3.v3.min\"}});\n", "require([\"d3\"], function(d3) {\n", " // The code in this block is executed when the \n", " // d3.js library has been loaded.\n", " \n", " // First, we specify the size of the canvas containing\n", " // the visualization (size of the
element).\n", " var width = 300,\n", " height = 300;\n", "\n", " // We create a color scale.\n", " var color = d3.scale.category10();\n", "\n", " // We create a force-directed dynamic graph layout.\n", " var force = d3.layout.force()\n", " .charge(-120)\n", " .linkDistance(30)\n", " .size([width, height]);\n", "\n", " // In the
element, we create a graphic\n", " // that will contain our interactive visualization.\n", " var svg = d3.select(\"#d3-example\").select(\"svg\")\n", " if (svg.empty()) {\n", " svg = d3.select(\"#d3-example\").append(\"svg\")\n", " .attr(\"width\", width)\n", " .attr(\"height\", height);\n", " }\n", " \n", " // We load the JSON file.\n", " d3.json(\"graph.json\", function(error, graph) {\n", " // In this block, the file has been loaded\n", " // and the 'graph' object contains our graph.\n", " \n", " // We load the nodes and links in the force-directed\n", " // graph.\n", " force.nodes(graph.nodes)\n", " .links(graph.links)\n", " .start();\n", "\n", " // We create a SVG element for each link\n", " // in the graph.\n", " var link = svg.selectAll(\".link\")\n", " .data(graph.links)\n", " .enter().append(\"line\")\n", " .attr(\"class\", \"link\");\n", "\n", " // We create a SVG element for each node\n", " // in the graph, and we specify a few attributes.\n", " var node = svg.selectAll(\".node\")\n", " .data(graph.nodes)\n", " .enter().append(\"circle\")\n", " .attr(\"class\", \"node\")\n", " .attr(\"r\", 5) // radius\n", " .style(\"fill\", function(d) {\n", " // The node color depends on the club.\n", " return color(d.club); \n", " })\n", " .call(force.drag);\n", "\n", " // The name of each node is the node number.\n", " node.append(\"title\")\n", " .text(function(d) { return d.id; });\n", "\n", " // We bind the positions of the SVG elements\n", " // to the positions of the dynamic force-directed graph,\n", " // at each time step.\n", " force.on(\"tick\", function() {\n", " link.attr(\"x1\", function(d) { return d.source.x; })\n", " .attr(\"y1\", function(d) { return d.source.y; })\n", " .attr(\"x2\", function(d) { return d.target.x; })\n", " .attr(\"y2\", function(d) { return d.target.y; });\n", "\n", " node.attr(\"cx\", function(d) { return d.x; })\n", " .attr(\"cy\", function(d) { return d.y; });\n", " });\n", " });\n", "});" ], "language": "python", "metadata": {}, "outputs": [ { "javascript": [ "// We load the d3.js library from the Web.\n", "require.config({paths: {d3: \"http://d3js.org/d3.v3.min\"}});\n", "require([\"d3\"], function(d3) {\n", " // The code in this block is executed when the \n", " // d3.js library has been loaded.\n", " \n", " // First, we specify the size of the canvas containing\n", " // the visualization (size of the
element).\n", " var width = 300,\n", " height = 300;\n", "\n", " // We create a color scale.\n", " var color = d3.scale.category10();\n", "\n", " // We create a force-directed dynamic graph layout.\n", " var force = d3.layout.force()\n", " .charge(-120)\n", " .linkDistance(30)\n", " .size([width, height]);\n", "\n", " // In the
element, we create a graphic\n", " // that will contain our interactive visualization.\n", " var svg = d3.select(\"#d3-example\").select(\"svg\")\n", " if (svg.empty()) {\n", " svg = d3.select(\"#d3-example\").append(\"svg\")\n", " .attr(\"width\", width)\n", " .attr(\"height\", height);\n", " }\n", " \n", " // We load the JSON file.\n", " d3.json(\"graph.json\", function(error, graph) {\n", " // In this block, the file has been loaded\n", " // and the 'graph' object contains our graph.\n", " \n", " // We load the nodes and links in the force-directed\n", " // graph.\n", " force.nodes(graph.nodes)\n", " .links(graph.links)\n", " .start();\n", "\n", " // We create a SVG element for each link\n", " // in the graph.\n", " var link = svg.selectAll(\".link\")\n", " .data(graph.links)\n", " .enter().append(\"line\")\n", " .attr(\"class\", \"link\");\n", "\n", " // We create a SVG element for each node\n", " // in the graph, and we specify a few attributes.\n", " var node = svg.selectAll(\".node\")\n", " .data(graph.nodes)\n", " .enter().append(\"circle\")\n", " .attr(\"class\", \"node\")\n", " .attr(\"r\", 5) // radius\n", " .style(\"fill\", function(d) {\n", " // The node color depends on the club.\n", " return color(d.club); \n", " })\n", " .call(force.drag);\n", "\n", " // The name of each node is the node number.\n", " node.append(\"title\")\n", " .text(function(d) { return d.id; });\n", "\n", " // We bind the positions of the SVG elements\n", " // to the positions of the dynamic force-directed graph,\n", " // at each time step.\n", " force.on(\"tick\", function() {\n", " link.attr(\"x1\", function(d) { return d.source.x; })\n", " .attr(\"y1\", function(d) { return d.source.y; })\n", " .attr(\"x2\", function(d) { return d.target.x; })\n", " .attr(\"y2\", function(d) { return d.target.y; });\n", "\n", " node.attr(\"cx\", function(d) { return d.x; })\n", " .attr(\"cy\", function(d) { return d.y; });\n", " });\n", " });\n", "});" ], "metadata": {}, "output_type": "display_data", "text": [ "" ] } ], "prompt_number": 5 }, { "cell_type": "markdown", "metadata": {}, "source": [ "When we execute this cell, the HTML object created in the previous cell is updated. The graph is animated and interactive: we can click on nodes, see their labels, and move them within the canvas." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "> You'll find all the explanations, figures, references, and much more in the book (to be released later this summer).\n", "\n", "> [IPython Cookbook](http://ipython-books.github.io/), by [Cyrille Rossant](http://cyrille.rossant.net), Packt Publishing, 2014 (500 pages)." ] } ], "metadata": {} } ] }