{ "cells": [ { "cell_type": "markdown", "metadata": { "tags": [ "hide_input" ] }, "source": [ "# Make an Interactive Network Visualization with Bokeh" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This notebook includes code for creating interactive network visualizations with the Python libraries [NetworkX](https://networkx.github.io/) and [Bokeh](https://docs.bokeh.org/en/latest/index.html). The notebook begins with code for a basic network visualization then progressively demonstrates how to add more information and functionality, such as:\n", "\n", "- sizing and coloring nodes by degree\n", "- sizing and coloring nodes by modularity class\n", "- adding responsive highlighting when hovering over nodes and edges\n", "- adding node labels" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Dataset" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### *Game of Thrones*" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "\n", "Lucky it might be, and red it certainly was, but Ygritte’s hair was such a tangle that Jon was tempted to ask her if she only brushed it at the changing of the seasons.\n", "\n", "-George R. R. Martin, *A Song of Ice and Fire*\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Import Libraries" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "import networkx\n", "import matplotlib.pyplot as plt\n", "import numpy as np" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Install and Import Bokeh" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "#!pip install bokeh" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "from bokeh.io import output_notebook, show, save" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To view interactive Bokeh visualizations in a Jupyter notebook, you need to run this cell:" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "
\n", " \n", " Loading BokehJS ...\n", "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": "\n(function(root) {\n function now() {\n return new Date();\n }\n\n var force = true;\n\n if (typeof root._bokeh_onload_callbacks === \"undefined\" || force === true) {\n root._bokeh_onload_callbacks = [];\n root._bokeh_is_loading = undefined;\n }\n\n var JS_MIME_TYPE = 'application/javascript';\n var HTML_MIME_TYPE = 'text/html';\n var EXEC_MIME_TYPE = 'application/vnd.bokehjs_exec.v0+json';\n var CLASS_NAME = 'output_bokeh rendered_html';\n\n /**\n * Render data to the DOM node\n */\n function render(props, node) {\n var script = document.createElement(\"script\");\n node.appendChild(script);\n }\n\n /**\n * Handle when an output is cleared or removed\n */\n function handleClearOutput(event, handle) {\n var cell = handle.cell;\n\n var id = cell.output_area._bokeh_element_id;\n var server_id = cell.output_area._bokeh_server_id;\n // Clean up Bokeh references\n if (id != null && id in Bokeh.index) {\n Bokeh.index[id].model.document.clear();\n delete Bokeh.index[id];\n }\n\n if (server_id !== undefined) {\n // Clean up Bokeh references\n var cmd = \"from bokeh.io.state import curstate; print(curstate().uuid_to_server['\" + server_id + \"'].get_sessions()[0].document.roots[0]._id)\";\n cell.notebook.kernel.execute(cmd, {\n iopub: {\n output: function(msg) {\n var id = msg.content.text.trim();\n if (id in Bokeh.index) {\n Bokeh.index[id].model.document.clear();\n delete Bokeh.index[id];\n }\n }\n }\n });\n // Destroy server and session\n var cmd = \"import bokeh.io.notebook as ion; ion.destroy_server('\" + server_id + \"')\";\n cell.notebook.kernel.execute(cmd);\n }\n }\n\n /**\n * Handle when a new output is added\n */\n function handleAddOutput(event, handle) {\n var output_area = handle.output_area;\n var output = handle.output;\n\n // limit handleAddOutput to display_data with EXEC_MIME_TYPE content only\n if ((output.output_type != \"display_data\") || (!output.data.hasOwnProperty(EXEC_MIME_TYPE))) {\n return\n }\n\n var toinsert = output_area.element.find(\".\" + CLASS_NAME.split(' ')[0]);\n\n if (output.metadata[EXEC_MIME_TYPE][\"id\"] !== undefined) {\n toinsert[toinsert.length - 1].firstChild.textContent = output.data[JS_MIME_TYPE];\n // store reference to embed id on output_area\n output_area._bokeh_element_id = output.metadata[EXEC_MIME_TYPE][\"id\"];\n }\n if (output.metadata[EXEC_MIME_TYPE][\"server_id\"] !== undefined) {\n var bk_div = document.createElement(\"div\");\n bk_div.innerHTML = output.data[HTML_MIME_TYPE];\n var script_attrs = bk_div.children[0].attributes;\n for (var i = 0; i < script_attrs.length; i++) {\n toinsert[toinsert.length - 1].firstChild.setAttribute(script_attrs[i].name, script_attrs[i].value);\n toinsert[toinsert.length - 1].firstChild.textContent = bk_div.children[0].textContent\n }\n // store reference to server id on output_area\n output_area._bokeh_server_id = output.metadata[EXEC_MIME_TYPE][\"server_id\"];\n }\n }\n\n function register_renderer(events, OutputArea) {\n\n function append_mime(data, metadata, element) {\n // create a DOM node to render to\n var toinsert = this.create_output_subarea(\n metadata,\n CLASS_NAME,\n EXEC_MIME_TYPE\n );\n this.keyboard_manager.register_events(toinsert);\n // Render to node\n var props = {data: data, metadata: metadata[EXEC_MIME_TYPE]};\n render(props, toinsert[toinsert.length - 1]);\n element.append(toinsert);\n return toinsert\n }\n\n /* Handle when an output is cleared or removed */\n events.on('clear_output.CodeCell', handleClearOutput);\n events.on('delete.Cell', handleClearOutput);\n\n /* Handle when a new output is added */\n events.on('output_added.OutputArea', handleAddOutput);\n\n /**\n * Register the mime type and append_mime function with output_area\n */\n OutputArea.prototype.register_mime_type(EXEC_MIME_TYPE, append_mime, {\n /* Is output safe? */\n safe: true,\n /* Index of renderer in `output_area.display_order` */\n index: 0\n });\n }\n\n // register the mime type if in Jupyter Notebook environment and previously unregistered\n if (root.Jupyter !== undefined) {\n var events = require('base/js/events');\n var OutputArea = require('notebook/js/outputarea').OutputArea;\n\n if (OutputArea.prototype.mime_types().indexOf(EXEC_MIME_TYPE) == -1) {\n register_renderer(events, OutputArea);\n }\n }\n\n \n if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n root._bokeh_timeout = Date.now() + 5000;\n root._bokeh_failed_load = false;\n }\n\n var NB_LOAD_WARNING = {'data': {'text/html':\n \"
\\n\"+\n \"

\\n\"+\n \"BokehJS does not appear to have successfully loaded. If loading BokehJS from CDN, this \\n\"+\n \"may be due to a slow or bad network connection. Possible fixes:\\n\"+\n \"

\\n\"+\n \"\\n\"+\n \"\\n\"+\n \"from bokeh.resources import INLINE\\n\"+\n \"output_notebook(resources=INLINE)\\n\"+\n \"\\n\"+\n \"
\"}};\n\n function display_loaded() {\n var el = document.getElementById(\"1301\");\n if (el != null) {\n el.textContent = \"BokehJS is loading...\";\n }\n if (root.Bokeh !== undefined) {\n if (el != null) {\n el.textContent = \"BokehJS \" + root.Bokeh.version + \" successfully loaded.\";\n }\n } else if (Date.now() < root._bokeh_timeout) {\n setTimeout(display_loaded, 100)\n }\n }\n\n\n function run_callbacks() {\n try {\n root._bokeh_onload_callbacks.forEach(function(callback) {\n if (callback != null)\n callback();\n });\n } finally {\n delete root._bokeh_onload_callbacks\n }\n console.debug(\"Bokeh: all callbacks have finished\");\n }\n\n function load_libs(css_urls, js_urls, callback) {\n if (css_urls == null) css_urls = [];\n if (js_urls == null) js_urls = [];\n\n root._bokeh_onload_callbacks.push(callback);\n if (root._bokeh_is_loading > 0) {\n console.debug(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n return null;\n }\n if (js_urls == null || js_urls.length === 0) {\n run_callbacks();\n return null;\n }\n console.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n root._bokeh_is_loading = css_urls.length + js_urls.length;\n\n function on_load() {\n root._bokeh_is_loading--;\n if (root._bokeh_is_loading === 0) {\n console.debug(\"Bokeh: all BokehJS libraries/stylesheets loaded\");\n run_callbacks()\n }\n }\n\n function on_error() {\n console.error(\"failed to load \" + url);\n }\n\n for (var i = 0; i < css_urls.length; i++) {\n var url = css_urls[i];\n const element = document.createElement(\"link\");\n element.onload = on_load;\n element.onerror = on_error;\n element.rel = \"stylesheet\";\n element.type = \"text/css\";\n element.href = url;\n console.debug(\"Bokeh: injecting link tag for BokehJS stylesheet: \", url);\n document.body.appendChild(element);\n }\n\n const hashes = {\"https://cdn.bokeh.org/bokeh/release/bokeh-2.1.0.min.js\": \"YobFyzPeVUsFQydHkJGsJL1kyfHnWxOlPc3EwaV22TmBaeGoXHLWx5aRRVPS9xlE\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-2.1.0.min.js\": \"NuAg9+TcTQQqvQCTtkCneRrpkTiMhhfiq0KHiBzx8ECiKiLWXHN6i6ia3q7b3eHu\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-2.1.0.min.js\": \"uMVqQc8JqHitD67bXTn9a06Mrk3EiHRaZ18EJENQenAKJ/KL71SakdXYomZQpGRr\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-2.1.0.min.js\": \"u+eGuEXC8aw0VSCm2mH+b/tQEAitUOYiR1H6SuIVEdUmXsf4vN8m/SmXpmjb7U/X\"};\n\n for (var i = 0; i < js_urls.length; i++) {\n var url = js_urls[i];\n var element = document.createElement('script');\n element.onload = on_load;\n element.onerror = on_error;\n element.async = false;\n element.src = url;\n if (url in hashes) {\n element.crossOrigin = \"anonymous\";\n element.integrity = \"sha384-\" + hashes[url];\n }\n console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n document.head.appendChild(element);\n }\n };\n\n function inject_raw_css(css) {\n const element = document.createElement(\"style\");\n element.appendChild(document.createTextNode(css));\n document.body.appendChild(element);\n }\n\n \n var js_urls = [\"https://cdn.bokeh.org/bokeh/release/bokeh-2.1.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-2.1.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-2.1.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-2.1.0.min.js\"];\n var css_urls = [];\n \n\n var inline_js = [\n function(Bokeh) {\n Bokeh.set_log_level(\"info\");\n },\n function(Bokeh) {\n \n \n }\n ];\n\n function run_inline_js() {\n \n if (root.Bokeh !== undefined || force === true) {\n \n for (var i = 0; i < inline_js.length; i++) {\n inline_js[i].call(root, root.Bokeh);\n }\n if (force === true) {\n display_loaded();\n }} else if (Date.now() < root._bokeh_timeout) {\n setTimeout(run_inline_js, 100);\n } else if (!root._bokeh_failed_load) {\n console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n root._bokeh_failed_load = true;\n } else if (force !== true) {\n var cell = $(document.getElementById(\"1301\")).parents('.cell').data().cell;\n cell.output_area.append_execute_result(NB_LOAD_WARNING)\n }\n\n }\n\n if (root._bokeh_is_loading === 0) {\n console.debug(\"Bokeh: BokehJS loaded, going straight to plotting\");\n run_inline_js();\n } else {\n load_libs(css_urls, js_urls, function() {\n console.debug(\"Bokeh: BokehJS plotting callback run at\", now());\n run_inline_js();\n });\n }\n}(window));", "application/vnd.bokehjs_load.v0+json": "" }, "metadata": {}, "output_type": "display_data" } ], "source": [ "output_notebook()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Create Network From Pandas DataFrame" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We read in a CSV file of *Game of Thrones* network data from Andrew Beveridge and Jie Shan's paper, [\"Network of Thrones.\"](https://www.maa.org/sites/default/files/pdf/Mathhorizons/NetworkofThrones%20%281%29.pdf)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ ":::{admonition} Pandas Review\n", ":class: pandasreview\n", " Do you need a refresher or introduction to the Python data analysis library Pandas? Be sure to check out Pandas Basics (1-3) in this textbook!\n", ":::" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "got_df = pd.read_csv('../data/got-edges.csv')" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
SourceTargetWeight
0AemonGrenn5
1AemonSamwell31
2AerysJaime18
3AerysRobert6
4AerysTyrion5
............
347WalderPetyr6
348WalderRoslin6
349WaltonJaime10
350YgritteQhorin7
351YgritteRattleshirt9
\n", "

352 rows × 3 columns

\n", "
" ], "text/plain": [ " Source Target Weight\n", "0 Aemon Grenn 5\n", "1 Aemon Samwell 31\n", "2 Aerys Jaime 18\n", "3 Aerys Robert 6\n", "4 Aerys Tyrion 5\n", ".. ... ... ...\n", "347 Walder Petyr 6\n", "348 Walder Roslin 6\n", "349 Walton Jaime 10\n", "350 Ygritte Qhorin 7\n", "351 Ygritte Rattleshirt 9\n", "\n", "[352 rows x 3 columns]" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "got_df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Then we make a network with `networkx.from_pandas_edgelist()`:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "G = networkx.from_pandas_edgelist(got_df, 'Source', 'Target', 'Weight')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Basic Network " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The code below shows how to make a basic network viz that includes Hover Tooltips (a text box that will display when a user hovers over nodes) as well as Zoom and Pan/Drag functionality.\n", "\n", "For more details about visualizing network graphs with Bokeh, see [the documentation](https://docs.bokeh.org/en/latest/docs/user_guide/graph.html?highlight=networks)." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "from bokeh.io import output_notebook, show, save\n", "from bokeh.models import Range1d, Circle, ColumnDataSource, MultiLine\n", "from bokeh.plotting import figure\n", "from bokeh.plotting import from_networkx" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\n", "\n", "\n", "
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": "(function(root) {\n function embed_document(root) {\n \n var docs_json = {\"55fb56a7-2611-4018-a7e1-7935b9d8f88e\":{\"roots\":{\"references\":[{\"attributes\":{\"below\":[{\"id\":\"1349\"}],\"center\":[{\"id\":\"1352\"},{\"id\":\"1356\"}],\"left\":[{\"id\":\"1353\"}],\"renderers\":[{\"id\":\"1368\"}],\"title\":{\"id\":\"1341\"},\"toolbar\":{\"id\":\"1362\"},\"x_range\":{\"id\":\"1338\"},\"x_scale\":{\"id\":\"1345\"},\"y_range\":{\"id\":\"1339\"},\"y_scale\":{\"id\":\"1347\"}},\"id\":\"1340\",\"subtype\":\"Figure\",\"type\":\"Plot\"},{\"attributes\":{},\"id\":\"1405\",\"type\":\"UnionRenderers\"},{\"attributes\":{\"end\":10.1,\"start\":-10.1},\"id\":\"1339\",\"type\":\"Range1d\"},{\"attributes\":{\"source\":{\"id\":\"1374\"}},\"id\":\"1376\",\"type\":\"CDSView\"},{\"attributes\":{},\"id\":\"1402\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{\"formatter\":{\"id\":\"1402\"},\"ticker\":{\"id\":\"1350\"}},\"id\":\"1349\",\"type\":\"LinearAxis\"},{\"attributes\":{},\"id\":\"1390\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{},\"id\":\"1396\",\"type\":\"NodesOnly\"},{\"attributes\":{},\"id\":\"1345\",\"type\":\"LinearScale\"},{\"attributes\":{},\"id\":\"1357\",\"type\":\"PanTool\"},{\"attributes\":{},\"id\":\"1354\",\"type\":\"BasicTicker\"},{\"attributes\":{\"data\":{\"index\":[\"Aemon\",\"Grenn\",\"Samwell\",\"Aerys\",\"Jaime\",\"Robert\",\"Tyrion\",\"Tywin\",\"Alliser\",\"Mance\",\"Amory\",\"Oberyn\",\"Arya\",\"Anguy\",\"Beric\",\"Bran\",\"Brynden\",\"Cersei\",\"Gendry\",\"Gregor\",\"Joffrey\",\"Jon\",\"Rickon\",\"Roose\",\"Sandor\",\"Thoros\",\"Balon\",\"Loras\",\"Belwas\",\"Barristan\",\"Illyrio\",\"Hodor\",\"Jojen\",\"Luwin\",\"Meera\",\"Nan\",\"Theon\",\"Brienne\",\"Bronn\",\"Podrick\",\"Lothar\",\"Walder\",\"Catelyn\",\"Edmure\",\"Hoster\",\"Jeyne\",\"Lysa\",\"Petyr\",\"Robb\",\"Roslin\",\"Sansa\",\"Stannis\",\"Elia\",\"Ilyn\",\"Meryn\",\"Pycelle\",\"Shae\",\"Varys\",\"Craster\",\"Karl\",\"Daario\",\"Drogo\",\"Irri\",\"Daenerys\",\"Aegon\",\"Jorah\",\"Kraznys\",\"Missandei\",\"Rakharo\",\"Rhaegar\",\"Viserys\",\"Worm\",\"Davos\",\"Cressen\",\"Salladhor\",\"Eddard\",\"Eddison\",\"Gilly\",\"Qyburn\",\"Renly\",\"Tommen\",\"Janos\",\"Bowen\",\"Kevan\",\"Margaery\",\"Myrcella\",\"Dalla\",\"Melisandre\",\"Orell\",\"Qhorin\",\"Rattleshirt\",\"Styr\",\"Val\",\"Ygritte\",\"Jon Arryn\",\"Lancel\",\"Olenna\",\"Marillion\",\"Robert Arryn\",\"Ellaria\",\"Mace\",\"Rickard\",\"Ramsay\",\"Chataya\",\"Shireen\",\"Doran\",\"Walton\"]},\"selected\":{\"id\":\"1404\"},\"selection_policy\":{\"id\":\"1403\"}},\"id\":\"1370\",\"type\":\"ColumnDataSource\"},{\"attributes\":{},\"id\":\"1347\",\"type\":\"LinearScale\"},{\"attributes\":{\"line_alpha\":{\"value\":0.5}},\"id\":\"1383\",\"type\":\"MultiLine\"},{\"attributes\":{},\"id\":\"1360\",\"type\":\"ResetTool\"},{\"attributes\":{\"active_drag\":\"auto\",\"active_inspect\":\"auto\",\"active_multi\":null,\"active_scroll\":{\"id\":\"1358\"},\"active_tap\":\"auto\",\"tools\":[{\"id\":\"1357\"},{\"id\":\"1358\"},{\"id\":\"1359\"},{\"id\":\"1360\"},{\"id\":\"1361\"}]},\"id\":\"1362\",\"type\":\"Toolbar\"},{\"attributes\":{},\"id\":\"1359\",\"type\":\"SaveTool\"},{\"attributes\":{},\"id\":\"1358\",\"type\":\"WheelZoomTool\"},{\"attributes\":{\"data_source\":{\"id\":\"1370\"},\"glyph\":{\"id\":\"1378\"},\"hover_glyph\":null,\"muted_glyph\":null,\"view\":{\"id\":\"1372\"}},\"id\":\"1371\",\"type\":\"GlyphRenderer\"},{\"attributes\":{},\"id\":\"1350\",\"type\":\"BasicTicker\"},{\"attributes\":{},\"id\":\"1403\",\"type\":\"UnionRenderers\"},{\"attributes\":{},\"id\":\"1406\",\"type\":\"Selection\"},{\"attributes\":{\"text\":\"Game of Thrones Network\"},\"id\":\"1341\",\"type\":\"Title\"},{\"attributes\":{\"axis\":{\"id\":\"1349\"},\"ticker\":null},\"id\":\"1352\",\"type\":\"Grid\"},{\"attributes\":{\"axis\":{\"id\":\"1353\"},\"dimension\":1,\"ticker\":null},\"id\":\"1356\",\"type\":\"Grid\"},{\"attributes\":{},\"id\":\"1391\",\"type\":\"NodesOnly\"},{\"attributes\":{\"source\":{\"id\":\"1370\"}},\"id\":\"1372\",\"type\":\"CDSView\"},{\"attributes\":{\"formatter\":{\"id\":\"1390\"},\"ticker\":{\"id\":\"1354\"}},\"id\":\"1353\",\"type\":\"LinearAxis\"},{\"attributes\":{\"edge_renderer\":{\"id\":\"1375\"},\"inspection_policy\":{\"id\":\"1396\"},\"layout_provider\":{\"id\":\"1377\"},\"node_renderer\":{\"id\":\"1371\"},\"selection_policy\":{\"id\":\"1391\"}},\"id\":\"1368\",\"type\":\"GraphRenderer\"},{\"attributes\":{\"data_source\":{\"id\":\"1374\"},\"glyph\":{\"id\":\"1383\"},\"hover_glyph\":null,\"muted_glyph\":null,\"view\":{\"id\":\"1376\"}},\"id\":\"1375\",\"type\":\"GlyphRenderer\"},{\"attributes\":{\"data\":{\"Weight\":[5,31,30,4,4,8,25,43,11,11,52,7,5,6,34,12,36,6,10,5,13,18,6,5,8,11,19,36,6,6,4,88,5,4,6,15,16,11,11,7,17,5,8,31,15,10,13,10,4,16,5,10,5,6,6,5,4,5,4,6,5,9,11,5,5,46,54,5,4,12,77,4,31,5,5,5,4,22,5,5,11,6,9,7,5,25,12,28,11,6,4,21,6,18,39,4,4,12,5,4,16,7,13,14,5,6,4,5,5,15,4,4,6,4,5,9,15,4,69,11,8,7,10,9,7,8,12,5,24,4,6,6,11,23,9,6,5,43,7,6,7,8,5,46,18,18,15,22,4,4,21,8,15,96,46,12,4,54,14,35,11,4,15,23,10,4,5,8,7,4,17,4,5,4,4,6,7,23,10,4,6,4,4,6,4,16,7,5,5,9,7,7,12,5,4,8,7,28,5,5,14,10,9,10,35,8,7,6,4,9,8,4,7,6,31,20,9,16,8,12,54,14,4,8,8,15,7,4,4,4,5,4,4,10,6,4,6,4,7,9,5,8,14,18,10,26,13,20,11,5,35,41,5,33,4,11,7,6,5,19,4,8,4,4,10,12,19,9,26,6,6,16,9,10,8,5,43,6,8,4,5,16,9,32,6,18,5,10,29,9,28,5,28,13,4,7,15,4,6,5,36,9,4,7,4,6,8,32,20,15,7,5,4,4,8,5,4,6,17,4,5,14,7,18,7,6,17,4,8,47,10,26,7,12,8,14,5,7,4,16,30,5,7,5,5,5,7,7,6,7,9,4],\"end\":[\"Grenn\",\"Samwell\",\"Jon\",\"Robert\",\"Stannis\",\"Eddison\",\"Jon\",\"Samwell\",\"Bran\",\"Jojen\",\"Jon\",\"Meera\",\"Melisandre\",\"Bowen\",\"Craster\",\"Eddison\",\"Gilly\",\"Janos\",\"Mance\",\"Qhorin\",\"Stannis\",\"Jaime\",\"Robert\",\"Tyrion\",\"Tywin\",\"Arya\",\"Catelyn\",\"Cersei\",\"Eddard\",\"Balon\",\"Barristan\",\"Brienne\",\"Edmure\",\"Elia\",\"Gregor\",\"Joffrey\",\"Loras\",\"Meryn\",\"Qyburn\",\"Renly\",\"Robert\",\"Stannis\",\"Tommen\",\"Tyrion\",\"Robb\",\"Sansa\",\"Tywin\",\"Walton\",\"Arya\",\"Cersei\",\"Daenerys\",\"Eddard\",\"Jon\",\"Jon Arryn\",\"Rhaegar\",\"Barristan\",\"Renly\",\"Stannis\",\"Thoros\",\"Sandor\",\"Sansa\",\"Tyrion\",\"Tywin\",\"Arya\",\"Catelyn\",\"Cersei\",\"Joffrey\",\"Lysa\",\"Myrcella\",\"Robb\",\"Sansa\",\"Balon\",\"Bronn\",\"Chataya\",\"Doran\",\"Elia\",\"Ellaria\",\"Gregor\",\"Ilyn\",\"Janos\",\"Kevan\",\"Loras\",\"Mace\",\"Margaery\",\"Meryn\",\"Oberyn\",\"Petyr\",\"Podrick\",\"Pycelle\",\"Renly\",\"Sandor\",\"Shae\",\"Stannis\",\"Varys\",\"Tywin\",\"Viserys\",\"Lysa\",\"Robb\",\"Balon\",\"Brynden\",\"Cersei\",\"Gregor\",\"Joffrey\",\"Kevan\",\"Mace\",\"Oberyn\",\"Petyr\",\"Podrick\",\"Pycelle\",\"Stannis\",\"Tommen\",\"Val\",\"Varys\",\"Walder\",\"Mance\",\"Janos\",\"Jon\",\"Janos\",\"Jon\",\"Craster\",\"Dalla\",\"Gilly\",\"Qhorin\",\"Rattleshirt\",\"Styr\",\"Val\",\"Ygritte\",\"Oberyn\",\"Gregor\",\"Joffrey\",\"Ellaria\",\"Mace\",\"Anguy\",\"Beric\",\"Bran\",\"Brynden\",\"Cersei\",\"Gendry\",\"Gregor\",\"Joffrey\",\"Jon\",\"Rickon\",\"Roose\",\"Sandor\",\"Thoros\",\"Eddard\",\"Robb\",\"Sansa\",\"Beric\",\"Gendry\",\"Thoros\",\"Eddard\",\"Sandor\",\"Hodor\",\"Jojen\",\"Jon\",\"Luwin\",\"Meera\",\"Nan\",\"Rickon\",\"Theon\",\"Catelyn\",\"Eddard\",\"Robb\",\"Sansa\",\"Lothar\",\"Walder\",\"Catelyn\",\"Edmure\",\"Rickard\",\"Robb\",\"Catelyn\",\"Brienne\",\"Bronn\",\"Elia\",\"Gregor\",\"Ilyn\",\"Joffrey\",\"Meryn\",\"Pycelle\",\"Sandor\",\"Shae\",\"Varys\",\"Eddard\",\"Lysa\",\"Sansa\",\"Thoros\",\"Sandor\",\"Bronn\",\"Elia\",\"Ilyn\",\"Meryn\",\"Sandor\",\"Joffrey\",\"Ilyn\",\"Kevan\",\"Loras\",\"Margaery\",\"Meryn\",\"Myrcella\",\"Sandor\",\"Stannis\",\"Tommen\",\"Robb\",\"Sansa\",\"Eddard\",\"Craster\",\"Dalla\",\"Eddison\",\"Gilly\",\"Janos\",\"Meera\",\"Melisandre\",\"Orell\",\"Qhorin\",\"Rattleshirt\",\"Stannis\",\"Styr\",\"Theon\",\"Val\",\"Ygritte\",\"Robb\",\"Sansa\",\"Eddard\",\"Theon\",\"Robb\",\"Sansa\",\"Catelyn\",\"Robb\",\"Brienne\",\"Eddard\",\"Ilyn\",\"Meryn\",\"Thoros\",\"Sansa\",\"Loras\",\"Robb\",\"Stannis\",\"Brienne\",\"Margaery\",\"Olenna\",\"Renly\",\"Sansa\",\"Barristan\",\"Illyrio\",\"Daenerys\",\"Jorah\",\"Daenerys\",\"Jorah\",\"Rhaegar\",\"Jojen\",\"Meera\",\"Robb\",\"Meera\",\"Nan\",\"Robb\",\"Catelyn\",\"Robb\",\"Sansa\",\"Podrick\",\"Margaery\",\"Sansa\",\"Edmure\",\"Roslin\",\"Robb\",\"Walder\",\"Catelyn\",\"Edmure\",\"Robb\",\"Petyr\",\"Roslin\",\"Edmure\",\"Hoster\",\"Jeyne\",\"Lysa\",\"Petyr\",\"Robb\",\"Roslin\",\"Sansa\",\"Stannis\",\"Eddard\",\"Roslin\",\"Hoster\",\"Robb\",\"Lysa\",\"Robb\",\"Jon Arryn\",\"Marillion\",\"Petyr\",\"Robert Arryn\",\"Sansa\",\"Robb\",\"Sansa\",\"Eddard\",\"Ramsay\",\"Rickard\",\"Sansa\",\"Stannis\",\"Eddard\",\"Kevan\",\"Margaery\",\"Marillion\",\"Myrcella\",\"Olenna\",\"Renly\",\"Robert Arryn\",\"Shae\",\"Davos\",\"Melisandre\",\"Renly\",\"Rhaegar\",\"Meryn\",\"Varys\",\"Chataya\",\"Varys\",\"Kevan\",\"Renly\",\"Karl\",\"Gilly\",\"Drogo\",\"Irri\",\"Daenerys\",\"Jorah\",\"Daenerys\",\"Irri\",\"Jorah\",\"Daenerys\",\"Missandei\",\"Aegon\",\"Jorah\",\"Kraznys\",\"Missandei\",\"Rakharo\",\"Rhaegar\",\"Viserys\",\"Worm\",\"Rhaegar\",\"Viserys\",\"Cressen\",\"Salladhor\",\"Melisandre\",\"Shireen\",\"Margaery\",\"Myrcella\",\"Margaery\",\"Bowen\",\"Lancel\",\"Val\",\"Rattleshirt\",\"Ygritte\",\"Ygritte\",\"Robert Arryn\"],\"start\":[\"Aemon\",\"Aemon\",\"Aemon\",\"Aemon\",\"Aemon\",\"Grenn\",\"Grenn\",\"Grenn\",\"Samwell\",\"Samwell\",\"Samwell\",\"Samwell\",\"Samwell\",\"Samwell\",\"Samwell\",\"Samwell\",\"Samwell\",\"Samwell\",\"Samwell\",\"Samwell\",\"Samwell\",\"Aerys\",\"Aerys\",\"Aerys\",\"Aerys\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Robert\",\"Robert\",\"Robert\",\"Robert\",\"Robert\",\"Robert\",\"Robert\",\"Robert\",\"Robert\",\"Robert\",\"Robert\",\"Robert\",\"Robert\",\"Robert\",\"Robert\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tywin\",\"Tywin\",\"Tywin\",\"Tywin\",\"Tywin\",\"Tywin\",\"Tywin\",\"Tywin\",\"Tywin\",\"Tywin\",\"Tywin\",\"Tywin\",\"Tywin\",\"Tywin\",\"Tywin\",\"Tywin\",\"Tywin\",\"Tywin\",\"Alliser\",\"Alliser\",\"Alliser\",\"Mance\",\"Mance\",\"Mance\",\"Mance\",\"Mance\",\"Mance\",\"Mance\",\"Mance\",\"Mance\",\"Mance\",\"Amory\",\"Oberyn\",\"Oberyn\",\"Oberyn\",\"Oberyn\",\"Arya\",\"Arya\",\"Arya\",\"Arya\",\"Arya\",\"Arya\",\"Arya\",\"Arya\",\"Arya\",\"Arya\",\"Arya\",\"Arya\",\"Arya\",\"Arya\",\"Arya\",\"Arya\",\"Anguy\",\"Beric\",\"Beric\",\"Beric\",\"Beric\",\"Bran\",\"Bran\",\"Bran\",\"Bran\",\"Bran\",\"Bran\",\"Bran\",\"Bran\",\"Bran\",\"Bran\",\"Bran\",\"Bran\",\"Brynden\",\"Brynden\",\"Brynden\",\"Brynden\",\"Brynden\",\"Brynden\",\"Cersei\",\"Cersei\",\"Cersei\",\"Cersei\",\"Cersei\",\"Cersei\",\"Cersei\",\"Cersei\",\"Cersei\",\"Cersei\",\"Cersei\",\"Cersei\",\"Cersei\",\"Cersei\",\"Cersei\",\"Gendry\",\"Gendry\",\"Gregor\",\"Gregor\",\"Gregor\",\"Gregor\",\"Gregor\",\"Gregor\",\"Joffrey\",\"Joffrey\",\"Joffrey\",\"Joffrey\",\"Joffrey\",\"Joffrey\",\"Joffrey\",\"Joffrey\",\"Joffrey\",\"Joffrey\",\"Joffrey\",\"Jon\",\"Jon\",\"Jon\",\"Jon\",\"Jon\",\"Jon\",\"Jon\",\"Jon\",\"Jon\",\"Jon\",\"Jon\",\"Jon\",\"Jon\",\"Jon\",\"Jon\",\"Jon\",\"Jon\",\"Jon\",\"Rickon\",\"Rickon\",\"Rickon\",\"Rickon\",\"Roose\",\"Roose\",\"Roose\",\"Sandor\",\"Sandor\",\"Sandor\",\"Sandor\",\"Sandor\",\"Balon\",\"Balon\",\"Balon\",\"Loras\",\"Loras\",\"Loras\",\"Loras\",\"Loras\",\"Belwas\",\"Belwas\",\"Belwas\",\"Belwas\",\"Barristan\",\"Barristan\",\"Barristan\",\"Hodor\",\"Hodor\",\"Hodor\",\"Jojen\",\"Luwin\",\"Theon\",\"Brienne\",\"Brienne\",\"Brienne\",\"Bronn\",\"Podrick\",\"Podrick\",\"Lothar\",\"Lothar\",\"Lothar\",\"Lothar\",\"Walder\",\"Walder\",\"Walder\",\"Walder\",\"Walder\",\"Catelyn\",\"Catelyn\",\"Catelyn\",\"Catelyn\",\"Catelyn\",\"Catelyn\",\"Catelyn\",\"Catelyn\",\"Catelyn\",\"Catelyn\",\"Edmure\",\"Edmure\",\"Edmure\",\"Hoster\",\"Jeyne\",\"Lysa\",\"Lysa\",\"Lysa\",\"Lysa\",\"Lysa\",\"Petyr\",\"Petyr\",\"Robb\",\"Robb\",\"Robb\",\"Robb\",\"Robb\",\"Sansa\",\"Sansa\",\"Sansa\",\"Sansa\",\"Sansa\",\"Sansa\",\"Sansa\",\"Sansa\",\"Sansa\",\"Stannis\",\"Stannis\",\"Stannis\",\"Elia\",\"Ilyn\",\"Pycelle\",\"Shae\",\"Shae\",\"Varys\",\"Varys\",\"Craster\",\"Craster\",\"Daario\",\"Daario\",\"Daario\",\"Daario\",\"Drogo\",\"Drogo\",\"Drogo\",\"Irri\",\"Irri\",\"Daenerys\",\"Daenerys\",\"Daenerys\",\"Daenerys\",\"Daenerys\",\"Daenerys\",\"Daenerys\",\"Daenerys\",\"Jorah\",\"Rhaegar\",\"Davos\",\"Davos\",\"Davos\",\"Davos\",\"Renly\",\"Tommen\",\"Tommen\",\"Janos\",\"Kevan\",\"Dalla\",\"Qhorin\",\"Qhorin\",\"Rattleshirt\",\"Marillion\"]},\"selected\":{\"id\":\"1406\"},\"selection_policy\":{\"id\":\"1405\"}},\"id\":\"1374\",\"type\":\"ColumnDataSource\"},{\"attributes\":{\"end\":10.1,\"start\":-10.1},\"id\":\"1338\",\"type\":\"Range1d\"},{\"attributes\":{\"graph_layout\":{\"Aegon\":[-5.471391687803692,-8.79473403184434],\"Aemon\":[1.0880041367333528,-1.8511422462433573],\"Aerys\":[0.8112183594626479,1.477926881787916],\"Alliser\":[1.3183792490718205,-4.587511703280683],\"Amory\":[1.8993944654058528,9.813927664155145],\"Anguy\":[-3.6293912016478904,-0.4454564193450338],\"Arya\":[-0.22071696807010305,0.9437689630351308],\"Balon\":[1.5039023425690252,2.5168746169638534],\"Barristan\":[-3.0036377455131924,-3.0135919150738903],\"Belwas\":[-5.282642752897932,-6.246930675751085],\"Beric\":[-2.368490699057986,0.2012981530489835],\"Bowen\":[0.7106380048078261,-5.0622430092585455],\"Bran\":[3.1332029694472343,-0.21653785923876856],\"Brienne\":[1.664370406114431,3.1470430686736375],\"Bronn\":[-1.415294158077269,5.642028541279687],\"Brynden\":[1.31884410609121,1.0417588115153196],\"Catelyn\":[0.44317077865007687,1.9000367406173893],\"Cersei\":[-0.4521490168584823,3.1547841410852637],\"Chataya\":[1.9355395639578035,6.872099324283062],\"Craster\":[2.4559836700922038,-6.16273430292443],\"Cressen\":[-9.106142814629763,0.9189989680732561],\"Daario\":[-4.18303032263374,-8.240270556050062],\"Daenerys\":[-3.0500707056661844,-6.381284444042603],\"Dalla\":[2.0277933428917825,-4.156674080285365],\"Davos\":[-5.74661384280545,-0.2639320954763461],\"Doran\":[3.0037786379785425,6.557661483677016],\"Drogo\":[-3.5333096657161898,-8.300082396325832],\"Eddard\":[0.4894240982078481,0.5302840048368175],\"Eddison\":[4.291781799071814,-3.926010813647025],\"Edmure\":[-0.918169405682267,1.4205356063635515],\"Elia\":[-1.783938552122317,0.982031910813363],\"Ellaria\":[0.7526695828875497,7.45712812355062],\"Gendry\":[-3.4896243284722783,1.0975488260628277],\"Gilly\":[2.355809655337752,-5.272959847608846],\"Gregor\":[-0.9573203353484443,3.6975811818507807],\"Grenn\":[3.29507823657533,-3.434298779360115],\"Hodor\":[4.800080016422409,-0.5224414780513176],\"Hoster\":[-2.8398164546649816,2.71182791872119],\"Illyrio\":[-7.756639055917073,-8.351802960054068],\"Ilyn\":[-1.8479505796665316,4.412115151333038],\"Irri\":[-3.3475805234633462,-9.322459213919306],\"Jaime\":[-0.3930716920590243,2.227593137932788],\"Janos\":[1.0247770126624927,-2.2978174335259074],\"Jeyne\":[3.6902502379247593,2.544495870859296],\"Joffrey\":[0.004743634985092771,3.6682566298621126],\"Jojen\":[5.025006249791111,-2.1139195434999833],\"Jon\":[2.1070400068641413,-2.362824195903871],\"Jon Arryn\":[-4.102973863383551,1.7701222641338683],\"Jorah\":[-3.84664017148275,-5.989453516559662],\"Karl\":[3.0400322283703227,-9.579661193966409],\"Kevan\":[2.4476580797909397,4.840302116192239],\"Kraznys\":[-1.619519268860607,-9.575517543944773],\"Lancel\":[5.31061675303325,7.401639462982759],\"Loras\":[0.7175906405917611,4.29041263466536],\"Lothar\":[-0.656240602309351,0.3756386360533775],\"Luwin\":[6.94130072144349,-0.22593021243822314],\"Lysa\":[-1.9066141978443798,3.3063992267496856],\"Mace\":[2.082983594274261,5.618048594255582],\"Mance\":[2.6265483722414094,-4.409021715226423],\"Margaery\":[0.10134011116413387,4.898579531002471],\"Marillion\":[-3.2011361400752643,4.631015876313744],\"Meera\":[4.278556068784148,-2.184457519592892],\"Melisandre\":[-1.2829665143411735,-1.8819715059723254],\"Meryn\":[-1.7170295467754983,3.9215684505051036],\"Missandei\":[-2.5268959659162133,-9.869441423617136],\"Myrcella\":[-0.35079970136720473,5.7059198350492615],\"Nan\":[6.8827090236823105,-1.0027599017349433],\"Oberyn\":[0.8434988035554674,6.136818195298143],\"Olenna\":[0.08274404976250412,6.627488318499719],\"Orell\":[5.555435536684879,-4.421745398349609],\"Petyr\":[-0.6584338139272493,2.5553151413702713],\"Podrick\":[-0.33528487666895546,5.1849511783122],\"Pycelle\":[0.8200589244302984,5.220036343830851],\"Qhorin\":[3.6035277106775006,-4.715699810451377],\"Qyburn\":[3.3174543345871466,4.312935370623524],\"Rakharo\":[-3.9187549763993195,-10.0],\"Ramsay\":[5.645780222875033,2.245219212593813],\"Rattleshirt\":[4.386546501073245,-5.0626097137445845],\"Renly\":[-0.14065038109242245,2.7747856593221245],\"Rhaegar\":[-2.6302728048409514,-3.184673220620182],\"Rickard\":[4.255228598753126,1.453400634614106],\"Rickon\":[2.2143975096229047,0.582822422838809],\"Robb\":[1.791203908409237,1.3086210222930734],\"Robert\":[-1.0467030111805251,-0.22790134075260984],\"Robert Arryn\":[-2.797443563719646,5.184988665067699],\"Roose\":[2.5189123687984094,2.0295725725370555],\"Roslin\":[-2.231092590193489,1.3938618641017084],\"Salladhor\":[-9.305674721308486,0.0982502413257527],\"Samwell\":[2.187078356098845,-3.0682542038267266],\"Sandor\":[-1.5740604807564675,2.1533066937613037],\"Sansa\":[0.2892693042442731,2.8092572353850622],\"Shae\":[1.3634378520840165,5.19645843996409],\"Shireen\":[-9.19309266683895,-0.7657472552394785],\"Stannis\":[-0.1926916732934676,0.31106971312456905],\"Styr\":[3.271323528358963,-5.871165892211247],\"Theon\":[3.6599454666356332,-0.6007591003860638],\"Thoros\":[-2.961645003672398,0.43279527779629007],\"Tommen\":[-0.871599364353942,4.90899890293593],\"Tyrion\":[0.2674143989944235,3.272054642149686],\"Tywin\":[0.6815452370564289,2.910403214342184],\"Val\":[1.7382716140743584,-1.691182163101251],\"Varys\":[1.4445191716696504,4.439447994998577],\"Viserys\":[-1.8749448708073093,-2.1001084681436537],\"Walder\":[-0.19863386423190718,1.4468425917654861],\"Walton\":[-2.7236236754596606,6.073628309911164],\"Worm\":[-4.779323940500883,-9.509709681748271],\"Ygritte\":[3.9239252045497155,-5.495151424710091]}},\"id\":\"1377\",\"type\":\"StaticLayoutProvider\"},{\"attributes\":{\"fill_color\":{\"value\":\"skyblue\"},\"size\":{\"units\":\"screen\",\"value\":15}},\"id\":\"1378\",\"type\":\"Circle\"},{\"attributes\":{\"callback\":null,\"tooltips\":[[\"Character\",\"@index\"]]},\"id\":\"1361\",\"type\":\"HoverTool\"},{\"attributes\":{},\"id\":\"1404\",\"type\":\"Selection\"}],\"root_ids\":[\"1340\"]},\"title\":\"Bokeh Application\",\"version\":\"2.1.0\"}};\n var render_items = [{\"docid\":\"55fb56a7-2611-4018-a7e1-7935b9d8f88e\",\"root_ids\":[\"1340\"],\"roots\":{\"1340\":\"b3019bfd-80f1-49ea-bad4-caf8514e76de\"}}];\n root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n\n }\n if (root.Bokeh !== undefined) {\n embed_document(root);\n } else {\n var attempts = 0;\n var timer = setInterval(function(root) {\n if (root.Bokeh !== undefined) {\n clearInterval(timer);\n embed_document(root);\n } else {\n attempts++;\n if (attempts > 100) {\n clearInterval(timer);\n console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n }\n }\n }, 10, root)\n }\n})(window);", "application/vnd.bokehjs_exec.v0+json": "" }, "metadata": { "application/vnd.bokehjs_exec.v0+json": { "id": "1340" } }, "output_type": "display_data" } ], "source": [ "#Choose a title!\n", "title = 'Game of Thrones Network'\n", "\n", "#Establish which categories will appear when hovering over each node\n", "HOVER_TOOLTIPS = [(\"Character\", \"@index\")]\n", "\n", "#Create a plot — set dimensions, toolbar, and title\n", "plot = figure(tooltips = HOVER_TOOLTIPS,\n", " tools=\"pan,wheel_zoom,save,reset\", active_scroll='wheel_zoom',\n", " x_range=Range1d(-10.1, 10.1), y_range=Range1d(-10.1, 10.1), title=title)\n", "\n", "#Create a network graph object with spring layout\n", "# https://networkx.github.io/documentation/networkx-1.9/reference/generated/networkx.drawing.layout.spring_layout.html\n", "network_graph = from_networkx(G, networkx.spring_layout, scale=10, center=(0, 0))\n", "\n", "#Set node size and color\n", "network_graph.node_renderer.glyph = Circle(size=15, fill_color='skyblue')\n", "\n", "#Set edge opacity and width\n", "network_graph.edge_renderer.glyph = MultiLine(line_alpha=0.5, line_width=1)\n", "\n", "#Add network graph to the plot\n", "plot.renderers.append(network_graph)\n", "\n", "show(plot)\n", "#save(plot, filename=f\"{title}.html\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Network with Nodes Sized and Colored By Attribute (Degree)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The code below shows how to size and color nodes by degree." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Include Bokeh color palettes**" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "from bokeh.io import output_notebook, show, save\n", "from bokeh.models import Range1d, Circle, ColumnDataSource, MultiLine\n", "from bokeh.plotting import figure\n", "from bokeh.plotting import from_networkx\n", "from bokeh.palettes import Blues8, Reds8, Purples8, Oranges8, Viridis8, Spectral8\n", "from bokeh.transform import linear_cmap" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Calculate degree for each node and add as node attribute**" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "degrees = dict(networkx.degree(G))\n", "networkx.set_node_attributes(G, name='degree', values=degrees)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Slightly adjust degree so that the nodes with very small degrees are still visible**" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "number_to_adjust_by = 5\n", "adjusted_node_size = dict([(node, degree+number_to_adjust_by) for node, degree in networkx.degree(G)])\n", "networkx.set_node_attributes(G, name='adjusted_node_size', values=adjusted_node_size)" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\n", "\n", "\n", "
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": "(function(root) {\n function embed_document(root) {\n \n var docs_json = {\"b069919a-5f03-4def-9882-12fb79612b39\":{\"roots\":{\"references\":[{\"attributes\":{\"below\":[{\"id\":\"1313\"}],\"center\":[{\"id\":\"1316\"},{\"id\":\"1320\"}],\"left\":[{\"id\":\"1317\"}],\"renderers\":[{\"id\":\"1332\"}],\"title\":{\"id\":\"1305\"},\"toolbar\":{\"id\":\"1326\"},\"x_range\":{\"id\":\"1302\"},\"x_scale\":{\"id\":\"1309\"},\"y_range\":{\"id\":\"1303\"},\"y_scale\":{\"id\":\"1311\"}},\"id\":\"1304\",\"subtype\":\"Figure\",\"type\":\"Plot\"},{\"attributes\":{\"axis\":{\"id\":\"1317\"},\"dimension\":1,\"ticker\":null},\"id\":\"1320\",\"type\":\"Grid\"},{\"attributes\":{},\"id\":\"1309\",\"type\":\"LinearScale\"},{\"attributes\":{\"end\":10.1,\"start\":-10.1},\"id\":\"1302\",\"type\":\"Range1d\"},{\"attributes\":{\"formatter\":{\"id\":\"1375\"},\"ticker\":{\"id\":\"1318\"}},\"id\":\"1317\",\"type\":\"LinearAxis\"},{\"attributes\":{},\"id\":\"1377\",\"type\":\"UnionRenderers\"},{\"attributes\":{\"edge_renderer\":{\"id\":\"1339\"},\"inspection_policy\":{\"id\":\"1371\"},\"layout_provider\":{\"id\":\"1341\"},\"node_renderer\":{\"id\":\"1335\"},\"selection_policy\":{\"id\":\"1366\"}},\"id\":\"1332\",\"type\":\"GraphRenderer\"},{\"attributes\":{},\"id\":\"1318\",\"type\":\"BasicTicker\"},{\"attributes\":{\"line_alpha\":{\"value\":0.5}},\"id\":\"1356\",\"type\":\"MultiLine\"},{\"attributes\":{\"data_source\":{\"id\":\"1338\"},\"glyph\":{\"id\":\"1356\"},\"hover_glyph\":null,\"muted_glyph\":null,\"view\":{\"id\":\"1340\"}},\"id\":\"1339\",\"type\":\"GlyphRenderer\"},{\"attributes\":{\"source\":{\"id\":\"1338\"}},\"id\":\"1340\",\"type\":\"CDSView\"},{\"attributes\":{\"callback\":null,\"tooltips\":[[\"Character\",\"@index\"],[\"Degree\",\"@degree\"]]},\"id\":\"1325\",\"type\":\"HoverTool\"},{\"attributes\":{},\"id\":\"1375\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{\"data\":{\"adjusted_node_size\":[10,9,20,9,29,23,41,27,8,17,6,12,24,7,11,19,13,25,9,17,23,31,11,9,18,10,11,14,9,11,6,9,9,7,10,7,9,12,9,10,10,13,23,13,8,7,15,12,30,9,31,19,10,11,12,9,10,12,10,6,9,9,9,19,6,11,6,7,6,11,8,6,10,6,6,17,8,9,6,13,10,11,7,11,12,9,8,9,6,10,9,7,9,9,7,6,7,8,8,7,8,7,6,7,6,6,6],\"degree\":[5,4,15,4,24,18,36,22,3,12,1,7,19,2,6,14,8,20,4,12,18,26,6,4,13,5,6,9,4,6,1,4,4,2,5,2,4,7,4,5,5,8,18,8,3,2,10,7,25,4,26,14,5,6,7,4,5,7,5,1,4,4,4,14,1,6,1,2,1,6,3,1,5,1,1,12,3,4,1,8,5,6,2,6,7,4,3,4,1,5,4,2,4,4,2,1,2,3,3,2,3,2,1,2,1,1,1],\"index\":[\"Aemon\",\"Grenn\",\"Samwell\",\"Aerys\",\"Jaime\",\"Robert\",\"Tyrion\",\"Tywin\",\"Alliser\",\"Mance\",\"Amory\",\"Oberyn\",\"Arya\",\"Anguy\",\"Beric\",\"Bran\",\"Brynden\",\"Cersei\",\"Gendry\",\"Gregor\",\"Joffrey\",\"Jon\",\"Rickon\",\"Roose\",\"Sandor\",\"Thoros\",\"Balon\",\"Loras\",\"Belwas\",\"Barristan\",\"Illyrio\",\"Hodor\",\"Jojen\",\"Luwin\",\"Meera\",\"Nan\",\"Theon\",\"Brienne\",\"Bronn\",\"Podrick\",\"Lothar\",\"Walder\",\"Catelyn\",\"Edmure\",\"Hoster\",\"Jeyne\",\"Lysa\",\"Petyr\",\"Robb\",\"Roslin\",\"Sansa\",\"Stannis\",\"Elia\",\"Ilyn\",\"Meryn\",\"Pycelle\",\"Shae\",\"Varys\",\"Craster\",\"Karl\",\"Daario\",\"Drogo\",\"Irri\",\"Daenerys\",\"Aegon\",\"Jorah\",\"Kraznys\",\"Missandei\",\"Rakharo\",\"Rhaegar\",\"Viserys\",\"Worm\",\"Davos\",\"Cressen\",\"Salladhor\",\"Eddard\",\"Eddison\",\"Gilly\",\"Qyburn\",\"Renly\",\"Tommen\",\"Janos\",\"Bowen\",\"Kevan\",\"Margaery\",\"Myrcella\",\"Dalla\",\"Melisandre\",\"Orell\",\"Qhorin\",\"Rattleshirt\",\"Styr\",\"Val\",\"Ygritte\",\"Jon Arryn\",\"Lancel\",\"Olenna\",\"Marillion\",\"Robert Arryn\",\"Ellaria\",\"Mace\",\"Rickard\",\"Ramsay\",\"Chataya\",\"Shireen\",\"Doran\",\"Walton\"]},\"selected\":{\"id\":\"1376\"},\"selection_policy\":{\"id\":\"1377\"}},\"id\":\"1334\",\"type\":\"ColumnDataSource\"},{\"attributes\":{\"high\":41,\"low\":6,\"palette\":[\"#084594\",\"#2171b5\",\"#4292c6\",\"#6baed6\",\"#9ecae1\",\"#c6dbef\",\"#deebf7\",\"#f7fbff\"]},\"id\":\"1350\",\"type\":\"LinearColorMapper\"},{\"attributes\":{},\"id\":\"1321\",\"type\":\"PanTool\"},{\"attributes\":{},\"id\":\"1379\",\"type\":\"UnionRenderers\"},{\"attributes\":{},\"id\":\"1311\",\"type\":\"LinearScale\"},{\"attributes\":{},\"id\":\"1366\",\"type\":\"NodesOnly\"},{\"attributes\":{\"data\":{\"Weight\":[5,31,30,4,4,8,25,43,11,11,52,7,5,6,34,12,36,6,10,5,13,18,6,5,8,11,19,36,6,6,4,88,5,4,6,15,16,11,11,7,17,5,8,31,15,10,13,10,4,16,5,10,5,6,6,5,4,5,4,6,5,9,11,5,5,46,54,5,4,12,77,4,31,5,5,5,4,22,5,5,11,6,9,7,5,25,12,28,11,6,4,21,6,18,39,4,4,12,5,4,16,7,13,14,5,6,4,5,5,15,4,4,6,4,5,9,15,4,69,11,8,7,10,9,7,8,12,5,24,4,6,6,11,23,9,6,5,43,7,6,7,8,5,46,18,18,15,22,4,4,21,8,15,96,46,12,4,54,14,35,11,4,15,23,10,4,5,8,7,4,17,4,5,4,4,6,7,23,10,4,6,4,4,6,4,16,7,5,5,9,7,7,12,5,4,8,7,28,5,5,14,10,9,10,35,8,7,6,4,9,8,4,7,6,31,20,9,16,8,12,54,14,4,8,8,15,7,4,4,4,5,4,4,10,6,4,6,4,7,9,5,8,14,18,10,26,13,20,11,5,35,41,5,33,4,11,7,6,5,19,4,8,4,4,10,12,19,9,26,6,6,16,9,10,8,5,43,6,8,4,5,16,9,32,6,18,5,10,29,9,28,5,28,13,4,7,15,4,6,5,36,9,4,7,4,6,8,32,20,15,7,5,4,4,8,5,4,6,17,4,5,14,7,18,7,6,17,4,8,47,10,26,7,12,8,14,5,7,4,16,30,5,7,5,5,5,7,7,6,7,9,4],\"end\":[\"Grenn\",\"Samwell\",\"Jon\",\"Robert\",\"Stannis\",\"Eddison\",\"Jon\",\"Samwell\",\"Bran\",\"Jojen\",\"Jon\",\"Meera\",\"Melisandre\",\"Bowen\",\"Craster\",\"Eddison\",\"Gilly\",\"Janos\",\"Mance\",\"Qhorin\",\"Stannis\",\"Jaime\",\"Robert\",\"Tyrion\",\"Tywin\",\"Arya\",\"Catelyn\",\"Cersei\",\"Eddard\",\"Balon\",\"Barristan\",\"Brienne\",\"Edmure\",\"Elia\",\"Gregor\",\"Joffrey\",\"Loras\",\"Meryn\",\"Qyburn\",\"Renly\",\"Robert\",\"Stannis\",\"Tommen\",\"Tyrion\",\"Robb\",\"Sansa\",\"Tywin\",\"Walton\",\"Arya\",\"Cersei\",\"Daenerys\",\"Eddard\",\"Jon\",\"Jon Arryn\",\"Rhaegar\",\"Barristan\",\"Renly\",\"Stannis\",\"Thoros\",\"Sandor\",\"Sansa\",\"Tyrion\",\"Tywin\",\"Arya\",\"Catelyn\",\"Cersei\",\"Joffrey\",\"Lysa\",\"Myrcella\",\"Robb\",\"Sansa\",\"Balon\",\"Bronn\",\"Chataya\",\"Doran\",\"Elia\",\"Ellaria\",\"Gregor\",\"Ilyn\",\"Janos\",\"Kevan\",\"Loras\",\"Mace\",\"Margaery\",\"Meryn\",\"Oberyn\",\"Petyr\",\"Podrick\",\"Pycelle\",\"Renly\",\"Sandor\",\"Shae\",\"Stannis\",\"Varys\",\"Tywin\",\"Viserys\",\"Lysa\",\"Robb\",\"Balon\",\"Brynden\",\"Cersei\",\"Gregor\",\"Joffrey\",\"Kevan\",\"Mace\",\"Oberyn\",\"Petyr\",\"Podrick\",\"Pycelle\",\"Stannis\",\"Tommen\",\"Val\",\"Varys\",\"Walder\",\"Mance\",\"Janos\",\"Jon\",\"Janos\",\"Jon\",\"Craster\",\"Dalla\",\"Gilly\",\"Qhorin\",\"Rattleshirt\",\"Styr\",\"Val\",\"Ygritte\",\"Oberyn\",\"Gregor\",\"Joffrey\",\"Ellaria\",\"Mace\",\"Anguy\",\"Beric\",\"Bran\",\"Brynden\",\"Cersei\",\"Gendry\",\"Gregor\",\"Joffrey\",\"Jon\",\"Rickon\",\"Roose\",\"Sandor\",\"Thoros\",\"Eddard\",\"Robb\",\"Sansa\",\"Beric\",\"Gendry\",\"Thoros\",\"Eddard\",\"Sandor\",\"Hodor\",\"Jojen\",\"Jon\",\"Luwin\",\"Meera\",\"Nan\",\"Rickon\",\"Theon\",\"Catelyn\",\"Eddard\",\"Robb\",\"Sansa\",\"Lothar\",\"Walder\",\"Catelyn\",\"Edmure\",\"Rickard\",\"Robb\",\"Catelyn\",\"Brienne\",\"Bronn\",\"Elia\",\"Gregor\",\"Ilyn\",\"Joffrey\",\"Meryn\",\"Pycelle\",\"Sandor\",\"Shae\",\"Varys\",\"Eddard\",\"Lysa\",\"Sansa\",\"Thoros\",\"Sandor\",\"Bronn\",\"Elia\",\"Ilyn\",\"Meryn\",\"Sandor\",\"Joffrey\",\"Ilyn\",\"Kevan\",\"Loras\",\"Margaery\",\"Meryn\",\"Myrcella\",\"Sandor\",\"Stannis\",\"Tommen\",\"Robb\",\"Sansa\",\"Eddard\",\"Craster\",\"Dalla\",\"Eddison\",\"Gilly\",\"Janos\",\"Meera\",\"Melisandre\",\"Orell\",\"Qhorin\",\"Rattleshirt\",\"Stannis\",\"Styr\",\"Theon\",\"Val\",\"Ygritte\",\"Robb\",\"Sansa\",\"Eddard\",\"Theon\",\"Robb\",\"Sansa\",\"Catelyn\",\"Robb\",\"Brienne\",\"Eddard\",\"Ilyn\",\"Meryn\",\"Thoros\",\"Sansa\",\"Loras\",\"Robb\",\"Stannis\",\"Brienne\",\"Margaery\",\"Olenna\",\"Renly\",\"Sansa\",\"Barristan\",\"Illyrio\",\"Daenerys\",\"Jorah\",\"Daenerys\",\"Jorah\",\"Rhaegar\",\"Jojen\",\"Meera\",\"Robb\",\"Meera\",\"Nan\",\"Robb\",\"Catelyn\",\"Robb\",\"Sansa\",\"Podrick\",\"Margaery\",\"Sansa\",\"Edmure\",\"Roslin\",\"Robb\",\"Walder\",\"Catelyn\",\"Edmure\",\"Robb\",\"Petyr\",\"Roslin\",\"Edmure\",\"Hoster\",\"Jeyne\",\"Lysa\",\"Petyr\",\"Robb\",\"Roslin\",\"Sansa\",\"Stannis\",\"Eddard\",\"Roslin\",\"Hoster\",\"Robb\",\"Lysa\",\"Robb\",\"Jon Arryn\",\"Marillion\",\"Petyr\",\"Robert Arryn\",\"Sansa\",\"Robb\",\"Sansa\",\"Eddard\",\"Ramsay\",\"Rickard\",\"Sansa\",\"Stannis\",\"Eddard\",\"Kevan\",\"Margaery\",\"Marillion\",\"Myrcella\",\"Olenna\",\"Renly\",\"Robert Arryn\",\"Shae\",\"Davos\",\"Melisandre\",\"Renly\",\"Rhaegar\",\"Meryn\",\"Varys\",\"Chataya\",\"Varys\",\"Kevan\",\"Renly\",\"Karl\",\"Gilly\",\"Drogo\",\"Irri\",\"Daenerys\",\"Jorah\",\"Daenerys\",\"Irri\",\"Jorah\",\"Daenerys\",\"Missandei\",\"Aegon\",\"Jorah\",\"Kraznys\",\"Missandei\",\"Rakharo\",\"Rhaegar\",\"Viserys\",\"Worm\",\"Rhaegar\",\"Viserys\",\"Cressen\",\"Salladhor\",\"Melisandre\",\"Shireen\",\"Margaery\",\"Myrcella\",\"Margaery\",\"Bowen\",\"Lancel\",\"Val\",\"Rattleshirt\",\"Ygritte\",\"Ygritte\",\"Robert Arryn\"],\"start\":[\"Aemon\",\"Aemon\",\"Aemon\",\"Aemon\",\"Aemon\",\"Grenn\",\"Grenn\",\"Grenn\",\"Samwell\",\"Samwell\",\"Samwell\",\"Samwell\",\"Samwell\",\"Samwell\",\"Samwell\",\"Samwell\",\"Samwell\",\"Samwell\",\"Samwell\",\"Samwell\",\"Samwell\",\"Aerys\",\"Aerys\",\"Aerys\",\"Aerys\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Robert\",\"Robert\",\"Robert\",\"Robert\",\"Robert\",\"Robert\",\"Robert\",\"Robert\",\"Robert\",\"Robert\",\"Robert\",\"Robert\",\"Robert\",\"Robert\",\"Robert\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tywin\",\"Tywin\",\"Tywin\",\"Tywin\",\"Tywin\",\"Tywin\",\"Tywin\",\"Tywin\",\"Tywin\",\"Tywin\",\"Tywin\",\"Tywin\",\"Tywin\",\"Tywin\",\"Tywin\",\"Tywin\",\"Tywin\",\"Tywin\",\"Alliser\",\"Alliser\",\"Alliser\",\"Mance\",\"Mance\",\"Mance\",\"Mance\",\"Mance\",\"Mance\",\"Mance\",\"Mance\",\"Mance\",\"Mance\",\"Amory\",\"Oberyn\",\"Oberyn\",\"Oberyn\",\"Oberyn\",\"Arya\",\"Arya\",\"Arya\",\"Arya\",\"Arya\",\"Arya\",\"Arya\",\"Arya\",\"Arya\",\"Arya\",\"Arya\",\"Arya\",\"Arya\",\"Arya\",\"Arya\",\"Arya\",\"Anguy\",\"Beric\",\"Beric\",\"Beric\",\"Beric\",\"Bran\",\"Bran\",\"Bran\",\"Bran\",\"Bran\",\"Bran\",\"Bran\",\"Bran\",\"Bran\",\"Bran\",\"Bran\",\"Bran\",\"Brynden\",\"Brynden\",\"Brynden\",\"Brynden\",\"Brynden\",\"Brynden\",\"Cersei\",\"Cersei\",\"Cersei\",\"Cersei\",\"Cersei\",\"Cersei\",\"Cersei\",\"Cersei\",\"Cersei\",\"Cersei\",\"Cersei\",\"Cersei\",\"Cersei\",\"Cersei\",\"Cersei\",\"Gendry\",\"Gendry\",\"Gregor\",\"Gregor\",\"Gregor\",\"Gregor\",\"Gregor\",\"Gregor\",\"Joffrey\",\"Joffrey\",\"Joffrey\",\"Joffrey\",\"Joffrey\",\"Joffrey\",\"Joffrey\",\"Joffrey\",\"Joffrey\",\"Joffrey\",\"Joffrey\",\"Jon\",\"Jon\",\"Jon\",\"Jon\",\"Jon\",\"Jon\",\"Jon\",\"Jon\",\"Jon\",\"Jon\",\"Jon\",\"Jon\",\"Jon\",\"Jon\",\"Jon\",\"Jon\",\"Jon\",\"Jon\",\"Rickon\",\"Rickon\",\"Rickon\",\"Rickon\",\"Roose\",\"Roose\",\"Roose\",\"Sandor\",\"Sandor\",\"Sandor\",\"Sandor\",\"Sandor\",\"Balon\",\"Balon\",\"Balon\",\"Loras\",\"Loras\",\"Loras\",\"Loras\",\"Loras\",\"Belwas\",\"Belwas\",\"Belwas\",\"Belwas\",\"Barristan\",\"Barristan\",\"Barristan\",\"Hodor\",\"Hodor\",\"Hodor\",\"Jojen\",\"Luwin\",\"Theon\",\"Brienne\",\"Brienne\",\"Brienne\",\"Bronn\",\"Podrick\",\"Podrick\",\"Lothar\",\"Lothar\",\"Lothar\",\"Lothar\",\"Walder\",\"Walder\",\"Walder\",\"Walder\",\"Walder\",\"Catelyn\",\"Catelyn\",\"Catelyn\",\"Catelyn\",\"Catelyn\",\"Catelyn\",\"Catelyn\",\"Catelyn\",\"Catelyn\",\"Catelyn\",\"Edmure\",\"Edmure\",\"Edmure\",\"Hoster\",\"Jeyne\",\"Lysa\",\"Lysa\",\"Lysa\",\"Lysa\",\"Lysa\",\"Petyr\",\"Petyr\",\"Robb\",\"Robb\",\"Robb\",\"Robb\",\"Robb\",\"Sansa\",\"Sansa\",\"Sansa\",\"Sansa\",\"Sansa\",\"Sansa\",\"Sansa\",\"Sansa\",\"Sansa\",\"Stannis\",\"Stannis\",\"Stannis\",\"Elia\",\"Ilyn\",\"Pycelle\",\"Shae\",\"Shae\",\"Varys\",\"Varys\",\"Craster\",\"Craster\",\"Daario\",\"Daario\",\"Daario\",\"Daario\",\"Drogo\",\"Drogo\",\"Drogo\",\"Irri\",\"Irri\",\"Daenerys\",\"Daenerys\",\"Daenerys\",\"Daenerys\",\"Daenerys\",\"Daenerys\",\"Daenerys\",\"Daenerys\",\"Jorah\",\"Rhaegar\",\"Davos\",\"Davos\",\"Davos\",\"Davos\",\"Renly\",\"Tommen\",\"Tommen\",\"Janos\",\"Kevan\",\"Dalla\",\"Qhorin\",\"Qhorin\",\"Rattleshirt\",\"Marillion\"]},\"selected\":{\"id\":\"1378\"},\"selection_policy\":{\"id\":\"1379\"}},\"id\":\"1338\",\"type\":\"ColumnDataSource\"},{\"attributes\":{},\"id\":\"1322\",\"type\":\"WheelZoomTool\"},{\"attributes\":{},\"id\":\"1371\",\"type\":\"NodesOnly\"},{\"attributes\":{},\"id\":\"1323\",\"type\":\"SaveTool\"},{\"attributes\":{},\"id\":\"1314\",\"type\":\"BasicTicker\"},{\"attributes\":{},\"id\":\"1324\",\"type\":\"ResetTool\"},{\"attributes\":{},\"id\":\"1376\",\"type\":\"Selection\"},{\"attributes\":{\"end\":10.1,\"start\":-10.1},\"id\":\"1303\",\"type\":\"Range1d\"},{\"attributes\":{},\"id\":\"1373\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{\"axis\":{\"id\":\"1313\"},\"ticker\":null},\"id\":\"1316\",\"type\":\"Grid\"},{\"attributes\":{\"fill_color\":{\"field\":\"adjusted_node_size\",\"transform\":{\"id\":\"1350\"}},\"size\":{\"field\":\"adjusted_node_size\",\"units\":\"screen\"}},\"id\":\"1351\",\"type\":\"Circle\"},{\"attributes\":{\"data_source\":{\"id\":\"1334\"},\"glyph\":{\"id\":\"1351\"},\"hover_glyph\":null,\"muted_glyph\":null,\"view\":{\"id\":\"1336\"}},\"id\":\"1335\",\"type\":\"GlyphRenderer\"},{\"attributes\":{\"source\":{\"id\":\"1334\"}},\"id\":\"1336\",\"type\":\"CDSView\"},{\"attributes\":{\"graph_layout\":{\"Aegon\":[-6.833100876626483,-6.463334511225887],\"Aemon\":[-0.6572016982941653,2.6636161293369915],\"Aerys\":[-0.7645642474780917,-2.10423178595201],\"Alliser\":[-2.781748023265508,3.9116857008230053],\"Amory\":[5.4305596747484275,-5.5292373142133435],\"Anguy\":[4.544735018042875,1.7359390734593882],\"Arya\":[1.6519653953369258,0.6172711567394039],\"Balon\":[0.19858470206306147,-0.17168618886659823],\"Barristan\":[-4.124837888334274,-2.0948457482609437],\"Belwas\":[-7.26722135320973,-2.7345541646531775],\"Beric\":[2.8952357178434243,1.6357207855732212],\"Bowen\":[-2.7412839931456663,4.550395139774437],\"Bran\":[1.4549316779060646,2.714528082221915],\"Brienne\":[1.6459368401275793,-0.4165937507189072],\"Bronn\":[2.9817144204191037,-2.783759234149268],\"Brynden\":[2.0373506287078014,-1.196167787432033],\"Catelyn\":[0.6482134305267547,-0.6691103707542363],\"Cersei\":[1.3694315133274173,-1.3519673492535338],\"Chataya\":[4.179308237082517,-3.5010793210044193],\"Craster\":[-2.6589962674777854,5.790653162525718],\"Cressen\":[7.0606806724323254,6.238535655429179],\"Daario\":[-7.505379342691941,-4.340267351970592],\"Daenerys\":[-5.853339397459092,-3.906844880890499],\"Dalla\":[-2.508743455889569,3.4692591789851828],\"Davos\":[4.465873196461724,5.045345797802367],\"Doran\":[1.4887859659354934,-5.38869476740274],\"Drogo\":[-7.89212649603582,-3.8769415010000343],\"Eddard\":[0.7629915095640858,0.8824805982599613],\"Eddison\":[-0.21126139317513032,5.954206469627569],\"Edmure\":[-0.028675442904860293,-1.8724817177216866],\"Elia\":[-0.9712597000553647,-1.8765931487101168],\"Ellaria\":[3.3660937310147214,-4.568504922616122],\"Gendry\":[3.438922378942051,1.454394492846575],\"Gilly\":[-1.9285712419630578,5.20230448700568],\"Gregor\":[1.772547077578161,-1.551592315552213],\"Grenn\":[-0.5624939921487049,5.015443078447427],\"Hodor\":[1.9695280164432174,3.5633360024552045],\"Hoster\":[-0.7585268208327013,-3.3253685935341646],\"Illyrio\":[-10.0,-2.7643090205016647],\"Ilyn\":[2.9277234525889164,-0.940293708388256],\"Irri\":[-8.133772129567008,-4.83854531464034],\"Jaime\":[-0.1961496602105266,-0.7525081289582576],\"Janos\":[-1.2910165948311099,2.4997477191051134],\"Jeyne\":[-0.8738080528056025,0.6439129594875351],\"Joffrey\":[2.125218815880122,-0.9119266680128834],\"Jojen\":[1.4366292453180047,5.100650931236663],\"Jon\":[-0.5012329406428748,3.4054000149110455],\"Jon Arryn\":[-1.7231723601724869,-3.196801205447322],\"Jorah\":[-6.2463133801929835,-3.2225571458832762],\"Karl\":[-4.53545752974948,8.027298623747852],\"Kevan\":[3.6909645835746074,-1.9801828046073826],\"Kraznys\":[-8.39925174570318,-5.735467693322889],\"Lancel\":[6.758193443180412,-2.95310101216203],\"Loras\":[0.6523604891839999,-1.738967693444243],\"Lothar\":[0.7635323185906144,-2.5314773616780113],\"Luwin\":[2.865466629864206,5.58005147313368],\"Lysa\":[0.5242232790515319,-2.9386712339836385],\"Mace\":[2.506835985108443,-3.7990162450774374],\"Mance\":[-1.8540650510361865,4.503109471067852],\"Margaery\":[2.249492051593688,-1.9346762493143015],\"Marillion\":[1.2684146474048408,-4.282198844540948],\"Meera\":[0.8595008609214737,4.6386119408804944],\"Melisandre\":[1.7016545328516584,4.248793574850684],\"Meryn\":[1.34791850931945,-0.4281488458492923],\"Missandei\":[-7.783415381069575,-5.565918302687073],\"Myrcella\":[3.512881827171789,-1.2425506162474744],\"Nan\":[3.3779327806643558,5.129037309822964],\"Oberyn\":[3.23017299379704,-3.2705489872418245],\"Olenna\":[0.54742844612372,-3.8240780166740413],\"Orell\":[-1.1911905285001398,6.818351990169005],\"Petyr\":[1.2202685107297375,-2.179212486675536],\"Podrick\":[2.2831229584307535,-2.93484974911592],\"Pycelle\":[1.690693644498636,-3.300643220912759],\"Qhorin\":[-1.1758418665099983,5.578097638119502],\"Qyburn\":[-3.145203825302455,-1.0212694070311539],\"Rakharo\":[-7.53647595793208,-6.264322663784485],\"Ramsay\":[4.11265225649799,2.2357343859624277],\"Rattleshirt\":[-1.4295409777511106,6.0723472311515065],\"Renly\":[0.5176546708255868,-1.029628521482084],\"Rhaegar\":[-3.716293975338975,-2.644263630993323],\"Rickard\":[4.10261663621556,-0.1035536328769205],\"Rickon\":[1.8318076895113282,1.7015067323399584],\"Robb\":[1.3089650757602176,0.39070259011017927],\"Robert\":[-0.9630449265298593,-0.6091204034635616],\"Robert Arryn\":[1.852053448202061,-4.220404456421288],\"Roose\":[2.767891120685602,0.4857380954568295],\"Roslin\":[-0.26792763741200837,-3.1633163952241503],\"Salladhor\":[6.076804951606101,7.392507183783967],\"Samwell\":[-0.45742482475778024,4.276564898855511],\"Sandor\":[1.8809262399812874,0.08784052137883429],\"Sansa\":[1.3594077146680186,-0.8862712084952005],\"Shae\":[3.2541088897985957,-2.3520677601470634],\"Shireen\":[6.670438571882664,6.891544863204896],\"Stannis\":[0.9491743395847395,1.4222476262853532],\"Styr\":[-2.198732084790691,6.16020481270035],\"Theon\":[0.9621566939623151,2.853869249655103],\"Thoros\":[1.6921626747358096,1.275765108970699],\"Tommen\":[2.307767034986516,-0.48946569687019215],\"Tyrion\":[1.309037612424299,-1.757667845992529],\"Tywin\":[1.10197437565877,-1.360619176076354],\"Val\":[-1.2867131642593745,1.9701907110896653],\"Varys\":[2.335324967208576,-2.4334257072708176],\"Viserys\":[-2.79178802002403,-3.4255998693151413],\"Walder\":[0.5076159660199256,-2.0863255637558495],\"Walton\":[-3.2469632557271724,-0.17606419290416567],\"Worm\":[-8.817488514758029,-4.578257912526873],\"Ygritte\":[-1.992944724004991,5.75720867708964]}},\"id\":\"1341\",\"type\":\"StaticLayoutProvider\"},{\"attributes\":{\"text\":\"Game of Thrones Network\"},\"id\":\"1305\",\"type\":\"Title\"},{\"attributes\":{\"formatter\":{\"id\":\"1373\"},\"ticker\":{\"id\":\"1314\"}},\"id\":\"1313\",\"type\":\"LinearAxis\"},{\"attributes\":{},\"id\":\"1378\",\"type\":\"Selection\"},{\"attributes\":{\"active_drag\":\"auto\",\"active_inspect\":\"auto\",\"active_multi\":null,\"active_scroll\":{\"id\":\"1322\"},\"active_tap\":\"auto\",\"tools\":[{\"id\":\"1321\"},{\"id\":\"1322\"},{\"id\":\"1323\"},{\"id\":\"1324\"},{\"id\":\"1325\"}]},\"id\":\"1326\",\"type\":\"Toolbar\"}],\"root_ids\":[\"1304\"]},\"title\":\"Bokeh Application\",\"version\":\"2.1.0\"}};\n var render_items = [{\"docid\":\"b069919a-5f03-4def-9882-12fb79612b39\",\"root_ids\":[\"1304\"],\"roots\":{\"1304\":\"0ab88475-078c-4796-a773-234cf1e6226f\"}}];\n root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n\n }\n if (root.Bokeh !== undefined) {\n embed_document(root);\n } else {\n var attempts = 0;\n var timer = setInterval(function(root) {\n if (root.Bokeh !== undefined) {\n clearInterval(timer);\n embed_document(root);\n } else {\n attempts++;\n if (attempts > 100) {\n clearInterval(timer);\n console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n }\n }\n }, 10, root)\n }\n})(window);", "application/vnd.bokehjs_exec.v0+json": "" }, "metadata": { "application/vnd.bokehjs_exec.v0+json": { "id": "1304" } }, "output_type": "display_data" } ], "source": [ "#Choose attributes from G network to size and color by — setting manual size (e.g. 10) or color (e.g. 'skyblue') also allowed\n", "size_by_this_attribute = 'adjusted_node_size'\n", "color_by_this_attribute = 'adjusted_node_size'\n", "\n", "#Pick a color palette — Blues8, Reds8, Purples8, Oranges8, Viridis8\n", "color_palette = Blues8\n", "\n", "#Choose a title!\n", "title = 'Game of Thrones Network'\n", "\n", "#Establish which categories will appear when hovering over each node\n", "HOVER_TOOLTIPS = [\n", " (\"Character\", \"@index\"),\n", " (\"Degree\", \"@degree\")\n", "]\n", "\n", "#Create a plot — set dimensions, toolbar, and title\n", "plot = figure(tooltips = HOVER_TOOLTIPS,\n", " tools=\"pan,wheel_zoom,save,reset\", active_scroll='wheel_zoom',\n", " x_range=Range1d(-10.1, 10.1), y_range=Range1d(-10.1, 10.1), title=title)\n", "\n", "#Create a network graph object\n", "# https://networkx.github.io/documentation/networkx-1.9/reference/generated/networkx.drawing.layout.spring_layout.html\\\n", "network_graph = from_networkx(G, networkx.spring_layout, scale=10, center=(0, 0))\n", "\n", "#Set node sizes and colors according to node degree (color as spectrum of color palette)\n", "minimum_value_color = min(network_graph.node_renderer.data_source.data[color_by_this_attribute])\n", "maximum_value_color = max(network_graph.node_renderer.data_source.data[color_by_this_attribute])\n", "network_graph.node_renderer.glyph = Circle(size=size_by_this_attribute, fill_color=linear_cmap(color_by_this_attribute, color_palette, minimum_value_color, maximum_value_color))\n", "\n", "#Set edge opacity and width\n", "network_graph.edge_renderer.glyph = MultiLine(line_alpha=0.5, line_width=1)\n", "\n", "plot.renderers.append(network_graph)\n", "\n", "show(plot)\n", "#save(plot, filename=f\"{title}.html\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Network with Nodes Colored By Attribute (Community)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The code below shows how to size and color nodes by modularity class." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Include community module**" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "from bokeh.io import output_notebook, show, save\n", "from bokeh.models import Range1d, Circle, ColumnDataSource, MultiLine\n", "from bokeh.plotting import figure\n", "from bokeh.plotting import from_networkx\n", "from bokeh.palettes import Blues8, Reds8, Purples8, Oranges8, Viridis8, Spectral8\n", "from bokeh.transform import linear_cmap\n", "from networkx.algorithms import community" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Calculate degree for each node and add as node attribute**" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "tags": [ "hide-input" ] }, "outputs": [], "source": [ "degrees = dict(networkx.degree(G))\n", "networkx.set_node_attributes(G, name='degree', values=degrees)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Slightly adjust degree so that the nodes with very small degrees are still visible**" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "tags": [ "hide-input" ] }, "outputs": [], "source": [ "number_to_adjust_by = 5\n", "adjusted_node_size = dict([(node, degree+number_to_adjust_by) for node, degree in networkx.degree(G)])\n", "networkx.set_node_attributes(G, name='adjusted_node_size', values=adjusted_node_size)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Calculate communities**" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [], "source": [ "communities = community.greedy_modularity_communities(G)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Add modularity class and color as attributes to network graph**" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [], "source": [ "# Create empty dictionaries\n", "modularity_class = {}\n", "modularity_color = {}\n", "#Loop through each community in the network\n", "for community_number, community in enumerate(communities):\n", " #For each member of the community, add their community number and a distinct color\n", " for name in community: \n", " modularity_class[name] = community_number\n", " modularity_color[name] = Spectral8[community_number]" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [], "source": [ "# Add modularity class and color as attributes from the network above\n", "networkx.set_node_attributes(G, modularity_class, 'modularity_class')\n", "networkx.set_node_attributes(G, modularity_color, 'modularity_color')" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\n", "\n", "\n", "
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": "(function(root) {\n function embed_document(root) {\n \n var docs_json = {\"2c295554-adde-4f52-ad4f-cea981f9b7f6\":{\"roots\":{\"references\":[{\"attributes\":{\"below\":[{\"id\":\"1431\"}],\"center\":[{\"id\":\"1434\"},{\"id\":\"1438\"}],\"left\":[{\"id\":\"1435\"}],\"renderers\":[{\"id\":\"1452\"}],\"title\":{\"id\":\"1423\"},\"toolbar\":{\"id\":\"1445\"},\"x_range\":{\"id\":\"1420\"},\"x_scale\":{\"id\":\"1427\"},\"y_range\":{\"id\":\"1421\"},\"y_scale\":{\"id\":\"1429\"}},\"id\":\"1422\",\"subtype\":\"Figure\",\"type\":\"Plot\"},{\"attributes\":{},\"id\":\"1442\",\"type\":\"ResetTool\"},{\"attributes\":{\"source\":{\"id\":\"1454\"}},\"id\":\"1456\",\"type\":\"CDSView\"},{\"attributes\":{\"callback\":null},\"id\":\"1443\",\"type\":\"TapTool\"},{\"attributes\":{},\"id\":\"1523\",\"type\":\"NodesOnly\"},{\"attributes\":{\"line_alpha\":{\"value\":0.5}},\"id\":\"1467\",\"type\":\"MultiLine\"},{\"attributes\":{},\"id\":\"1527\",\"type\":\"Selection\"},{\"attributes\":{\"data\":{\"adjusted_node_size\":[10,9,20,9,29,23,41,27,8,17,6,12,24,7,11,19,13,25,9,17,23,31,11,9,18,10,11,14,9,11,6,9,9,7,10,7,9,12,9,10,10,13,23,13,8,7,15,12,30,9,31,19,10,11,12,9,10,12,10,6,9,9,9,19,6,11,6,7,6,11,8,6,10,6,6,17,8,9,6,13,10,11,7,11,12,9,8,9,6,10,9,7,9,9,7,6,7,8,8,7,8,7,6,7,6,6,6],\"degree\":[5,4,15,4,24,18,36,22,3,12,1,7,19,2,6,14,8,20,4,12,18,26,6,4,13,5,6,9,4,6,1,4,4,2,5,2,4,7,4,5,5,8,18,8,3,2,10,7,25,4,26,14,5,6,7,4,5,7,5,1,4,4,4,14,1,6,1,2,1,6,3,1,5,1,1,12,3,4,1,8,5,6,2,6,7,4,3,4,1,5,4,2,4,4,2,1,2,3,3,2,3,2,1,2,1,1,1],\"index\":[\"Aemon\",\"Grenn\",\"Samwell\",\"Aerys\",\"Jaime\",\"Robert\",\"Tyrion\",\"Tywin\",\"Alliser\",\"Mance\",\"Amory\",\"Oberyn\",\"Arya\",\"Anguy\",\"Beric\",\"Bran\",\"Brynden\",\"Cersei\",\"Gendry\",\"Gregor\",\"Joffrey\",\"Jon\",\"Rickon\",\"Roose\",\"Sandor\",\"Thoros\",\"Balon\",\"Loras\",\"Belwas\",\"Barristan\",\"Illyrio\",\"Hodor\",\"Jojen\",\"Luwin\",\"Meera\",\"Nan\",\"Theon\",\"Brienne\",\"Bronn\",\"Podrick\",\"Lothar\",\"Walder\",\"Catelyn\",\"Edmure\",\"Hoster\",\"Jeyne\",\"Lysa\",\"Petyr\",\"Robb\",\"Roslin\",\"Sansa\",\"Stannis\",\"Elia\",\"Ilyn\",\"Meryn\",\"Pycelle\",\"Shae\",\"Varys\",\"Craster\",\"Karl\",\"Daario\",\"Drogo\",\"Irri\",\"Daenerys\",\"Aegon\",\"Jorah\",\"Kraznys\",\"Missandei\",\"Rakharo\",\"Rhaegar\",\"Viserys\",\"Worm\",\"Davos\",\"Cressen\",\"Salladhor\",\"Eddard\",\"Eddison\",\"Gilly\",\"Qyburn\",\"Renly\",\"Tommen\",\"Janos\",\"Bowen\",\"Kevan\",\"Margaery\",\"Myrcella\",\"Dalla\",\"Melisandre\",\"Orell\",\"Qhorin\",\"Rattleshirt\",\"Styr\",\"Val\",\"Ygritte\",\"Jon Arryn\",\"Lancel\",\"Olenna\",\"Marillion\",\"Robert Arryn\",\"Ellaria\",\"Mace\",\"Rickard\",\"Ramsay\",\"Chataya\",\"Shireen\",\"Doran\",\"Walton\"],\"modularity_class\":[1,1,1,0,0,3,0,0,1,1,0,0,2,4,4,2,2,2,4,0,0,1,2,2,0,4,0,0,3,3,3,1,1,2,1,2,2,2,0,0,2,2,2,2,2,2,2,2,2,2,2,1,0,0,0,0,0,0,1,1,3,3,3,3,3,3,3,3,3,3,3,3,1,1,1,2,1,1,0,0,0,1,1,0,0,0,1,1,1,1,1,1,1,1,3,0,0,2,2,0,0,2,2,0,1,0,0],\"modularity_color\":[\"#66c2a5\",\"#66c2a5\",\"#66c2a5\",\"#3288bd\",\"#3288bd\",\"#e6f598\",\"#3288bd\",\"#3288bd\",\"#66c2a5\",\"#66c2a5\",\"#3288bd\",\"#3288bd\",\"#abdda4\",\"#fee08b\",\"#fee08b\",\"#abdda4\",\"#abdda4\",\"#abdda4\",\"#fee08b\",\"#3288bd\",\"#3288bd\",\"#66c2a5\",\"#abdda4\",\"#abdda4\",\"#3288bd\",\"#fee08b\",\"#3288bd\",\"#3288bd\",\"#e6f598\",\"#e6f598\",\"#e6f598\",\"#66c2a5\",\"#66c2a5\",\"#abdda4\",\"#66c2a5\",\"#abdda4\",\"#abdda4\",\"#abdda4\",\"#3288bd\",\"#3288bd\",\"#abdda4\",\"#abdda4\",\"#abdda4\",\"#abdda4\",\"#abdda4\",\"#abdda4\",\"#abdda4\",\"#abdda4\",\"#abdda4\",\"#abdda4\",\"#abdda4\",\"#66c2a5\",\"#3288bd\",\"#3288bd\",\"#3288bd\",\"#3288bd\",\"#3288bd\",\"#3288bd\",\"#66c2a5\",\"#66c2a5\",\"#e6f598\",\"#e6f598\",\"#e6f598\",\"#e6f598\",\"#e6f598\",\"#e6f598\",\"#e6f598\",\"#e6f598\",\"#e6f598\",\"#e6f598\",\"#e6f598\",\"#e6f598\",\"#66c2a5\",\"#66c2a5\",\"#66c2a5\",\"#abdda4\",\"#66c2a5\",\"#66c2a5\",\"#3288bd\",\"#3288bd\",\"#3288bd\",\"#66c2a5\",\"#66c2a5\",\"#3288bd\",\"#3288bd\",\"#3288bd\",\"#66c2a5\",\"#66c2a5\",\"#66c2a5\",\"#66c2a5\",\"#66c2a5\",\"#66c2a5\",\"#66c2a5\",\"#66c2a5\",\"#e6f598\",\"#3288bd\",\"#3288bd\",\"#abdda4\",\"#abdda4\",\"#3288bd\",\"#3288bd\",\"#abdda4\",\"#abdda4\",\"#3288bd\",\"#66c2a5\",\"#3288bd\",\"#3288bd\"]},\"selected\":{\"id\":\"1525\"},\"selection_policy\":{\"id\":\"1526\"}},\"id\":\"1454\",\"type\":\"ColumnDataSource\"},{\"attributes\":{\"fill_color\":{\"field\":\"modularity_color\"},\"size\":{\"field\":\"adjusted_node_size\",\"units\":\"screen\"}},\"id\":\"1462\",\"type\":\"Circle\"},{\"attributes\":{},\"id\":\"1440\",\"type\":\"WheelZoomTool\"},{\"attributes\":{\"callback\":null,\"tooltips\":[[\"Character\",\"@index\"],[\"Degree\",\"@degree\"],[\"Modularity Class\",\"@modularity_class\"],[\"Modularity Color\",\"$color[swatch]:modularity_color\"]]},\"id\":\"1444\",\"type\":\"HoverTool\"},{\"attributes\":{\"data\":{\"Weight\":[5,31,30,4,4,8,25,43,11,11,52,7,5,6,34,12,36,6,10,5,13,18,6,5,8,11,19,36,6,6,4,88,5,4,6,15,16,11,11,7,17,5,8,31,15,10,13,10,4,16,5,10,5,6,6,5,4,5,4,6,5,9,11,5,5,46,54,5,4,12,77,4,31,5,5,5,4,22,5,5,11,6,9,7,5,25,12,28,11,6,4,21,6,18,39,4,4,12,5,4,16,7,13,14,5,6,4,5,5,15,4,4,6,4,5,9,15,4,69,11,8,7,10,9,7,8,12,5,24,4,6,6,11,23,9,6,5,43,7,6,7,8,5,46,18,18,15,22,4,4,21,8,15,96,46,12,4,54,14,35,11,4,15,23,10,4,5,8,7,4,17,4,5,4,4,6,7,23,10,4,6,4,4,6,4,16,7,5,5,9,7,7,12,5,4,8,7,28,5,5,14,10,9,10,35,8,7,6,4,9,8,4,7,6,31,20,9,16,8,12,54,14,4,8,8,15,7,4,4,4,5,4,4,10,6,4,6,4,7,9,5,8,14,18,10,26,13,20,11,5,35,41,5,33,4,11,7,6,5,19,4,8,4,4,10,12,19,9,26,6,6,16,9,10,8,5,43,6,8,4,5,16,9,32,6,18,5,10,29,9,28,5,28,13,4,7,15,4,6,5,36,9,4,7,4,6,8,32,20,15,7,5,4,4,8,5,4,6,17,4,5,14,7,18,7,6,17,4,8,47,10,26,7,12,8,14,5,7,4,16,30,5,7,5,5,5,7,7,6,7,9,4],\"end\":[\"Grenn\",\"Samwell\",\"Jon\",\"Robert\",\"Stannis\",\"Eddison\",\"Jon\",\"Samwell\",\"Bran\",\"Jojen\",\"Jon\",\"Meera\",\"Melisandre\",\"Bowen\",\"Craster\",\"Eddison\",\"Gilly\",\"Janos\",\"Mance\",\"Qhorin\",\"Stannis\",\"Jaime\",\"Robert\",\"Tyrion\",\"Tywin\",\"Arya\",\"Catelyn\",\"Cersei\",\"Eddard\",\"Balon\",\"Barristan\",\"Brienne\",\"Edmure\",\"Elia\",\"Gregor\",\"Joffrey\",\"Loras\",\"Meryn\",\"Qyburn\",\"Renly\",\"Robert\",\"Stannis\",\"Tommen\",\"Tyrion\",\"Robb\",\"Sansa\",\"Tywin\",\"Walton\",\"Arya\",\"Cersei\",\"Daenerys\",\"Eddard\",\"Jon\",\"Jon Arryn\",\"Rhaegar\",\"Barristan\",\"Renly\",\"Stannis\",\"Thoros\",\"Sandor\",\"Sansa\",\"Tyrion\",\"Tywin\",\"Arya\",\"Catelyn\",\"Cersei\",\"Joffrey\",\"Lysa\",\"Myrcella\",\"Robb\",\"Sansa\",\"Balon\",\"Bronn\",\"Chataya\",\"Doran\",\"Elia\",\"Ellaria\",\"Gregor\",\"Ilyn\",\"Janos\",\"Kevan\",\"Loras\",\"Mace\",\"Margaery\",\"Meryn\",\"Oberyn\",\"Petyr\",\"Podrick\",\"Pycelle\",\"Renly\",\"Sandor\",\"Shae\",\"Stannis\",\"Varys\",\"Tywin\",\"Viserys\",\"Lysa\",\"Robb\",\"Balon\",\"Brynden\",\"Cersei\",\"Gregor\",\"Joffrey\",\"Kevan\",\"Mace\",\"Oberyn\",\"Petyr\",\"Podrick\",\"Pycelle\",\"Stannis\",\"Tommen\",\"Val\",\"Varys\",\"Walder\",\"Mance\",\"Janos\",\"Jon\",\"Janos\",\"Jon\",\"Craster\",\"Dalla\",\"Gilly\",\"Qhorin\",\"Rattleshirt\",\"Styr\",\"Val\",\"Ygritte\",\"Oberyn\",\"Gregor\",\"Joffrey\",\"Ellaria\",\"Mace\",\"Anguy\",\"Beric\",\"Bran\",\"Brynden\",\"Cersei\",\"Gendry\",\"Gregor\",\"Joffrey\",\"Jon\",\"Rickon\",\"Roose\",\"Sandor\",\"Thoros\",\"Eddard\",\"Robb\",\"Sansa\",\"Beric\",\"Gendry\",\"Thoros\",\"Eddard\",\"Sandor\",\"Hodor\",\"Jojen\",\"Jon\",\"Luwin\",\"Meera\",\"Nan\",\"Rickon\",\"Theon\",\"Catelyn\",\"Eddard\",\"Robb\",\"Sansa\",\"Lothar\",\"Walder\",\"Catelyn\",\"Edmure\",\"Rickard\",\"Robb\",\"Catelyn\",\"Brienne\",\"Bronn\",\"Elia\",\"Gregor\",\"Ilyn\",\"Joffrey\",\"Meryn\",\"Pycelle\",\"Sandor\",\"Shae\",\"Varys\",\"Eddard\",\"Lysa\",\"Sansa\",\"Thoros\",\"Sandor\",\"Bronn\",\"Elia\",\"Ilyn\",\"Meryn\",\"Sandor\",\"Joffrey\",\"Ilyn\",\"Kevan\",\"Loras\",\"Margaery\",\"Meryn\",\"Myrcella\",\"Sandor\",\"Stannis\",\"Tommen\",\"Robb\",\"Sansa\",\"Eddard\",\"Craster\",\"Dalla\",\"Eddison\",\"Gilly\",\"Janos\",\"Meera\",\"Melisandre\",\"Orell\",\"Qhorin\",\"Rattleshirt\",\"Stannis\",\"Styr\",\"Theon\",\"Val\",\"Ygritte\",\"Robb\",\"Sansa\",\"Eddard\",\"Theon\",\"Robb\",\"Sansa\",\"Catelyn\",\"Robb\",\"Brienne\",\"Eddard\",\"Ilyn\",\"Meryn\",\"Thoros\",\"Sansa\",\"Loras\",\"Robb\",\"Stannis\",\"Brienne\",\"Margaery\",\"Olenna\",\"Renly\",\"Sansa\",\"Barristan\",\"Illyrio\",\"Daenerys\",\"Jorah\",\"Daenerys\",\"Jorah\",\"Rhaegar\",\"Jojen\",\"Meera\",\"Robb\",\"Meera\",\"Nan\",\"Robb\",\"Catelyn\",\"Robb\",\"Sansa\",\"Podrick\",\"Margaery\",\"Sansa\",\"Edmure\",\"Roslin\",\"Robb\",\"Walder\",\"Catelyn\",\"Edmure\",\"Robb\",\"Petyr\",\"Roslin\",\"Edmure\",\"Hoster\",\"Jeyne\",\"Lysa\",\"Petyr\",\"Robb\",\"Roslin\",\"Sansa\",\"Stannis\",\"Eddard\",\"Roslin\",\"Hoster\",\"Robb\",\"Lysa\",\"Robb\",\"Jon Arryn\",\"Marillion\",\"Petyr\",\"Robert Arryn\",\"Sansa\",\"Robb\",\"Sansa\",\"Eddard\",\"Ramsay\",\"Rickard\",\"Sansa\",\"Stannis\",\"Eddard\",\"Kevan\",\"Margaery\",\"Marillion\",\"Myrcella\",\"Olenna\",\"Renly\",\"Robert Arryn\",\"Shae\",\"Davos\",\"Melisandre\",\"Renly\",\"Rhaegar\",\"Meryn\",\"Varys\",\"Chataya\",\"Varys\",\"Kevan\",\"Renly\",\"Karl\",\"Gilly\",\"Drogo\",\"Irri\",\"Daenerys\",\"Jorah\",\"Daenerys\",\"Irri\",\"Jorah\",\"Daenerys\",\"Missandei\",\"Aegon\",\"Jorah\",\"Kraznys\",\"Missandei\",\"Rakharo\",\"Rhaegar\",\"Viserys\",\"Worm\",\"Rhaegar\",\"Viserys\",\"Cressen\",\"Salladhor\",\"Melisandre\",\"Shireen\",\"Margaery\",\"Myrcella\",\"Margaery\",\"Bowen\",\"Lancel\",\"Val\",\"Rattleshirt\",\"Ygritte\",\"Ygritte\",\"Robert Arryn\"],\"start\":[\"Aemon\",\"Aemon\",\"Aemon\",\"Aemon\",\"Aemon\",\"Grenn\",\"Grenn\",\"Grenn\",\"Samwell\",\"Samwell\",\"Samwell\",\"Samwell\",\"Samwell\",\"Samwell\",\"Samwell\",\"Samwell\",\"Samwell\",\"Samwell\",\"Samwell\",\"Samwell\",\"Samwell\",\"Aerys\",\"Aerys\",\"Aerys\",\"Aerys\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Robert\",\"Robert\",\"Robert\",\"Robert\",\"Robert\",\"Robert\",\"Robert\",\"Robert\",\"Robert\",\"Robert\",\"Robert\",\"Robert\",\"Robert\",\"Robert\",\"Robert\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tywin\",\"Tywin\",\"Tywin\",\"Tywin\",\"Tywin\",\"Tywin\",\"Tywin\",\"Tywin\",\"Tywin\",\"Tywin\",\"Tywin\",\"Tywin\",\"Tywin\",\"Tywin\",\"Tywin\",\"Tywin\",\"Tywin\",\"Tywin\",\"Alliser\",\"Alliser\",\"Alliser\",\"Mance\",\"Mance\",\"Mance\",\"Mance\",\"Mance\",\"Mance\",\"Mance\",\"Mance\",\"Mance\",\"Mance\",\"Amory\",\"Oberyn\",\"Oberyn\",\"Oberyn\",\"Oberyn\",\"Arya\",\"Arya\",\"Arya\",\"Arya\",\"Arya\",\"Arya\",\"Arya\",\"Arya\",\"Arya\",\"Arya\",\"Arya\",\"Arya\",\"Arya\",\"Arya\",\"Arya\",\"Arya\",\"Anguy\",\"Beric\",\"Beric\",\"Beric\",\"Beric\",\"Bran\",\"Bran\",\"Bran\",\"Bran\",\"Bran\",\"Bran\",\"Bran\",\"Bran\",\"Bran\",\"Bran\",\"Bran\",\"Bran\",\"Brynden\",\"Brynden\",\"Brynden\",\"Brynden\",\"Brynden\",\"Brynden\",\"Cersei\",\"Cersei\",\"Cersei\",\"Cersei\",\"Cersei\",\"Cersei\",\"Cersei\",\"Cersei\",\"Cersei\",\"Cersei\",\"Cersei\",\"Cersei\",\"Cersei\",\"Cersei\",\"Cersei\",\"Gendry\",\"Gendry\",\"Gregor\",\"Gregor\",\"Gregor\",\"Gregor\",\"Gregor\",\"Gregor\",\"Joffrey\",\"Joffrey\",\"Joffrey\",\"Joffrey\",\"Joffrey\",\"Joffrey\",\"Joffrey\",\"Joffrey\",\"Joffrey\",\"Joffrey\",\"Joffrey\",\"Jon\",\"Jon\",\"Jon\",\"Jon\",\"Jon\",\"Jon\",\"Jon\",\"Jon\",\"Jon\",\"Jon\",\"Jon\",\"Jon\",\"Jon\",\"Jon\",\"Jon\",\"Jon\",\"Jon\",\"Jon\",\"Rickon\",\"Rickon\",\"Rickon\",\"Rickon\",\"Roose\",\"Roose\",\"Roose\",\"Sandor\",\"Sandor\",\"Sandor\",\"Sandor\",\"Sandor\",\"Balon\",\"Balon\",\"Balon\",\"Loras\",\"Loras\",\"Loras\",\"Loras\",\"Loras\",\"Belwas\",\"Belwas\",\"Belwas\",\"Belwas\",\"Barristan\",\"Barristan\",\"Barristan\",\"Hodor\",\"Hodor\",\"Hodor\",\"Jojen\",\"Luwin\",\"Theon\",\"Brienne\",\"Brienne\",\"Brienne\",\"Bronn\",\"Podrick\",\"Podrick\",\"Lothar\",\"Lothar\",\"Lothar\",\"Lothar\",\"Walder\",\"Walder\",\"Walder\",\"Walder\",\"Walder\",\"Catelyn\",\"Catelyn\",\"Catelyn\",\"Catelyn\",\"Catelyn\",\"Catelyn\",\"Catelyn\",\"Catelyn\",\"Catelyn\",\"Catelyn\",\"Edmure\",\"Edmure\",\"Edmure\",\"Hoster\",\"Jeyne\",\"Lysa\",\"Lysa\",\"Lysa\",\"Lysa\",\"Lysa\",\"Petyr\",\"Petyr\",\"Robb\",\"Robb\",\"Robb\",\"Robb\",\"Robb\",\"Sansa\",\"Sansa\",\"Sansa\",\"Sansa\",\"Sansa\",\"Sansa\",\"Sansa\",\"Sansa\",\"Sansa\",\"Stannis\",\"Stannis\",\"Stannis\",\"Elia\",\"Ilyn\",\"Pycelle\",\"Shae\",\"Shae\",\"Varys\",\"Varys\",\"Craster\",\"Craster\",\"Daario\",\"Daario\",\"Daario\",\"Daario\",\"Drogo\",\"Drogo\",\"Drogo\",\"Irri\",\"Irri\",\"Daenerys\",\"Daenerys\",\"Daenerys\",\"Daenerys\",\"Daenerys\",\"Daenerys\",\"Daenerys\",\"Daenerys\",\"Jorah\",\"Rhaegar\",\"Davos\",\"Davos\",\"Davos\",\"Davos\",\"Renly\",\"Tommen\",\"Tommen\",\"Janos\",\"Kevan\",\"Dalla\",\"Qhorin\",\"Qhorin\",\"Rattleshirt\",\"Marillion\"]},\"selected\":{\"id\":\"1527\"},\"selection_policy\":{\"id\":\"1528\"}},\"id\":\"1458\",\"type\":\"ColumnDataSource\"},{\"attributes\":{\"end\":10.1,\"start\":-10.1},\"id\":\"1420\",\"type\":\"Range1d\"},{\"attributes\":{\"edge_renderer\":{\"id\":\"1459\"},\"inspection_policy\":{\"id\":\"1523\"},\"layout_provider\":{\"id\":\"1461\"},\"node_renderer\":{\"id\":\"1455\"},\"selection_policy\":{\"id\":\"1524\"}},\"id\":\"1452\",\"type\":\"GraphRenderer\"},{\"attributes\":{},\"id\":\"1514\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{},\"id\":\"1526\",\"type\":\"UnionRenderers\"},{\"attributes\":{\"data_source\":{\"id\":\"1454\"},\"glyph\":{\"id\":\"1462\"},\"hover_glyph\":null,\"muted_glyph\":null,\"view\":{\"id\":\"1456\"}},\"id\":\"1455\",\"type\":\"GlyphRenderer\"},{\"attributes\":{},\"id\":\"1439\",\"type\":\"PanTool\"},{\"attributes\":{\"formatter\":{\"id\":\"1512\"},\"ticker\":{\"id\":\"1436\"}},\"id\":\"1435\",\"type\":\"LinearAxis\"},{\"attributes\":{\"axis\":{\"id\":\"1435\"},\"dimension\":1,\"ticker\":null},\"id\":\"1438\",\"type\":\"Grid\"},{\"attributes\":{\"graph_layout\":{\"Aegon\":[3.366666353965979,-9.237812087108317],\"Aemon\":[-0.8983311239186754,2.578358425528047],\"Aerys\":[2.3819633585681452,-0.3184754697730903],\"Alliser\":[-0.1079197699223209,5.657714312367845],\"Amory\":[6.723148163619172,0.47770061894114046],\"Anguy\":[2.310033434450675,3.8370159254367517],\"Arya\":[0.4461818026301371,1.5115939542305536],\"Balon\":[-0.0007287734420624002,0.36046643365536907],\"Barristan\":[1.6797034998243423,-4.296638708598581],\"Belwas\":[1.552299516874993,-7.4635579102497385],\"Beric\":[1.6166623727643281,2.7777766796343353],\"Bowen\":[-0.6558591103761543,5.846863986691625],\"Bran\":[-2.3527105416694734,2.3146509667557713],\"Brienne\":[-0.5140411305679141,0.08849909119947764],\"Bronn\":[3.2083409170159216,-0.20392116824581802],\"Brynden\":[-1.8929490898325865,0.3105197051002262],\"Catelyn\":[-1.2209203983325014,-0.09910782991925368],\"Cersei\":[1.2814152971887913,-0.1043539675188678],\"Chataya\":[3.9629721536654223,-1.9179440746121859],\"Craster\":[-2.808168503760838,6.363208680696848],\"Cressen\":[-8.570954756289742,0.5272675411882558],\"Daario\":[3.055891203638848,-8.188609659946986],\"Daenerys\":[2.997551927376451,-6.405684810864736],\"Dalla\":[0.33921979675294917,5.49641824191953],\"Davos\":[-5.8655790748744945,0.5353144428878502],\"Doran\":[4.958316153505107,-0.3501908064534175],\"Drogo\":[3.5330076370195536,-7.895870327937639],\"Eddard\":[-0.09615238386646649,1.3516365864744542],\"Eddison\":[-3.0202694277923925,5.354242749947755],\"Edmure\":[-1.9579803345808673,-0.8974660378059469],\"Elia\":[2.402073126637867,-1.917704052130167],\"Ellaria\":[4.5861715546124415,-0.8237495339679657],\"Gendry\":[2.4247994062991496,2.835243402492744],\"Gilly\":[-2.3428247165359024,5.732542854502129],\"Gregor\":[2.217448507056688,0.25593250745513135],\"Grenn\":[-2.089627828895677,4.744298111302449],\"Hodor\":[-3.585551193649574,2.7797591541775004],\"Hoster\":[-2.493920831850935,-2.014231344533165],\"Illyrio\":[0.7868306121764898,-10.0],\"Ilyn\":[2.7232638813868304,0.9015730017873307],\"Irri\":[4.133098254622045,-8.344985630391838],\"Jaime\":[1.0050397850203403,-0.2549754871540132],\"Janos\":[-0.1118726001940524,3.8050862763757505],\"Jeyne\":[-3.3929143253114615,0.07853875286892263],\"Joffrey\":[1.0956249581745217,0.09837260428081403],\"Jojen\":[-3.942031664735746,3.966930439997124],\"Jon\":[-1.2180610363287978,3.743853900025457],\"Jon Arryn\":[0.015396715866975677,-3.2882029339186154],\"Jorah\":[2.4635614898324643,-6.617528989311746],\"Karl\":[-4.143025299671663,8.811538872666992],\"Kevan\":[0.5773717031599852,-2.1510762109957122],\"Kraznys\":[2.5759866157710616,-9.118751598613068],\"Lancel\":[-0.26167268521058,-4.9625032533299285],\"Loras\":[0.09552493087007727,-1.2074221903985802],\"Lothar\":[-3.170565493645482,-0.5594663733711276],\"Luwin\":[-5.292145626783701,3.1427248838165736],\"Lysa\":[-0.505251095466495,-1.5692265377814367],\"Mace\":[3.452306786549256,-0.5707640170723922],\"Mance\":[-1.0725859546143355,5.486880893396424],\"Margaery\":[0.9787629714531395,-1.4248134844498654],\"Marillion\":[-1.3891420653518065,-2.757628028032004],\"Meera\":[-3.245808234686086,4.0093588181640305],\"Melisandre\":[-3.4533308165755847,2.33681418641795],\"Meryn\":[2.250387973873693,0.8096139867031555],\"Missandei\":[4.986814111169188,-7.958988648047092],\"Myrcella\":[1.255624780696211,-1.839228382666609],\"Nan\":[-5.159311682447407,3.7642299202867555],\"Oberyn\":[3.678873148401531,0.1362299045832502],\"Olenna\":[-0.7301313357039082,-2.703109313621338],\"Orell\":[-2.4525577126555547,6.849453405595615],\"Petyr\":[-0.7371201849356998,-0.7172235446503166],\"Podrick\":[1.9787165199020773,-1.2069928206642515],\"Pycelle\":[2.733862679540412,-0.8927783822023734],\"Qhorin\":[-1.6120697221590083,5.990776450468792],\"Qyburn\":[4.250147179455916,0.7551876395361692],\"Rakharo\":[4.932672049885687,-8.590618881502348],\"Ramsay\":[-4.499547617767683,0.11009569724035699],\"Rattleshirt\":[-1.1498413959078684,6.663486717735585],\"Renly\":[0.247059682613968,-0.8106325235841292],\"Rhaegar\":[2.3403840893653816,-4.190395434258183],\"Rickard\":[-3.7357215152001664,0.7254993442535437],\"Rickon\":[-1.1153994107112846,1.8740154784188423],\"Robb\":[-1.453066713491456,0.7595761407466439],\"Robert\":[0.8529922519211353,-0.831235050843262],\"Robert Arryn\":[-1.7572731165822248,-2.4553811386893534],\"Roose\":[-1.5051621136764939,1.3584228799783682],\"Roslin\":[-3.269944453763724,-1.3364263567499841],\"Salladhor\":[-8.52614980914982,-0.19370127841425577],\"Samwell\":[-2.0720995705345953,4.175421821353692],\"Sandor\":[1.513709105954018,1.1429440899034469],\"Sansa\":[-0.12253480709935632,-0.22120585087248196],\"Shae\":[2.4856976841664187,-1.4115605450311381],\"Shireen\":[-8.236465587444533,-0.8249202383193713],\"Stannis\":[-1.1785878350284658,1.0373434671904662],\"Styr\":[-1.6681539034174944,6.678565104219888],\"Theon\":[-2.1590284195101273,2.8251032001534977],\"Thoros\":[1.9591180594195652,1.8311165124039221],\"Tommen\":[1.8571055256056357,-0.9526566174939547],\"Tyrion\":[1.5762261432293299,-0.339008254044958],\"Tywin\":[0.7258005167095537,0.015876018009830323],\"Val\":[0.3205751910001846,3.740045163626286],\"Varys\":[1.698229743119123,-1.582567360161071],\"Viserys\":[3.0046561598104327,-3.819775641666427],\"Walder\":[-2.0386803548220134,-0.49354764055298017],\"Walton\":[3.8293916736578,1.4870696296912593],\"Worm\":[4.142639851787413,-9.10382515325343],\"Ygritte\":[-0.7155758588915136,6.589672007292956]}},\"id\":\"1461\",\"type\":\"StaticLayoutProvider\"},{\"attributes\":{},\"id\":\"1512\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{},\"id\":\"1524\",\"type\":\"NodesOnly\"},{\"attributes\":{},\"id\":\"1432\",\"type\":\"BasicTicker\"},{\"attributes\":{},\"id\":\"1441\",\"type\":\"SaveTool\"},{\"attributes\":{\"axis\":{\"id\":\"1431\"},\"ticker\":null},\"id\":\"1434\",\"type\":\"Grid\"},{\"attributes\":{},\"id\":\"1427\",\"type\":\"LinearScale\"},{\"attributes\":{},\"id\":\"1525\",\"type\":\"Selection\"},{\"attributes\":{},\"id\":\"1528\",\"type\":\"UnionRenderers\"},{\"attributes\":{\"text\":\"Game of Thrones Network\"},\"id\":\"1423\",\"type\":\"Title\"},{\"attributes\":{\"active_drag\":\"auto\",\"active_inspect\":\"auto\",\"active_multi\":null,\"active_scroll\":{\"id\":\"1440\"},\"active_tap\":\"auto\",\"tools\":[{\"id\":\"1439\"},{\"id\":\"1440\"},{\"id\":\"1441\"},{\"id\":\"1442\"},{\"id\":\"1443\"},{\"id\":\"1444\"}]},\"id\":\"1445\",\"type\":\"Toolbar\"},{\"attributes\":{\"formatter\":{\"id\":\"1514\"},\"ticker\":{\"id\":\"1432\"}},\"id\":\"1431\",\"type\":\"LinearAxis\"},{\"attributes\":{},\"id\":\"1429\",\"type\":\"LinearScale\"},{\"attributes\":{\"end\":10.1,\"start\":-10.1},\"id\":\"1421\",\"type\":\"Range1d\"},{\"attributes\":{\"data_source\":{\"id\":\"1458\"},\"glyph\":{\"id\":\"1467\"},\"hover_glyph\":null,\"muted_glyph\":null,\"view\":{\"id\":\"1460\"}},\"id\":\"1459\",\"type\":\"GlyphRenderer\"},{\"attributes\":{\"source\":{\"id\":\"1458\"}},\"id\":\"1460\",\"type\":\"CDSView\"},{\"attributes\":{},\"id\":\"1436\",\"type\":\"BasicTicker\"}],\"root_ids\":[\"1422\"]},\"title\":\"Bokeh Application\",\"version\":\"2.1.0\"}};\n var render_items = [{\"docid\":\"2c295554-adde-4f52-ad4f-cea981f9b7f6\",\"root_ids\":[\"1422\"],\"roots\":{\"1422\":\"016275ad-bbf1-451b-9111-bcd7bd5785b6\"}}];\n root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n\n }\n if (root.Bokeh !== undefined) {\n embed_document(root);\n } else {\n var attempts = 0;\n var timer = setInterval(function(root) {\n if (root.Bokeh !== undefined) {\n clearInterval(timer);\n embed_document(root);\n } else {\n attempts++;\n if (attempts > 100) {\n clearInterval(timer);\n console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n }\n }\n }, 10, root)\n }\n})(window);", "application/vnd.bokehjs_exec.v0+json": "" }, "metadata": { "application/vnd.bokehjs_exec.v0+json": { "id": "1422" } }, "output_type": "display_data" } ], "source": [ "#Choose attributes from G network to size and color by — setting manual size (e.g. 10) or color (e.g. 'skyblue') also allowed\n", "size_by_this_attribute = 'adjusted_node_size'\n", "color_by_this_attribute = 'modularity_color'\n", "#Pick a color palette — Blues8, Reds8, Purples8, Oranges8, Viridis8\n", "color_palette = Blues8\n", "#Choose a title!\n", "title = 'Game of Thrones Network'\n", "\n", "#Establish which categories will appear when hovering over each node\n", "HOVER_TOOLTIPS = [\n", " (\"Character\", \"@index\"),\n", " (\"Degree\", \"@degree\"),\n", " (\"Modularity Class\", \"@modularity_class\"),\n", " (\"Modularity Color\", \"$color[swatch]:modularity_color\"),\n", "]\n", "\n", "#Create a plot — set dimensions, toolbar, and title\n", "plot = figure(tooltips = HOVER_TOOLTIPS,\n", " tools=\"pan,wheel_zoom,save,reset, tap\", active_scroll='wheel_zoom',\n", " x_range=Range1d(-10.1, 10.1), y_range=Range1d(-10.1, 10.1), title=title)\n", "\n", "#Create a network graph object\n", "# https://networkx.github.io/documentation/networkx-1.9/reference/generated/networkx.drawing.layout.spring_layout.html\n", "network_graph = from_networkx(G, networkx.spring_layout, scale=10, center=(0, 0))\n", "\n", "#Set node sizes and colors according to node degree (color as category from attribute)\n", "network_graph.node_renderer.glyph = Circle(size=size_by_this_attribute, fill_color=color_by_this_attribute)\n", "\n", "#Set edge opacity and width\n", "network_graph.edge_renderer.glyph = MultiLine(line_alpha=0.5, line_width=1)\n", "\n", "plot.renderers.append(network_graph)\n", "\n", "show(plot)\n", "#save(plot, filename=f\"{title}.html\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Network with Responsive Highlighting" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The code below shows how to create responsive highlighting when a user hovers over nodes or edges, which you can read more about in [Bokeh's NetworkX Integration documentation](https://docs.bokeh.org/en/latest/docs/user_guide/graph.html?highlight=networks#interaction-policies). " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Include EdgesAndLinkedNodes, NodesAndLinkedEdges**" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "from bokeh.io import output_notebook, show, save\n", "from bokeh.models import Range1d, Circle, ColumnDataSource, MultiLine, EdgesAndLinkedNodes, NodesAndLinkedEdges\n", "from bokeh.plotting import figure\n", "from bokeh.plotting import from_networkx\n", "from bokeh.palettes import Blues8, Reds8, Purples8, Oranges8, Viridis8, Spectral8\n", "from bokeh.transform import linear_cmap\n", "from networkx.algorithms import community" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Calculate degree for each node and add as node attribute**" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "degrees = dict(networkx.degree(G))\n", "networkx.set_node_attributes(G, name='degree', values=degrees)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Slightly adjust degree so that the nodes with very small degrees are still visible**" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "tags": [ "hide-input" ] }, "outputs": [], "source": [ "number_to_adjust_by = 5\n", "adjusted_node_size = dict([(node, degree+number_to_adjust_by) for node, degree in networkx.degree(G)])\n", "networkx.set_node_attributes(G, name='adjusted_node_size', values=adjusted_node_size)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Calculate communities**" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "tags": [ "hide-input" ] }, "outputs": [], "source": [ "communities = community.greedy_modularity_communities(G)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Add modularity class and color as attributes to network graph**" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "tags": [ "hide-input" ] }, "outputs": [], "source": [ "# Create empty dictionaries\n", "modularity_class = {}\n", "modularity_color = {}\n", "#Loop through each community in the network\n", "for community_number, community in enumerate(communities):\n", " #For each member of the community, add their community number and a distinct color\n", " for name in community: \n", " modularity_class[name] = community_number\n", " modularity_color[name] = Spectral8[community_number]" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "tags": [ "hide-input" ] }, "outputs": [], "source": [ "# Add modularity class and color as attributes from the network above\n", "networkx.set_node_attributes(G, modularity_class, 'modularity_class')\n", "networkx.set_node_attributes(G, modularity_color, 'modularity_color')" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\n", "\n", "\n", "
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": "(function(root) {\n function embed_document(root) {\n \n var docs_json = {\"8d0880b8-07db-41a3-8b27-98c567a35576\":{\"roots\":{\"references\":[{\"attributes\":{\"below\":[{\"id\":\"1666\"}],\"center\":[{\"id\":\"1669\"},{\"id\":\"1673\"}],\"left\":[{\"id\":\"1670\"}],\"renderers\":[{\"id\":\"1685\"}],\"title\":{\"id\":\"1658\"},\"toolbar\":{\"id\":\"1679\"},\"x_range\":{\"id\":\"1655\"},\"x_scale\":{\"id\":\"1662\"},\"y_range\":{\"id\":\"1656\"},\"y_scale\":{\"id\":\"1664\"}},\"id\":\"1657\",\"subtype\":\"Figure\",\"type\":\"Plot\"},{\"attributes\":{},\"id\":\"1676\",\"type\":\"SaveTool\"},{\"attributes\":{\"text\":\"Game of Thrones Network\"},\"id\":\"1658\",\"type\":\"Title\"},{\"attributes\":{},\"id\":\"1799\",\"type\":\"Selection\"},{\"attributes\":{},\"id\":\"1677\",\"type\":\"ResetTool\"},{\"attributes\":{\"edge_renderer\":{\"id\":\"1692\"},\"inspection_policy\":{\"id\":\"1727\"},\"layout_provider\":{\"id\":\"1694\"},\"node_renderer\":{\"id\":\"1688\"},\"selection_policy\":{\"id\":\"1725\"}},\"id\":\"1685\",\"type\":\"GraphRenderer\"},{\"attributes\":{\"source\":{\"id\":\"1687\"}},\"id\":\"1689\",\"type\":\"CDSView\"},{\"attributes\":{},\"id\":\"1802\",\"type\":\"UnionRenderers\"},{\"attributes\":{\"formatter\":{\"id\":\"1790\"},\"ticker\":{\"id\":\"1667\"}},\"id\":\"1666\",\"type\":\"LinearAxis\"},{\"attributes\":{\"data\":{\"adjusted_node_size\":[10,9,20,9,29,23,41,27,8,17,6,12,24,7,11,19,13,25,9,17,23,31,11,9,18,10,11,14,9,11,6,9,9,7,10,7,9,12,9,10,10,13,23,13,8,7,15,12,30,9,31,19,10,11,12,9,10,12,10,6,9,9,9,19,6,11,6,7,6,11,8,6,10,6,6,17,8,9,6,13,10,11,7,11,12,9,8,9,6,10,9,7,9,9,7,6,7,8,8,7,8,7,6,7,6,6,6],\"degree\":[5,4,15,4,24,18,36,22,3,12,1,7,19,2,6,14,8,20,4,12,18,26,6,4,13,5,6,9,4,6,1,4,4,2,5,2,4,7,4,5,5,8,18,8,3,2,10,7,25,4,26,14,5,6,7,4,5,7,5,1,4,4,4,14,1,6,1,2,1,6,3,1,5,1,1,12,3,4,1,8,5,6,2,6,7,4,3,4,1,5,4,2,4,4,2,1,2,3,3,2,3,2,1,2,1,1,1],\"index\":[\"Aemon\",\"Grenn\",\"Samwell\",\"Aerys\",\"Jaime\",\"Robert\",\"Tyrion\",\"Tywin\",\"Alliser\",\"Mance\",\"Amory\",\"Oberyn\",\"Arya\",\"Anguy\",\"Beric\",\"Bran\",\"Brynden\",\"Cersei\",\"Gendry\",\"Gregor\",\"Joffrey\",\"Jon\",\"Rickon\",\"Roose\",\"Sandor\",\"Thoros\",\"Balon\",\"Loras\",\"Belwas\",\"Barristan\",\"Illyrio\",\"Hodor\",\"Jojen\",\"Luwin\",\"Meera\",\"Nan\",\"Theon\",\"Brienne\",\"Bronn\",\"Podrick\",\"Lothar\",\"Walder\",\"Catelyn\",\"Edmure\",\"Hoster\",\"Jeyne\",\"Lysa\",\"Petyr\",\"Robb\",\"Roslin\",\"Sansa\",\"Stannis\",\"Elia\",\"Ilyn\",\"Meryn\",\"Pycelle\",\"Shae\",\"Varys\",\"Craster\",\"Karl\",\"Daario\",\"Drogo\",\"Irri\",\"Daenerys\",\"Aegon\",\"Jorah\",\"Kraznys\",\"Missandei\",\"Rakharo\",\"Rhaegar\",\"Viserys\",\"Worm\",\"Davos\",\"Cressen\",\"Salladhor\",\"Eddard\",\"Eddison\",\"Gilly\",\"Qyburn\",\"Renly\",\"Tommen\",\"Janos\",\"Bowen\",\"Kevan\",\"Margaery\",\"Myrcella\",\"Dalla\",\"Melisandre\",\"Orell\",\"Qhorin\",\"Rattleshirt\",\"Styr\",\"Val\",\"Ygritte\",\"Jon Arryn\",\"Lancel\",\"Olenna\",\"Marillion\",\"Robert Arryn\",\"Ellaria\",\"Mace\",\"Rickard\",\"Ramsay\",\"Chataya\",\"Shireen\",\"Doran\",\"Walton\"],\"modularity_class\":[1,1,1,0,0,3,0,0,1,1,0,0,2,4,4,2,2,2,4,0,0,1,2,2,0,4,0,0,3,3,3,1,1,2,1,2,2,2,0,0,2,2,2,2,2,2,2,2,2,2,2,1,0,0,0,0,0,0,1,1,3,3,3,3,3,3,3,3,3,3,3,3,1,1,1,2,1,1,0,0,0,1,1,0,0,0,1,1,1,1,1,1,1,1,3,0,0,2,2,0,0,2,2,0,1,0,0],\"modularity_color\":[\"#66c2a5\",\"#66c2a5\",\"#66c2a5\",\"#3288bd\",\"#3288bd\",\"#e6f598\",\"#3288bd\",\"#3288bd\",\"#66c2a5\",\"#66c2a5\",\"#3288bd\",\"#3288bd\",\"#abdda4\",\"#fee08b\",\"#fee08b\",\"#abdda4\",\"#abdda4\",\"#abdda4\",\"#fee08b\",\"#3288bd\",\"#3288bd\",\"#66c2a5\",\"#abdda4\",\"#abdda4\",\"#3288bd\",\"#fee08b\",\"#3288bd\",\"#3288bd\",\"#e6f598\",\"#e6f598\",\"#e6f598\",\"#66c2a5\",\"#66c2a5\",\"#abdda4\",\"#66c2a5\",\"#abdda4\",\"#abdda4\",\"#abdda4\",\"#3288bd\",\"#3288bd\",\"#abdda4\",\"#abdda4\",\"#abdda4\",\"#abdda4\",\"#abdda4\",\"#abdda4\",\"#abdda4\",\"#abdda4\",\"#abdda4\",\"#abdda4\",\"#abdda4\",\"#66c2a5\",\"#3288bd\",\"#3288bd\",\"#3288bd\",\"#3288bd\",\"#3288bd\",\"#3288bd\",\"#66c2a5\",\"#66c2a5\",\"#e6f598\",\"#e6f598\",\"#e6f598\",\"#e6f598\",\"#e6f598\",\"#e6f598\",\"#e6f598\",\"#e6f598\",\"#e6f598\",\"#e6f598\",\"#e6f598\",\"#e6f598\",\"#66c2a5\",\"#66c2a5\",\"#66c2a5\",\"#abdda4\",\"#66c2a5\",\"#66c2a5\",\"#3288bd\",\"#3288bd\",\"#3288bd\",\"#66c2a5\",\"#66c2a5\",\"#3288bd\",\"#3288bd\",\"#3288bd\",\"#66c2a5\",\"#66c2a5\",\"#66c2a5\",\"#66c2a5\",\"#66c2a5\",\"#66c2a5\",\"#66c2a5\",\"#66c2a5\",\"#e6f598\",\"#3288bd\",\"#3288bd\",\"#abdda4\",\"#abdda4\",\"#3288bd\",\"#3288bd\",\"#abdda4\",\"#abdda4\",\"#3288bd\",\"#66c2a5\",\"#3288bd\",\"#3288bd\"]},\"selected\":{\"id\":\"1799\"},\"selection_policy\":{\"id\":\"1800\"}},\"id\":\"1687\",\"type\":\"ColumnDataSource\"},{\"attributes\":{\"fill_color\":{\"value\":\"white\"},\"line_width\":{\"value\":2},\"size\":{\"field\":\"adjusted_node_size\",\"units\":\"screen\"}},\"id\":\"1705\",\"type\":\"Circle\"},{\"attributes\":{\"data_source\":{\"id\":\"1691\"},\"glyph\":{\"id\":\"1710\"},\"hover_glyph\":{\"id\":\"1720\"},\"muted_glyph\":null,\"selection_glyph\":{\"id\":\"1715\"},\"view\":{\"id\":\"1693\"}},\"id\":\"1692\",\"type\":\"GlyphRenderer\"},{\"attributes\":{},\"id\":\"1725\",\"type\":\"NodesAndLinkedEdges\"},{\"attributes\":{\"line_alpha\":{\"value\":0.5}},\"id\":\"1710\",\"type\":\"MultiLine\"},{\"attributes\":{},\"id\":\"1801\",\"type\":\"Selection\"},{\"attributes\":{},\"id\":\"1662\",\"type\":\"LinearScale\"},{\"attributes\":{\"data\":{\"Weight\":[5,31,30,4,4,8,25,43,11,11,52,7,5,6,34,12,36,6,10,5,13,18,6,5,8,11,19,36,6,6,4,88,5,4,6,15,16,11,11,7,17,5,8,31,15,10,13,10,4,16,5,10,5,6,6,5,4,5,4,6,5,9,11,5,5,46,54,5,4,12,77,4,31,5,5,5,4,22,5,5,11,6,9,7,5,25,12,28,11,6,4,21,6,18,39,4,4,12,5,4,16,7,13,14,5,6,4,5,5,15,4,4,6,4,5,9,15,4,69,11,8,7,10,9,7,8,12,5,24,4,6,6,11,23,9,6,5,43,7,6,7,8,5,46,18,18,15,22,4,4,21,8,15,96,46,12,4,54,14,35,11,4,15,23,10,4,5,8,7,4,17,4,5,4,4,6,7,23,10,4,6,4,4,6,4,16,7,5,5,9,7,7,12,5,4,8,7,28,5,5,14,10,9,10,35,8,7,6,4,9,8,4,7,6,31,20,9,16,8,12,54,14,4,8,8,15,7,4,4,4,5,4,4,10,6,4,6,4,7,9,5,8,14,18,10,26,13,20,11,5,35,41,5,33,4,11,7,6,5,19,4,8,4,4,10,12,19,9,26,6,6,16,9,10,8,5,43,6,8,4,5,16,9,32,6,18,5,10,29,9,28,5,28,13,4,7,15,4,6,5,36,9,4,7,4,6,8,32,20,15,7,5,4,4,8,5,4,6,17,4,5,14,7,18,7,6,17,4,8,47,10,26,7,12,8,14,5,7,4,16,30,5,7,5,5,5,7,7,6,7,9,4],\"end\":[\"Grenn\",\"Samwell\",\"Jon\",\"Robert\",\"Stannis\",\"Eddison\",\"Jon\",\"Samwell\",\"Bran\",\"Jojen\",\"Jon\",\"Meera\",\"Melisandre\",\"Bowen\",\"Craster\",\"Eddison\",\"Gilly\",\"Janos\",\"Mance\",\"Qhorin\",\"Stannis\",\"Jaime\",\"Robert\",\"Tyrion\",\"Tywin\",\"Arya\",\"Catelyn\",\"Cersei\",\"Eddard\",\"Balon\",\"Barristan\",\"Brienne\",\"Edmure\",\"Elia\",\"Gregor\",\"Joffrey\",\"Loras\",\"Meryn\",\"Qyburn\",\"Renly\",\"Robert\",\"Stannis\",\"Tommen\",\"Tyrion\",\"Robb\",\"Sansa\",\"Tywin\",\"Walton\",\"Arya\",\"Cersei\",\"Daenerys\",\"Eddard\",\"Jon\",\"Jon Arryn\",\"Rhaegar\",\"Barristan\",\"Renly\",\"Stannis\",\"Thoros\",\"Sandor\",\"Sansa\",\"Tyrion\",\"Tywin\",\"Arya\",\"Catelyn\",\"Cersei\",\"Joffrey\",\"Lysa\",\"Myrcella\",\"Robb\",\"Sansa\",\"Balon\",\"Bronn\",\"Chataya\",\"Doran\",\"Elia\",\"Ellaria\",\"Gregor\",\"Ilyn\",\"Janos\",\"Kevan\",\"Loras\",\"Mace\",\"Margaery\",\"Meryn\",\"Oberyn\",\"Petyr\",\"Podrick\",\"Pycelle\",\"Renly\",\"Sandor\",\"Shae\",\"Stannis\",\"Varys\",\"Tywin\",\"Viserys\",\"Lysa\",\"Robb\",\"Balon\",\"Brynden\",\"Cersei\",\"Gregor\",\"Joffrey\",\"Kevan\",\"Mace\",\"Oberyn\",\"Petyr\",\"Podrick\",\"Pycelle\",\"Stannis\",\"Tommen\",\"Val\",\"Varys\",\"Walder\",\"Mance\",\"Janos\",\"Jon\",\"Janos\",\"Jon\",\"Craster\",\"Dalla\",\"Gilly\",\"Qhorin\",\"Rattleshirt\",\"Styr\",\"Val\",\"Ygritte\",\"Oberyn\",\"Gregor\",\"Joffrey\",\"Ellaria\",\"Mace\",\"Anguy\",\"Beric\",\"Bran\",\"Brynden\",\"Cersei\",\"Gendry\",\"Gregor\",\"Joffrey\",\"Jon\",\"Rickon\",\"Roose\",\"Sandor\",\"Thoros\",\"Eddard\",\"Robb\",\"Sansa\",\"Beric\",\"Gendry\",\"Thoros\",\"Eddard\",\"Sandor\",\"Hodor\",\"Jojen\",\"Jon\",\"Luwin\",\"Meera\",\"Nan\",\"Rickon\",\"Theon\",\"Catelyn\",\"Eddard\",\"Robb\",\"Sansa\",\"Lothar\",\"Walder\",\"Catelyn\",\"Edmure\",\"Rickard\",\"Robb\",\"Catelyn\",\"Brienne\",\"Bronn\",\"Elia\",\"Gregor\",\"Ilyn\",\"Joffrey\",\"Meryn\",\"Pycelle\",\"Sandor\",\"Shae\",\"Varys\",\"Eddard\",\"Lysa\",\"Sansa\",\"Thoros\",\"Sandor\",\"Bronn\",\"Elia\",\"Ilyn\",\"Meryn\",\"Sandor\",\"Joffrey\",\"Ilyn\",\"Kevan\",\"Loras\",\"Margaery\",\"Meryn\",\"Myrcella\",\"Sandor\",\"Stannis\",\"Tommen\",\"Robb\",\"Sansa\",\"Eddard\",\"Craster\",\"Dalla\",\"Eddison\",\"Gilly\",\"Janos\",\"Meera\",\"Melisandre\",\"Orell\",\"Qhorin\",\"Rattleshirt\",\"Stannis\",\"Styr\",\"Theon\",\"Val\",\"Ygritte\",\"Robb\",\"Sansa\",\"Eddard\",\"Theon\",\"Robb\",\"Sansa\",\"Catelyn\",\"Robb\",\"Brienne\",\"Eddard\",\"Ilyn\",\"Meryn\",\"Thoros\",\"Sansa\",\"Loras\",\"Robb\",\"Stannis\",\"Brienne\",\"Margaery\",\"Olenna\",\"Renly\",\"Sansa\",\"Barristan\",\"Illyrio\",\"Daenerys\",\"Jorah\",\"Daenerys\",\"Jorah\",\"Rhaegar\",\"Jojen\",\"Meera\",\"Robb\",\"Meera\",\"Nan\",\"Robb\",\"Catelyn\",\"Robb\",\"Sansa\",\"Podrick\",\"Margaery\",\"Sansa\",\"Edmure\",\"Roslin\",\"Robb\",\"Walder\",\"Catelyn\",\"Edmure\",\"Robb\",\"Petyr\",\"Roslin\",\"Edmure\",\"Hoster\",\"Jeyne\",\"Lysa\",\"Petyr\",\"Robb\",\"Roslin\",\"Sansa\",\"Stannis\",\"Eddard\",\"Roslin\",\"Hoster\",\"Robb\",\"Lysa\",\"Robb\",\"Jon Arryn\",\"Marillion\",\"Petyr\",\"Robert Arryn\",\"Sansa\",\"Robb\",\"Sansa\",\"Eddard\",\"Ramsay\",\"Rickard\",\"Sansa\",\"Stannis\",\"Eddard\",\"Kevan\",\"Margaery\",\"Marillion\",\"Myrcella\",\"Olenna\",\"Renly\",\"Robert Arryn\",\"Shae\",\"Davos\",\"Melisandre\",\"Renly\",\"Rhaegar\",\"Meryn\",\"Varys\",\"Chataya\",\"Varys\",\"Kevan\",\"Renly\",\"Karl\",\"Gilly\",\"Drogo\",\"Irri\",\"Daenerys\",\"Jorah\",\"Daenerys\",\"Irri\",\"Jorah\",\"Daenerys\",\"Missandei\",\"Aegon\",\"Jorah\",\"Kraznys\",\"Missandei\",\"Rakharo\",\"Rhaegar\",\"Viserys\",\"Worm\",\"Rhaegar\",\"Viserys\",\"Cressen\",\"Salladhor\",\"Melisandre\",\"Shireen\",\"Margaery\",\"Myrcella\",\"Margaery\",\"Bowen\",\"Lancel\",\"Val\",\"Rattleshirt\",\"Ygritte\",\"Ygritte\",\"Robert Arryn\"],\"start\":[\"Aemon\",\"Aemon\",\"Aemon\",\"Aemon\",\"Aemon\",\"Grenn\",\"Grenn\",\"Grenn\",\"Samwell\",\"Samwell\",\"Samwell\",\"Samwell\",\"Samwell\",\"Samwell\",\"Samwell\",\"Samwell\",\"Samwell\",\"Samwell\",\"Samwell\",\"Samwell\",\"Samwell\",\"Aerys\",\"Aerys\",\"Aerys\",\"Aerys\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Robert\",\"Robert\",\"Robert\",\"Robert\",\"Robert\",\"Robert\",\"Robert\",\"Robert\",\"Robert\",\"Robert\",\"Robert\",\"Robert\",\"Robert\",\"Robert\",\"Robert\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tywin\",\"Tywin\",\"Tywin\",\"Tywin\",\"Tywin\",\"Tywin\",\"Tywin\",\"Tywin\",\"Tywin\",\"Tywin\",\"Tywin\",\"Tywin\",\"Tywin\",\"Tywin\",\"Tywin\",\"Tywin\",\"Tywin\",\"Tywin\",\"Alliser\",\"Alliser\",\"Alliser\",\"Mance\",\"Mance\",\"Mance\",\"Mance\",\"Mance\",\"Mance\",\"Mance\",\"Mance\",\"Mance\",\"Mance\",\"Amory\",\"Oberyn\",\"Oberyn\",\"Oberyn\",\"Oberyn\",\"Arya\",\"Arya\",\"Arya\",\"Arya\",\"Arya\",\"Arya\",\"Arya\",\"Arya\",\"Arya\",\"Arya\",\"Arya\",\"Arya\",\"Arya\",\"Arya\",\"Arya\",\"Arya\",\"Anguy\",\"Beric\",\"Beric\",\"Beric\",\"Beric\",\"Bran\",\"Bran\",\"Bran\",\"Bran\",\"Bran\",\"Bran\",\"Bran\",\"Bran\",\"Bran\",\"Bran\",\"Bran\",\"Bran\",\"Brynden\",\"Brynden\",\"Brynden\",\"Brynden\",\"Brynden\",\"Brynden\",\"Cersei\",\"Cersei\",\"Cersei\",\"Cersei\",\"Cersei\",\"Cersei\",\"Cersei\",\"Cersei\",\"Cersei\",\"Cersei\",\"Cersei\",\"Cersei\",\"Cersei\",\"Cersei\",\"Cersei\",\"Gendry\",\"Gendry\",\"Gregor\",\"Gregor\",\"Gregor\",\"Gregor\",\"Gregor\",\"Gregor\",\"Joffrey\",\"Joffrey\",\"Joffrey\",\"Joffrey\",\"Joffrey\",\"Joffrey\",\"Joffrey\",\"Joffrey\",\"Joffrey\",\"Joffrey\",\"Joffrey\",\"Jon\",\"Jon\",\"Jon\",\"Jon\",\"Jon\",\"Jon\",\"Jon\",\"Jon\",\"Jon\",\"Jon\",\"Jon\",\"Jon\",\"Jon\",\"Jon\",\"Jon\",\"Jon\",\"Jon\",\"Jon\",\"Rickon\",\"Rickon\",\"Rickon\",\"Rickon\",\"Roose\",\"Roose\",\"Roose\",\"Sandor\",\"Sandor\",\"Sandor\",\"Sandor\",\"Sandor\",\"Balon\",\"Balon\",\"Balon\",\"Loras\",\"Loras\",\"Loras\",\"Loras\",\"Loras\",\"Belwas\",\"Belwas\",\"Belwas\",\"Belwas\",\"Barristan\",\"Barristan\",\"Barristan\",\"Hodor\",\"Hodor\",\"Hodor\",\"Jojen\",\"Luwin\",\"Theon\",\"Brienne\",\"Brienne\",\"Brienne\",\"Bronn\",\"Podrick\",\"Podrick\",\"Lothar\",\"Lothar\",\"Lothar\",\"Lothar\",\"Walder\",\"Walder\",\"Walder\",\"Walder\",\"Walder\",\"Catelyn\",\"Catelyn\",\"Catelyn\",\"Catelyn\",\"Catelyn\",\"Catelyn\",\"Catelyn\",\"Catelyn\",\"Catelyn\",\"Catelyn\",\"Edmure\",\"Edmure\",\"Edmure\",\"Hoster\",\"Jeyne\",\"Lysa\",\"Lysa\",\"Lysa\",\"Lysa\",\"Lysa\",\"Petyr\",\"Petyr\",\"Robb\",\"Robb\",\"Robb\",\"Robb\",\"Robb\",\"Sansa\",\"Sansa\",\"Sansa\",\"Sansa\",\"Sansa\",\"Sansa\",\"Sansa\",\"Sansa\",\"Sansa\",\"Stannis\",\"Stannis\",\"Stannis\",\"Elia\",\"Ilyn\",\"Pycelle\",\"Shae\",\"Shae\",\"Varys\",\"Varys\",\"Craster\",\"Craster\",\"Daario\",\"Daario\",\"Daario\",\"Daario\",\"Drogo\",\"Drogo\",\"Drogo\",\"Irri\",\"Irri\",\"Daenerys\",\"Daenerys\",\"Daenerys\",\"Daenerys\",\"Daenerys\",\"Daenerys\",\"Daenerys\",\"Daenerys\",\"Jorah\",\"Rhaegar\",\"Davos\",\"Davos\",\"Davos\",\"Davos\",\"Renly\",\"Tommen\",\"Tommen\",\"Janos\",\"Kevan\",\"Dalla\",\"Qhorin\",\"Qhorin\",\"Rattleshirt\",\"Marillion\"]},\"selected\":{\"id\":\"1801\"},\"selection_policy\":{\"id\":\"1802\"}},\"id\":\"1691\",\"type\":\"ColumnDataSource\"},{\"attributes\":{},\"id\":\"1800\",\"type\":\"UnionRenderers\"},{\"attributes\":{},\"id\":\"1671\",\"type\":\"BasicTicker\"},{\"attributes\":{},\"id\":\"1727\",\"type\":\"NodesAndLinkedEdges\"},{\"attributes\":{\"source\":{\"id\":\"1691\"}},\"id\":\"1693\",\"type\":\"CDSView\"},{\"attributes\":{\"end\":10.1,\"start\":-10.1},\"id\":\"1656\",\"type\":\"Range1d\"},{\"attributes\":{},\"id\":\"1664\",\"type\":\"LinearScale\"},{\"attributes\":{\"fill_color\":{\"value\":\"white\"},\"line_width\":{\"value\":2},\"size\":{\"field\":\"adjusted_node_size\",\"units\":\"screen\"}},\"id\":\"1700\",\"type\":\"Circle\"},{\"attributes\":{},\"id\":\"1667\",\"type\":\"BasicTicker\"},{\"attributes\":{\"axis\":{\"id\":\"1666\"},\"ticker\":null},\"id\":\"1669\",\"type\":\"Grid\"},{\"attributes\":{},\"id\":\"1788\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{\"line_width\":{\"value\":2}},\"id\":\"1720\",\"type\":\"MultiLine\"},{\"attributes\":{},\"id\":\"1790\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{\"axis\":{\"id\":\"1670\"},\"dimension\":1,\"ticker\":null},\"id\":\"1673\",\"type\":\"Grid\"},{\"attributes\":{\"formatter\":{\"id\":\"1788\"},\"ticker\":{\"id\":\"1671\"}},\"id\":\"1670\",\"type\":\"LinearAxis\"},{\"attributes\":{\"end\":10.1,\"start\":-10.1},\"id\":\"1655\",\"type\":\"Range1d\"},{\"attributes\":{\"line_width\":{\"value\":2}},\"id\":\"1715\",\"type\":\"MultiLine\"},{\"attributes\":{\"graph_layout\":{\"Aegon\":[-9.736578549595755,2.4551524791204815],\"Aemon\":[-0.9641327269341058,1.933880742475836],\"Aerys\":[1.5549341148945812,0.44466866964031454],\"Alliser\":[-2.0728121938872497,3.6181820829886826],\"Amory\":[9.278518551370082,0.4513325616300485],\"Anguy\":[1.4981971796792988,-6.096085830428933],\"Arya\":[1.0550224396316725,-2.297304508155613],\"Balon\":[1.5178921989770446,-0.7999094896826283],\"Barristan\":[-3.4116943041546675,1.0929421901680332],\"Belwas\":[-6.5117965020960655,3.879886089933734],\"Beric\":[1.63413909418989,-4.311752795509046],\"Bowen\":[-2.650314474046977,4.361687052203272],\"Bran\":[-1.610133538627098,-1.7486653090478221],\"Brienne\":[2.1821321699263017,-3.33460400877845],\"Bronn\":[5.462032383600556,-1.4213357991731237],\"Brynden\":[0.482694067589055,-3.925590216253667],\"Catelyn\":[1.048276390299474,-2.905509501375289],\"Cersei\":[2.7016814915897784,-1.2654953716636907],\"Chataya\":[5.151153698939468,2.2297796227924516],\"Craster\":[-4.011558006487563,3.2626381753672966],\"Cressen\":[1.1616085282180681,9.760407427032009],\"Daario\":[-8.12368540242754,3.672329266677181],\"Daenerys\":[-6.498320311805836,1.712562021611107],\"Dalla\":[-0.2795958271145115,4.335079694921948],\"Davos\":[1.4647102736799593,6.570556639727358],\"Doran\":[7.025085784256067,-0.616461558680161],\"Drogo\":[-8.377327653944647,2.9614974527901645],\"Eddard\":[0.43564360888018394,-1.6183285476315752],\"Eddison\":[-3.651256671178694,2.5426144693682717],\"Edmure\":[0.40173588326961446,-4.562510265067255],\"Elia\":[0.6339550504947277,-0.3344850988099604],\"Ellaria\":[6.640864375103008,0.7508188506756995],\"Gendry\":[2.405183362654342,-4.627823537877247],\"Gilly\":[-3.10362566831514,3.5029464120024083],\"Gregor\":[3.4390448690383777,-1.3443600269958604],\"Grenn\":[-2.7385271768301496,2.7315594361721174],\"Hodor\":[-2.936386701472608,-2.364813052076333],\"Hoster\":[2.251180604950789,-5.414515512005032],\"Illyrio\":[-8.585145513406614,6.533126396214826],\"Ilyn\":[4.3837649756159545,-2.195261712030537],\"Irri\":[-9.095230745479473,3.7107397923687655],\"Jaime\":[1.600712351535427,-1.730906820871945],\"Janos\":[-0.4004544436934228,2.626581246293481],\"Jeyne\":[0.14148253812820685,-5.437860191301003],\"Joffrey\":[3.175842143361009,-1.0211092837599236],\"Jojen\":[-3.737032010273222,-0.8672867303665799],\"Jon\":[-1.201863455267384,1.5291083074443357],\"Jon Arryn\":[2.2745608979421044,0.4166306128202194],\"Jorah\":[-6.193312007635978,2.4429045706203967],\"Karl\":[-7.0558510908323795,3.427029794501847],\"Kevan\":[4.658044223539629,0.789664051942429],\"Kraznys\":[-9.719467585771836,1.1550402169297451],\"Lancel\":[7.522864664831109,3.0151186942322776],\"Loras\":[3.277285636710373,-2.0058589418731896],\"Lothar\":[-0.9308802668065704,-4.908407877924546],\"Luwin\":[-4.674531777239774,-3.6362376446227818],\"Lysa\":[3.2649591099926427,-2.744817366495416],\"Mace\":[5.298712791560464,0.764541216563428],\"Mance\":[-1.5906121754219709,3.7019169690925215],\"Margaery\":[4.225770600214854,-0.7759750381784082],\"Marillion\":[5.129091215588785,-4.069009357411789],\"Meera\":[-3.027046050922315,-0.34318016167624565],\"Melisandre\":[0.18279784690791134,3.7455908031507663],\"Meryn\":[3.818833176865053,-2.1678055092382307],\"Missandei\":[-9.718473727151672,3.2906787899952046],\"Myrcella\":[5.054476569377251,-0.7656005017535602],\"Nan\":[-4.252427761796653,-4.211953133273512],\"Oberyn\":[5.692612941689448,-0.1539745329599889],\"Olenna\":[4.614084545175451,-3.8081007107100167],\"Orell\":[-4.629328002126954,1.352998256959741],\"Petyr\":[1.946811079155582,-2.6720151713598295],\"Podrick\":[4.8580889735529595,-1.636617529701165],\"Pycelle\":[4.51102620809468,0.12197013265055609],\"Qhorin\":[-1.8580711444005418,4.229464734269308],\"Qyburn\":[4.132010050722387,-5.060661565165408],\"Rakharo\":[-10.0,1.8187413971154789],\"Ramsay\":[-2.086301954233508,-5.664831151804152],\"Rattleshirt\":[-1.1402424522399197,4.957867679038363],\"Renly\":[2.342668555800091,-0.13019504664310494],\"Rhaegar\":[-3.3965538469224823,0.7011948658080965],\"Rickard\":[-0.4524000722790566,-6.082178447574117],\"Rickon\":[-0.5225092727137945,-2.286023716814553],\"Robb\":[0.23900345959093003,-2.495378868233665],\"Robert\":[-0.23522306809331978,-0.2638251478456975],\"Robert Arryn\":[5.411649413401012,-3.4578300585028754],\"Roose\":[1.0716954970720438,-4.606231675865614],\"Roslin\":[-0.5764747296893034,-5.51488798174124],\"Salladhor\":[2.8260428515790665,9.428354013373582],\"Samwell\":[-2.090269547496069,1.916983599627054],\"Sandor\":[2.301558826491978,-2.3336411894126186],\"Sansa\":[2.3554820758561448,-1.586974449897159],\"Shae\":[3.829441691576815,0.9965566675224344],\"Shireen\":[2.016457275802533,9.741653605962993],\"Stannis\":[0.890303332393286,0.9416570868525894],\"Styr\":[-2.589575487646443,4.981344980165904],\"Theon\":[-1.7610932733643991,-1.1812764077081552],\"Thoros\":[1.092412228992107,-3.422236554329554],\"Tommen\":[4.468276068764826,-1.3020248605776998],\"Tyrion\":[2.9196224083879585,-0.4284550441551017],\"Tywin\":[2.51024496110785,-0.7532643725055251],\"Val\":[0.6389829979896674,2.585224129121012],\"Varys\":[3.8342425564186633,0.510584154248076],\"Viserys\":[-2.1844174690060125,0.5990733442323114],\"Walder\":[0.20164610693733465,-3.640557524809852],\"Walton\":[3.4557561329143454,-5.493564268895024],\"Worm\":[-9.474537271718285,0.4531098042671703],\"Ygritte\":[-1.7379331903223316,5.089595726518109]}},\"id\":\"1694\",\"type\":\"StaticLayoutProvider\"},{\"attributes\":{\"active_drag\":\"auto\",\"active_inspect\":\"auto\",\"active_multi\":null,\"active_scroll\":{\"id\":\"1675\"},\"active_tap\":\"auto\",\"tools\":[{\"id\":\"1674\"},{\"id\":\"1675\"},{\"id\":\"1676\"},{\"id\":\"1677\"},{\"id\":\"1678\"}]},\"id\":\"1679\",\"type\":\"Toolbar\"},{\"attributes\":{\"fill_color\":{\"field\":\"modularity_color\"},\"size\":{\"field\":\"adjusted_node_size\",\"units\":\"screen\"}},\"id\":\"1695\",\"type\":\"Circle\"},{\"attributes\":{\"callback\":null,\"tooltips\":[[\"Character\",\"@index\"],[\"Degree\",\"@degree\"],[\"Modularity Class\",\"@modularity_class\"],[\"Modularity Color\",\"$color[swatch]:modularity_color\"]]},\"id\":\"1678\",\"type\":\"HoverTool\"},{\"attributes\":{},\"id\":\"1674\",\"type\":\"PanTool\"},{\"attributes\":{\"data_source\":{\"id\":\"1687\"},\"glyph\":{\"id\":\"1695\"},\"hover_glyph\":{\"id\":\"1700\"},\"muted_glyph\":null,\"selection_glyph\":{\"id\":\"1705\"},\"view\":{\"id\":\"1689\"}},\"id\":\"1688\",\"type\":\"GlyphRenderer\"},{\"attributes\":{},\"id\":\"1675\",\"type\":\"WheelZoomTool\"}],\"root_ids\":[\"1657\"]},\"title\":\"Bokeh Application\",\"version\":\"2.1.0\"}};\n var render_items = [{\"docid\":\"8d0880b8-07db-41a3-8b27-98c567a35576\",\"root_ids\":[\"1657\"],\"roots\":{\"1657\":\"73368388-480e-4389-8064-05f8c079a5cd\"}}];\n root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n\n }\n if (root.Bokeh !== undefined) {\n embed_document(root);\n } else {\n var attempts = 0;\n var timer = setInterval(function(root) {\n if (root.Bokeh !== undefined) {\n clearInterval(timer);\n embed_document(root);\n } else {\n attempts++;\n if (attempts > 100) {\n clearInterval(timer);\n console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n }\n }\n }, 10, root)\n }\n})(window);", "application/vnd.bokehjs_exec.v0+json": "" }, "metadata": { "application/vnd.bokehjs_exec.v0+json": { "id": "1657" } }, "output_type": "display_data" } ], "source": [ "from bokeh.models import EdgesAndLinkedNodes, NodesAndLinkedEdges\n", "\n", "#Choose colors for node and edge highlighting\n", "node_highlight_color = 'white'\n", "edge_highlight_color = 'black'\n", "\n", "#Choose attributes from G network to size and color by — setting manual size (e.g. 10) or color (e.g. 'skyblue') also allowed\n", "size_by_this_attribute = 'adjusted_node_size'\n", "color_by_this_attribute = 'modularity_color'\n", "\n", "#Pick a color palette — Blues8, Reds8, Purples8, Oranges8, Viridis8\n", "color_palette = Blues8\n", "\n", "#Choose a title!\n", "title = 'Game of Thrones Network'\n", "\n", "#Establish which categories will appear when hovering over each node\n", "HOVER_TOOLTIPS = [\n", " (\"Character\", \"@index\"),\n", " (\"Degree\", \"@degree\"),\n", " (\"Modularity Class\", \"@modularity_class\"),\n", " (\"Modularity Color\", \"$color[swatch]:modularity_color\"),\n", "]\n", "\n", "#Create a plot — set dimensions, toolbar, and title\n", "plot = figure(tooltips = HOVER_TOOLTIPS,\n", " tools=\"pan,wheel_zoom,save,reset\", active_scroll='wheel_zoom',\n", " x_range=Range1d(-10.1, 10.1), y_range=Range1d(-10.1, 10.1), title=title)\n", "\n", "#Create a network graph object\n", "# https://networkx.github.io/documentation/networkx-1.9/reference/generated/networkx.drawing.layout.spring_layout.html\n", "network_graph = from_networkx(G, networkx.spring_layout, scale=10, center=(0, 0))\n", "\n", "#Set node sizes and colors according to node degree (color as category from attribute)\n", "network_graph.node_renderer.glyph = Circle(size=size_by_this_attribute, fill_color=color_by_this_attribute)\n", "#Set node highlight colors\n", "network_graph.node_renderer.hover_glyph = Circle(size=size_by_this_attribute, fill_color=node_highlight_color, line_width=2)\n", "network_graph.node_renderer.selection_glyph = Circle(size=size_by_this_attribute, fill_color=node_highlight_color, line_width=2)\n", "\n", "#Set edge opacity and width\n", "network_graph.edge_renderer.glyph = MultiLine(line_alpha=0.5, line_width=1)\n", "#Set edge highlight colors\n", "network_graph.edge_renderer.selection_glyph = MultiLine(line_color=edge_highlight_color, line_width=2)\n", "network_graph.edge_renderer.hover_glyph = MultiLine(line_color=edge_highlight_color, line_width=2)\n", "\n", " #Highlight nodes and edges\n", "network_graph.selection_policy = NodesAndLinkedEdges()\n", "network_graph.inspection_policy = NodesAndLinkedEdges()\n", "\n", "plot.renderers.append(network_graph)\n", "\n", "show(plot)\n", "#save(plot, filename=f\"{title}.html\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Network with Labels" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The code below shows how to create node labels, which you can read more about in [Bokeh's label documentation](https://docs.bokeh.org/en/latest/docs/user_guide/annotations.html#labels)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Include LabelSet**" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "from bokeh.io import output_notebook, show, save\n", "from bokeh.models import Range1d, Circle, ColumnDataSource, MultiLine, EdgesAndLinkedNodes, NodesAndLinkedEdges, LabelSet\n", "from bokeh.plotting import figure\n", "from bokeh.plotting import from_networkx\n", "from bokeh.palettes import Blues8, Reds8, Purples8, Oranges8, Viridis8, Spectral8\n", "from bokeh.transform import linear_cmap\n", "from networkx.algorithms import community" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Calculate degree for each node and add as node attribute**" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "tags": [ "hide-input" ] }, "outputs": [], "source": [ "degrees = dict(networkx.degree(G))\n", "networkx.set_node_attributes(G, name='degree', values=degrees)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Slightly adjust degree so that the nodes with very small degrees are still visible**" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "tags": [ "hide-input" ] }, "outputs": [], "source": [ "number_to_adjust_by = 5\n", "adjusted_node_size = dict([(node, degree+number_to_adjust_by) for node, degree in networkx.degree(G)])\n", "networkx.set_node_attributes(G, name='adjusted_node_size', values=adjusted_node_size)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Calculate communities**" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "tags": [ "hide-input" ] }, "outputs": [], "source": [ "communities = community.greedy_modularity_communities(G)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Add modularity class and color as attributes to network graph**" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "tags": [ "hide-input" ] }, "outputs": [], "source": [ "# Create empty dictionaries\n", "modularity_class = {}\n", "modularity_color = {}\n", "#Loop through each community in the network\n", "for community_number, community in enumerate(communities):\n", " #For each member of the community, add their community number and a distinct color\n", " for name in community: \n", " modularity_class[name] = community_number\n", " modularity_color[name] = Spectral8[community_number]" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\n", "\n", "\n", "
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": "(function(root) {\n function embed_document(root) {\n \n var docs_json = {\"660f0b46-c85a-491e-8339-49b5a74481b4\":{\"roots\":{\"references\":[{\"attributes\":{\"below\":[{\"id\":\"1928\"}],\"center\":[{\"id\":\"1931\"},{\"id\":\"1935\"}],\"left\":[{\"id\":\"1932\"}],\"renderers\":[{\"id\":\"1947\"},{\"id\":\"1992\"}],\"title\":{\"id\":\"1920\"},\"toolbar\":{\"id\":\"1941\"},\"x_range\":{\"id\":\"1917\"},\"x_scale\":{\"id\":\"1924\"},\"y_range\":{\"id\":\"1918\"},\"y_scale\":{\"id\":\"1926\"}},\"id\":\"1919\",\"subtype\":\"Figure\",\"type\":\"Plot\"},{\"attributes\":{\"background_fill_alpha\":{\"value\":0.7},\"background_fill_color\":{\"value\":\"white\"},\"source\":{\"id\":\"1991\"},\"text\":{\"field\":\"name\"},\"text_font_size\":{\"value\":\"10px\"},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1992\",\"type\":\"LabelSet\"},{\"attributes\":{\"data\":{\"adjusted_node_size\":[10,9,20,9,29,23,41,27,8,17,6,12,24,7,11,19,13,25,9,17,23,31,11,9,18,10,11,14,9,11,6,9,9,7,10,7,9,12,9,10,10,13,23,13,8,7,15,12,30,9,31,19,10,11,12,9,10,12,10,6,9,9,9,19,6,11,6,7,6,11,8,6,10,6,6,17,8,9,6,13,10,11,7,11,12,9,8,9,6,10,9,7,9,9,7,6,7,8,8,7,8,7,6,7,6,6,6],\"degree\":[5,4,15,4,24,18,36,22,3,12,1,7,19,2,6,14,8,20,4,12,18,26,6,4,13,5,6,9,4,6,1,4,4,2,5,2,4,7,4,5,5,8,18,8,3,2,10,7,25,4,26,14,5,6,7,4,5,7,5,1,4,4,4,14,1,6,1,2,1,6,3,1,5,1,1,12,3,4,1,8,5,6,2,6,7,4,3,4,1,5,4,2,4,4,2,1,2,3,3,2,3,2,1,2,1,1,1],\"index\":[\"Aemon\",\"Grenn\",\"Samwell\",\"Aerys\",\"Jaime\",\"Robert\",\"Tyrion\",\"Tywin\",\"Alliser\",\"Mance\",\"Amory\",\"Oberyn\",\"Arya\",\"Anguy\",\"Beric\",\"Bran\",\"Brynden\",\"Cersei\",\"Gendry\",\"Gregor\",\"Joffrey\",\"Jon\",\"Rickon\",\"Roose\",\"Sandor\",\"Thoros\",\"Balon\",\"Loras\",\"Belwas\",\"Barristan\",\"Illyrio\",\"Hodor\",\"Jojen\",\"Luwin\",\"Meera\",\"Nan\",\"Theon\",\"Brienne\",\"Bronn\",\"Podrick\",\"Lothar\",\"Walder\",\"Catelyn\",\"Edmure\",\"Hoster\",\"Jeyne\",\"Lysa\",\"Petyr\",\"Robb\",\"Roslin\",\"Sansa\",\"Stannis\",\"Elia\",\"Ilyn\",\"Meryn\",\"Pycelle\",\"Shae\",\"Varys\",\"Craster\",\"Karl\",\"Daario\",\"Drogo\",\"Irri\",\"Daenerys\",\"Aegon\",\"Jorah\",\"Kraznys\",\"Missandei\",\"Rakharo\",\"Rhaegar\",\"Viserys\",\"Worm\",\"Davos\",\"Cressen\",\"Salladhor\",\"Eddard\",\"Eddison\",\"Gilly\",\"Qyburn\",\"Renly\",\"Tommen\",\"Janos\",\"Bowen\",\"Kevan\",\"Margaery\",\"Myrcella\",\"Dalla\",\"Melisandre\",\"Orell\",\"Qhorin\",\"Rattleshirt\",\"Styr\",\"Val\",\"Ygritte\",\"Jon Arryn\",\"Lancel\",\"Olenna\",\"Marillion\",\"Robert Arryn\",\"Ellaria\",\"Mace\",\"Rickard\",\"Ramsay\",\"Chataya\",\"Shireen\",\"Doran\",\"Walton\"],\"modularity_class\":[1,1,1,0,0,3,0,0,1,1,0,0,2,4,4,2,2,2,4,0,0,1,2,2,0,4,0,0,3,3,3,1,1,2,1,2,2,2,0,0,2,2,2,2,2,2,2,2,2,2,2,1,0,0,0,0,0,0,1,1,3,3,3,3,3,3,3,3,3,3,3,3,1,1,1,2,1,1,0,0,0,1,1,0,0,0,1,1,1,1,1,1,1,1,3,0,0,2,2,0,0,2,2,0,1,0,0],\"modularity_color\":[\"#66c2a5\",\"#66c2a5\",\"#66c2a5\",\"#3288bd\",\"#3288bd\",\"#e6f598\",\"#3288bd\",\"#3288bd\",\"#66c2a5\",\"#66c2a5\",\"#3288bd\",\"#3288bd\",\"#abdda4\",\"#fee08b\",\"#fee08b\",\"#abdda4\",\"#abdda4\",\"#abdda4\",\"#fee08b\",\"#3288bd\",\"#3288bd\",\"#66c2a5\",\"#abdda4\",\"#abdda4\",\"#3288bd\",\"#fee08b\",\"#3288bd\",\"#3288bd\",\"#e6f598\",\"#e6f598\",\"#e6f598\",\"#66c2a5\",\"#66c2a5\",\"#abdda4\",\"#66c2a5\",\"#abdda4\",\"#abdda4\",\"#abdda4\",\"#3288bd\",\"#3288bd\",\"#abdda4\",\"#abdda4\",\"#abdda4\",\"#abdda4\",\"#abdda4\",\"#abdda4\",\"#abdda4\",\"#abdda4\",\"#abdda4\",\"#abdda4\",\"#abdda4\",\"#66c2a5\",\"#3288bd\",\"#3288bd\",\"#3288bd\",\"#3288bd\",\"#3288bd\",\"#3288bd\",\"#66c2a5\",\"#66c2a5\",\"#e6f598\",\"#e6f598\",\"#e6f598\",\"#e6f598\",\"#e6f598\",\"#e6f598\",\"#e6f598\",\"#e6f598\",\"#e6f598\",\"#e6f598\",\"#e6f598\",\"#e6f598\",\"#66c2a5\",\"#66c2a5\",\"#66c2a5\",\"#abdda4\",\"#66c2a5\",\"#66c2a5\",\"#3288bd\",\"#3288bd\",\"#3288bd\",\"#66c2a5\",\"#66c2a5\",\"#3288bd\",\"#3288bd\",\"#3288bd\",\"#66c2a5\",\"#66c2a5\",\"#66c2a5\",\"#66c2a5\",\"#66c2a5\",\"#66c2a5\",\"#66c2a5\",\"#66c2a5\",\"#e6f598\",\"#3288bd\",\"#3288bd\",\"#abdda4\",\"#abdda4\",\"#3288bd\",\"#3288bd\",\"#abdda4\",\"#abdda4\",\"#3288bd\",\"#66c2a5\",\"#3288bd\",\"#3288bd\"]},\"selected\":{\"id\":\"2083\"},\"selection_policy\":{\"id\":\"2084\"}},\"id\":\"1949\",\"type\":\"ColumnDataSource\"},{\"attributes\":{\"fill_color\":{\"field\":\"modularity_color\"},\"size\":{\"field\":\"adjusted_node_size\",\"units\":\"screen\"}},\"id\":\"1957\",\"type\":\"Circle\"},{\"attributes\":{\"callback\":null,\"tooltips\":[[\"Character\",\"@index\"],[\"Degree\",\"@degree\"],[\"Modularity Class\",\"@modularity_class\"],[\"Modularity Color\",\"$color[swatch]:modularity_color\"]]},\"id\":\"1940\",\"type\":\"HoverTool\"},{\"attributes\":{},\"id\":\"1987\",\"type\":\"NodesAndLinkedEdges\"},{\"attributes\":{\"line_width\":{\"value\":2}},\"id\":\"1977\",\"type\":\"MultiLine\"},{\"attributes\":{},\"id\":\"1936\",\"type\":\"PanTool\"},{\"attributes\":{\"text\":\"Game of Thrones Network\"},\"id\":\"1920\",\"type\":\"Title\"},{\"attributes\":{},\"id\":\"1933\",\"type\":\"BasicTicker\"},{\"attributes\":{},\"id\":\"1937\",\"type\":\"WheelZoomTool\"},{\"attributes\":{\"formatter\":{\"id\":\"2070\"},\"ticker\":{\"id\":\"1933\"}},\"id\":\"1932\",\"type\":\"LinearAxis\"},{\"attributes\":{},\"id\":\"1938\",\"type\":\"SaveTool\"},{\"attributes\":{\"active_drag\":\"auto\",\"active_inspect\":\"auto\",\"active_multi\":null,\"active_scroll\":{\"id\":\"1937\"},\"active_tap\":\"auto\",\"tools\":[{\"id\":\"1936\"},{\"id\":\"1937\"},{\"id\":\"1938\"},{\"id\":\"1939\"},{\"id\":\"1940\"}]},\"id\":\"1941\",\"type\":\"Toolbar\"},{\"attributes\":{\"end\":10.1,\"start\":-10.1},\"id\":\"1917\",\"type\":\"Range1d\"},{\"attributes\":{},\"id\":\"1939\",\"type\":\"ResetTool\"},{\"attributes\":{},\"id\":\"2072\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{\"end\":10.1,\"start\":-10.1},\"id\":\"1918\",\"type\":\"Range1d\"},{\"attributes\":{},\"id\":\"1929\",\"type\":\"BasicTicker\"},{\"attributes\":{\"graph_layout\":{\"Aegon\":[-9.267116399526605,-2.852032161892104],\"Aemon\":[2.4718481019343974,0.8109718333223602],\"Aerys\":[-2.2888397930175803,-0.7750322314848148],\"Alliser\":[5.222579887022988,0.8607511764340283],\"Amory\":[-1.8018058139371147,-6.1536288794481395],\"Anguy\":[2.907434601749348,-2.4878647136265304],\"Arya\":[0.9319416059569452,-0.23729966524887064],\"Balon\":[0.456195992065302,0.01829735827255297],\"Barristan\":[-4.837121266836228,-1.1425158433643394],\"Belwas\":[-7.651147379449702,-2.682684345446992],\"Beric\":[1.9879208942004043,-1.7606310059770307],\"Bowen\":[5.67070199364272,1.971497488726829],\"Bran\":[2.1551754391915923,2.3475532192521396],\"Brienne\":[-0.5817683018470604,0.8936433108079538],\"Bronn\":[-0.19852919668866603,-3.063947981635175],\"Brynden\":[-0.12652158274538153,2.213603832421868],\"Catelyn\":[-0.5506849890248303,1.4014744992570545],\"Cersei\":[-0.8469377348671245,-0.8688151210050278],\"Chataya\":[-2.504522309019083,-3.3139614122978442],\"Craster\":[6.676330384538565,1.9361818484635804],\"Cressen\":[8.857306922206178,-2.8945537667942243],\"Daario\":[-8.781709572083258,-1.8682380050340444],\"Daenerys\":[-7.0748697716420414,-1.2915188227776342],\"Dalla\":[5.380649239010833,-0.46452969277882045],\"Davos\":[6.227567277761595,-2.3049010229927736],\"Doran\":[-0.4437057380585732,-4.534374175620815],\"Drogo\":[-8.701485365473784,-1.3131158277465627],\"Eddard\":[0.9294874183540571,0.35647259866424635],\"Eddison\":[5.360945275202828,2.7079608756761564],\"Edmure\":[-1.5820778519340228,2.2771754863030997],\"Elia\":[-2.613141307015798,-1.5595139541730834],\"Ellaria\":[-1.511304239328749,-4.249853236798516],\"Gendry\":[1.824065284015211,-2.665565410403011],\"Gilly\":[6.011723831341086,1.6129979572397688],\"Gregor\":[-0.7444661384070703,-1.8052137664477845],\"Grenn\":[4.485182035457137,2.183540061029949],\"Hodor\":[2.503564526517167,3.6350193956294916],\"Hoster\":[-2.794759196822601,2.5086866913943724],\"Illyrio\":[-9.805426426588399,-4.225074695568137],\"Ilyn\":[-0.5598076908954763,-2.509375313379561],\"Irri\":[-9.403008928091923,-1.0608980851079246],\"Jaime\":[-1.2401362298644412,-0.07070686298717842],\"Janos\":[3.618671830235957,0.31116761422026],\"Jeyne\":[-1.3459833699507968,3.4227814342979856],\"Joffrey\":[-0.07064281152898393,-0.8845386659290816],\"Jojen\":[3.912684434738732,3.658189158361642],\"Jon\":[3.673685695670901,0.9916561973080746],\"Jon Arryn\":[-3.412713256872674,0.4297747965492498],\"Jorah\":[-7.1138799245722515,-1.7960796059259734],\"Karl\":[9.330479643944306,2.767293405372129],\"Kevan\":[-1.2263733036240367,0.9733331640308357],\"Kraznys\":[-9.325129992199773,0.10204532419628971],\"Lancel\":[-1.6156569676379509,4.20292924579528],\"Loras\":[0.2856539466780255,0.4384043371485052],\"Lothar\":[-0.8435059832524544,3.559634719748982],\"Luwin\":[3.459245414892775,5.1236683454862595],\"Lysa\":[-1.7510671241484186,0.8733507771166596],\"Mace\":[-0.7285667816779314,-3.169189239013445],\"Mance\":[5.502848888687161,0.6001926226538951],\"Margaery\":[0.7581682926391037,-0.9596664750228591],\"Marillion\":[-1.7911118579615557,2.559471570077881],\"Meera\":[3.895015964435522,2.967642424509825],\"Melisandre\":[4.625170830099206,-0.59616976233094],\"Meryn\":[-1.1076840633939196,-1.9938085213605483],\"Missandei\":[-9.780421676239728,-0.5180692470683579],\"Myrcella\":[1.0356761085327812,-1.7301670568930159],\"Nan\":[2.8725207078464803,5.355238750677048],\"Oberyn\":[-1.111683196599865,-3.2136710454610578],\"Olenna\":[0.8422128446425984,2.383681197557596],\"Orell\":[6.110988024551446,3.1248043907962537],\"Petyr\":[-1.106886510574535,0.6676699538432879],\"Podrick\":[0.15653069662535493,-2.0442599103339565],\"Pycelle\":[-1.8146662837186787,-2.105213910811399],\"Qhorin\":[6.0569745244885995,0.9067560657984534],\"Qyburn\":[-3.971106462515228,1.299890316256581],\"Rakharo\":[-9.762756972766516,-2.2196482471502614],\"Ramsay\":[-1.4697525953607657,4.67989251471613],\"Rattleshirt\":[6.6373223689221765,0.5095947508126439],\"Renly\":[0.013758234231490904,-0.4705228345366546],\"Rhaegar\":[-4.8045852697526525,-1.5158094707474055],\"Rickard\":[0.3016379641841547,4.157796291938347],\"Rickon\":[1.549572159552759,1.5035374578014609],\"Robb\":[0.36750841629718767,1.640617589205102],\"Robert\":[-1.2357328001955872,-0.4882958127046028],\"Robert Arryn\":[-1.1287497981636072,2.6471849991815177],\"Roose\":[-0.39910592243166565,1.8219523235979767],\"Roslin\":[-2.0728104539881786,3.4837832612906205],\"Salladhor\":[8.610826474007569,-3.565796910708183],\"Samwell\":[4.3976731298779885,1.5076621278375715],\"Sandor\":[0.26850249413240684,-1.4850771053465217],\"Sansa\":[0.07009714728420968,0.4191496526293016],\"Shae\":[-1.870333172942337,-1.6597930259319502],\"Shireen\":[8.14422565547006,-4.126464517433635],\"Stannis\":[1.8242545976690117,-0.18286847892593278],\"Styr\":[6.7424197701689375,1.1596366611354758],\"Theon\":[2.574114866252931,2.516464497485737],\"Thoros\":[0.9301344782670586,-2.313279264650353],\"Tommen\":[0.5772673576265163,-1.5209669737971567],\"Tyrion\":[-0.5995100502945213,-1.2260219985604424],\"Tywin\":[-0.3613288615430937,-0.4629333594391791],\"Val\":[3.4440507519844967,-0.401728310573337],\"Varys\":[-1.6958620465225696,-0.8981670251997967],\"Viserys\":[-4.364549811636098,-1.956104628530263],\"Walder\":[-1.0509371890377717,2.1267047194562148],\"Walton\":[-4.2087362536976505,0.4462958963751465],\"Worm\":[-10.0,-1.4685499025177733],\"Ygritte\":[6.402209563161067,0.053031118779362]}},\"id\":\"1956\",\"type\":\"StaticLayoutProvider\"},{\"attributes\":{},\"id\":\"2085\",\"type\":\"Selection\"},{\"attributes\":{\"data_source\":{\"id\":\"1953\"},\"glyph\":{\"id\":\"1972\"},\"hover_glyph\":{\"id\":\"1982\"},\"muted_glyph\":null,\"selection_glyph\":{\"id\":\"1977\"},\"view\":{\"id\":\"1955\"}},\"id\":\"1954\",\"type\":\"GlyphRenderer\"},{\"attributes\":{},\"id\":\"1989\",\"type\":\"NodesAndLinkedEdges\"},{\"attributes\":{\"fill_color\":{\"value\":\"white\"},\"line_width\":{\"value\":2},\"size\":{\"field\":\"adjusted_node_size\",\"units\":\"screen\"}},\"id\":\"1962\",\"type\":\"Circle\"},{\"attributes\":{\"line_width\":{\"value\":2}},\"id\":\"1982\",\"type\":\"MultiLine\"},{\"attributes\":{\"axis\":{\"id\":\"1928\"},\"ticker\":null},\"id\":\"1931\",\"type\":\"Grid\"},{\"attributes\":{\"data_source\":{\"id\":\"1949\"},\"glyph\":{\"id\":\"1957\"},\"hover_glyph\":{\"id\":\"1962\"},\"muted_glyph\":null,\"selection_glyph\":{\"id\":\"1967\"},\"view\":{\"id\":\"1951\"}},\"id\":\"1950\",\"type\":\"GlyphRenderer\"},{\"attributes\":{\"data\":{\"name\":[\"Aemon\",\"Grenn\",\"Samwell\",\"Aerys\",\"Jaime\",\"Robert\",\"Tyrion\",\"Tywin\",\"Alliser\",\"Mance\",\"Amory\",\"Oberyn\",\"Arya\",\"Anguy\",\"Beric\",\"Bran\",\"Brynden\",\"Cersei\",\"Gendry\",\"Gregor\",\"Joffrey\",\"Jon\",\"Rickon\",\"Roose\",\"Sandor\",\"Thoros\",\"Balon\",\"Loras\",\"Belwas\",\"Barristan\",\"Illyrio\",\"Hodor\",\"Jojen\",\"Luwin\",\"Meera\",\"Nan\",\"Theon\",\"Brienne\",\"Bronn\",\"Podrick\",\"Lothar\",\"Walder\",\"Catelyn\",\"Edmure\",\"Hoster\",\"Jeyne\",\"Lysa\",\"Petyr\",\"Robb\",\"Roslin\",\"Sansa\",\"Stannis\",\"Elia\",\"Ilyn\",\"Meryn\",\"Pycelle\",\"Shae\",\"Varys\",\"Craster\",\"Karl\",\"Daario\",\"Drogo\",\"Irri\",\"Daenerys\",\"Aegon\",\"Jorah\",\"Kraznys\",\"Missandei\",\"Rakharo\",\"Rhaegar\",\"Viserys\",\"Worm\",\"Davos\",\"Cressen\",\"Salladhor\",\"Eddard\",\"Eddison\",\"Gilly\",\"Qyburn\",\"Renly\",\"Tommen\",\"Janos\",\"Bowen\",\"Kevan\",\"Margaery\",\"Myrcella\",\"Dalla\",\"Melisandre\",\"Orell\",\"Qhorin\",\"Rattleshirt\",\"Styr\",\"Val\",\"Ygritte\",\"Jon Arryn\",\"Lancel\",\"Olenna\",\"Marillion\",\"Robert Arryn\",\"Ellaria\",\"Mace\",\"Rickard\",\"Ramsay\",\"Chataya\",\"Shireen\",\"Doran\",\"Walton\"],\"x\":[2.4718481019343974,4.485182035457137,4.3976731298779885,-2.2888397930175803,-1.2401362298644412,-1.2357328001955872,-0.5995100502945213,-0.3613288615430937,5.222579887022988,5.502848888687161,-1.8018058139371147,-1.111683196599865,0.9319416059569452,2.907434601749348,1.9879208942004043,2.1551754391915923,-0.12652158274538153,-0.8469377348671245,1.824065284015211,-0.7444661384070703,-0.07064281152898393,3.673685695670901,1.549572159552759,-0.39910592243166565,0.26850249413240684,0.9301344782670586,0.456195992065302,0.2856539466780255,-7.651147379449702,-4.837121266836228,-9.805426426588399,2.503564526517167,3.912684434738732,3.459245414892775,3.895015964435522,2.8725207078464803,2.574114866252931,-0.5817683018470604,-0.19852919668866603,0.15653069662535493,-0.8435059832524544,-1.0509371890377717,-0.5506849890248303,-1.5820778519340228,-2.794759196822601,-1.3459833699507968,-1.7510671241484186,-1.106886510574535,0.36750841629718767,-2.0728104539881786,0.07009714728420968,1.8242545976690117,-2.613141307015798,-0.5598076908954763,-1.1076840633939196,-1.8146662837186787,-1.870333172942337,-1.6958620465225696,6.676330384538565,9.330479643944306,-8.781709572083258,-8.701485365473784,-9.403008928091923,-7.0748697716420414,-9.267116399526605,-7.1138799245722515,-9.325129992199773,-9.780421676239728,-9.762756972766516,-4.8045852697526525,-4.364549811636098,-10.0,6.227567277761595,8.857306922206178,8.610826474007569,0.9294874183540571,5.360945275202828,6.011723831341086,-3.971106462515228,0.013758234231490904,0.5772673576265163,3.618671830235957,5.67070199364272,-1.2263733036240367,0.7581682926391037,1.0356761085327812,5.380649239010833,4.625170830099206,6.110988024551446,6.0569745244885995,6.6373223689221765,6.7424197701689375,3.4440507519844967,6.402209563161067,-3.412713256872674,-1.6156569676379509,0.8422128446425984,-1.7911118579615557,-1.1287497981636072,-1.511304239328749,-0.7285667816779314,0.3016379641841547,-1.4697525953607657,-2.504522309019083,8.14422565547006,-0.4437057380585732,-4.2087362536976505],\"y\":[0.8109718333223602,2.183540061029949,1.5076621278375715,-0.7750322314848148,-0.07070686298717842,-0.4882958127046028,-1.2260219985604424,-0.4629333594391791,0.8607511764340283,0.6001926226538951,-6.1536288794481395,-3.2136710454610578,-0.23729966524887064,-2.4878647136265304,-1.7606310059770307,2.3475532192521396,2.213603832421868,-0.8688151210050278,-2.665565410403011,-1.8052137664477845,-0.8845386659290816,0.9916561973080746,1.5035374578014609,1.8219523235979767,-1.4850771053465217,-2.313279264650353,0.01829735827255297,0.4384043371485052,-2.682684345446992,-1.1425158433643394,-4.225074695568137,3.6350193956294916,3.658189158361642,5.1236683454862595,2.967642424509825,5.355238750677048,2.516464497485737,0.8936433108079538,-3.063947981635175,-2.0442599103339565,3.559634719748982,2.1267047194562148,1.4014744992570545,2.2771754863030997,2.5086866913943724,3.4227814342979856,0.8733507771166596,0.6676699538432879,1.640617589205102,3.4837832612906205,0.4191496526293016,-0.18286847892593278,-1.5595139541730834,-2.509375313379561,-1.9938085213605483,-2.105213910811399,-1.6597930259319502,-0.8981670251997967,1.9361818484635804,2.767293405372129,-1.8682380050340444,-1.3131158277465627,-1.0608980851079246,-1.2915188227776342,-2.852032161892104,-1.7960796059259734,0.10204532419628971,-0.5180692470683579,-2.2196482471502614,-1.5158094707474055,-1.956104628530263,-1.4685499025177733,-2.3049010229927736,-2.8945537667942243,-3.565796910708183,0.35647259866424635,2.7079608756761564,1.6129979572397688,1.299890316256581,-0.4705228345366546,-1.5209669737971567,0.31116761422026,1.971497488726829,0.9733331640308357,-0.9596664750228591,-1.7301670568930159,-0.46452969277882045,-0.59616976233094,3.1248043907962537,0.9067560657984534,0.5095947508126439,1.1596366611354758,-0.401728310573337,0.053031118779362,0.4297747965492498,4.20292924579528,2.383681197557596,2.559471570077881,2.6471849991815177,-4.249853236798516,-3.169189239013445,4.157796291938347,4.67989251471613,-3.3139614122978442,-4.126464517433635,-4.534374175620815,0.4462958963751465]},\"selected\":{\"id\":\"2081\"},\"selection_policy\":{\"id\":\"2082\"}},\"id\":\"1991\",\"type\":\"ColumnDataSource\"},{\"attributes\":{\"source\":{\"id\":\"1953\"}},\"id\":\"1955\",\"type\":\"CDSView\"},{\"attributes\":{\"line_alpha\":{\"value\":0.3}},\"id\":\"1972\",\"type\":\"MultiLine\"},{\"attributes\":{\"formatter\":{\"id\":\"2072\"},\"ticker\":{\"id\":\"1929\"}},\"id\":\"1928\",\"type\":\"LinearAxis\"},{\"attributes\":{\"source\":{\"id\":\"1949\"}},\"id\":\"1951\",\"type\":\"CDSView\"},{\"attributes\":{},\"id\":\"2081\",\"type\":\"Selection\"},{\"attributes\":{},\"id\":\"1926\",\"type\":\"LinearScale\"},{\"attributes\":{\"fill_color\":{\"value\":\"white\"},\"line_width\":{\"value\":2},\"size\":{\"field\":\"adjusted_node_size\",\"units\":\"screen\"}},\"id\":\"1967\",\"type\":\"Circle\"},{\"attributes\":{},\"id\":\"2084\",\"type\":\"UnionRenderers\"},{\"attributes\":{},\"id\":\"2070\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{\"data\":{\"Weight\":[5,31,30,4,4,8,25,43,11,11,52,7,5,6,34,12,36,6,10,5,13,18,6,5,8,11,19,36,6,6,4,88,5,4,6,15,16,11,11,7,17,5,8,31,15,10,13,10,4,16,5,10,5,6,6,5,4,5,4,6,5,9,11,5,5,46,54,5,4,12,77,4,31,5,5,5,4,22,5,5,11,6,9,7,5,25,12,28,11,6,4,21,6,18,39,4,4,12,5,4,16,7,13,14,5,6,4,5,5,15,4,4,6,4,5,9,15,4,69,11,8,7,10,9,7,8,12,5,24,4,6,6,11,23,9,6,5,43,7,6,7,8,5,46,18,18,15,22,4,4,21,8,15,96,46,12,4,54,14,35,11,4,15,23,10,4,5,8,7,4,17,4,5,4,4,6,7,23,10,4,6,4,4,6,4,16,7,5,5,9,7,7,12,5,4,8,7,28,5,5,14,10,9,10,35,8,7,6,4,9,8,4,7,6,31,20,9,16,8,12,54,14,4,8,8,15,7,4,4,4,5,4,4,10,6,4,6,4,7,9,5,8,14,18,10,26,13,20,11,5,35,41,5,33,4,11,7,6,5,19,4,8,4,4,10,12,19,9,26,6,6,16,9,10,8,5,43,6,8,4,5,16,9,32,6,18,5,10,29,9,28,5,28,13,4,7,15,4,6,5,36,9,4,7,4,6,8,32,20,15,7,5,4,4,8,5,4,6,17,4,5,14,7,18,7,6,17,4,8,47,10,26,7,12,8,14,5,7,4,16,30,5,7,5,5,5,7,7,6,7,9,4],\"end\":[\"Grenn\",\"Samwell\",\"Jon\",\"Robert\",\"Stannis\",\"Eddison\",\"Jon\",\"Samwell\",\"Bran\",\"Jojen\",\"Jon\",\"Meera\",\"Melisandre\",\"Bowen\",\"Craster\",\"Eddison\",\"Gilly\",\"Janos\",\"Mance\",\"Qhorin\",\"Stannis\",\"Jaime\",\"Robert\",\"Tyrion\",\"Tywin\",\"Arya\",\"Catelyn\",\"Cersei\",\"Eddard\",\"Balon\",\"Barristan\",\"Brienne\",\"Edmure\",\"Elia\",\"Gregor\",\"Joffrey\",\"Loras\",\"Meryn\",\"Qyburn\",\"Renly\",\"Robert\",\"Stannis\",\"Tommen\",\"Tyrion\",\"Robb\",\"Sansa\",\"Tywin\",\"Walton\",\"Arya\",\"Cersei\",\"Daenerys\",\"Eddard\",\"Jon\",\"Jon Arryn\",\"Rhaegar\",\"Barristan\",\"Renly\",\"Stannis\",\"Thoros\",\"Sandor\",\"Sansa\",\"Tyrion\",\"Tywin\",\"Arya\",\"Catelyn\",\"Cersei\",\"Joffrey\",\"Lysa\",\"Myrcella\",\"Robb\",\"Sansa\",\"Balon\",\"Bronn\",\"Chataya\",\"Doran\",\"Elia\",\"Ellaria\",\"Gregor\",\"Ilyn\",\"Janos\",\"Kevan\",\"Loras\",\"Mace\",\"Margaery\",\"Meryn\",\"Oberyn\",\"Petyr\",\"Podrick\",\"Pycelle\",\"Renly\",\"Sandor\",\"Shae\",\"Stannis\",\"Varys\",\"Tywin\",\"Viserys\",\"Lysa\",\"Robb\",\"Balon\",\"Brynden\",\"Cersei\",\"Gregor\",\"Joffrey\",\"Kevan\",\"Mace\",\"Oberyn\",\"Petyr\",\"Podrick\",\"Pycelle\",\"Stannis\",\"Tommen\",\"Val\",\"Varys\",\"Walder\",\"Mance\",\"Janos\",\"Jon\",\"Janos\",\"Jon\",\"Craster\",\"Dalla\",\"Gilly\",\"Qhorin\",\"Rattleshirt\",\"Styr\",\"Val\",\"Ygritte\",\"Oberyn\",\"Gregor\",\"Joffrey\",\"Ellaria\",\"Mace\",\"Anguy\",\"Beric\",\"Bran\",\"Brynden\",\"Cersei\",\"Gendry\",\"Gregor\",\"Joffrey\",\"Jon\",\"Rickon\",\"Roose\",\"Sandor\",\"Thoros\",\"Eddard\",\"Robb\",\"Sansa\",\"Beric\",\"Gendry\",\"Thoros\",\"Eddard\",\"Sandor\",\"Hodor\",\"Jojen\",\"Jon\",\"Luwin\",\"Meera\",\"Nan\",\"Rickon\",\"Theon\",\"Catelyn\",\"Eddard\",\"Robb\",\"Sansa\",\"Lothar\",\"Walder\",\"Catelyn\",\"Edmure\",\"Rickard\",\"Robb\",\"Catelyn\",\"Brienne\",\"Bronn\",\"Elia\",\"Gregor\",\"Ilyn\",\"Joffrey\",\"Meryn\",\"Pycelle\",\"Sandor\",\"Shae\",\"Varys\",\"Eddard\",\"Lysa\",\"Sansa\",\"Thoros\",\"Sandor\",\"Bronn\",\"Elia\",\"Ilyn\",\"Meryn\",\"Sandor\",\"Joffrey\",\"Ilyn\",\"Kevan\",\"Loras\",\"Margaery\",\"Meryn\",\"Myrcella\",\"Sandor\",\"Stannis\",\"Tommen\",\"Robb\",\"Sansa\",\"Eddard\",\"Craster\",\"Dalla\",\"Eddison\",\"Gilly\",\"Janos\",\"Meera\",\"Melisandre\",\"Orell\",\"Qhorin\",\"Rattleshirt\",\"Stannis\",\"Styr\",\"Theon\",\"Val\",\"Ygritte\",\"Robb\",\"Sansa\",\"Eddard\",\"Theon\",\"Robb\",\"Sansa\",\"Catelyn\",\"Robb\",\"Brienne\",\"Eddard\",\"Ilyn\",\"Meryn\",\"Thoros\",\"Sansa\",\"Loras\",\"Robb\",\"Stannis\",\"Brienne\",\"Margaery\",\"Olenna\",\"Renly\",\"Sansa\",\"Barristan\",\"Illyrio\",\"Daenerys\",\"Jorah\",\"Daenerys\",\"Jorah\",\"Rhaegar\",\"Jojen\",\"Meera\",\"Robb\",\"Meera\",\"Nan\",\"Robb\",\"Catelyn\",\"Robb\",\"Sansa\",\"Podrick\",\"Margaery\",\"Sansa\",\"Edmure\",\"Roslin\",\"Robb\",\"Walder\",\"Catelyn\",\"Edmure\",\"Robb\",\"Petyr\",\"Roslin\",\"Edmure\",\"Hoster\",\"Jeyne\",\"Lysa\",\"Petyr\",\"Robb\",\"Roslin\",\"Sansa\",\"Stannis\",\"Eddard\",\"Roslin\",\"Hoster\",\"Robb\",\"Lysa\",\"Robb\",\"Jon Arryn\",\"Marillion\",\"Petyr\",\"Robert Arryn\",\"Sansa\",\"Robb\",\"Sansa\",\"Eddard\",\"Ramsay\",\"Rickard\",\"Sansa\",\"Stannis\",\"Eddard\",\"Kevan\",\"Margaery\",\"Marillion\",\"Myrcella\",\"Olenna\",\"Renly\",\"Robert Arryn\",\"Shae\",\"Davos\",\"Melisandre\",\"Renly\",\"Rhaegar\",\"Meryn\",\"Varys\",\"Chataya\",\"Varys\",\"Kevan\",\"Renly\",\"Karl\",\"Gilly\",\"Drogo\",\"Irri\",\"Daenerys\",\"Jorah\",\"Daenerys\",\"Irri\",\"Jorah\",\"Daenerys\",\"Missandei\",\"Aegon\",\"Jorah\",\"Kraznys\",\"Missandei\",\"Rakharo\",\"Rhaegar\",\"Viserys\",\"Worm\",\"Rhaegar\",\"Viserys\",\"Cressen\",\"Salladhor\",\"Melisandre\",\"Shireen\",\"Margaery\",\"Myrcella\",\"Margaery\",\"Bowen\",\"Lancel\",\"Val\",\"Rattleshirt\",\"Ygritte\",\"Ygritte\",\"Robert Arryn\"],\"start\":[\"Aemon\",\"Aemon\",\"Aemon\",\"Aemon\",\"Aemon\",\"Grenn\",\"Grenn\",\"Grenn\",\"Samwell\",\"Samwell\",\"Samwell\",\"Samwell\",\"Samwell\",\"Samwell\",\"Samwell\",\"Samwell\",\"Samwell\",\"Samwell\",\"Samwell\",\"Samwell\",\"Samwell\",\"Aerys\",\"Aerys\",\"Aerys\",\"Aerys\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Jaime\",\"Robert\",\"Robert\",\"Robert\",\"Robert\",\"Robert\",\"Robert\",\"Robert\",\"Robert\",\"Robert\",\"Robert\",\"Robert\",\"Robert\",\"Robert\",\"Robert\",\"Robert\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tyrion\",\"Tywin\",\"Tywin\",\"Tywin\",\"Tywin\",\"Tywin\",\"Tywin\",\"Tywin\",\"Tywin\",\"Tywin\",\"Tywin\",\"Tywin\",\"Tywin\",\"Tywin\",\"Tywin\",\"Tywin\",\"Tywin\",\"Tywin\",\"Tywin\",\"Alliser\",\"Alliser\",\"Alliser\",\"Mance\",\"Mance\",\"Mance\",\"Mance\",\"Mance\",\"Mance\",\"Mance\",\"Mance\",\"Mance\",\"Mance\",\"Amory\",\"Oberyn\",\"Oberyn\",\"Oberyn\",\"Oberyn\",\"Arya\",\"Arya\",\"Arya\",\"Arya\",\"Arya\",\"Arya\",\"Arya\",\"Arya\",\"Arya\",\"Arya\",\"Arya\",\"Arya\",\"Arya\",\"Arya\",\"Arya\",\"Arya\",\"Anguy\",\"Beric\",\"Beric\",\"Beric\",\"Beric\",\"Bran\",\"Bran\",\"Bran\",\"Bran\",\"Bran\",\"Bran\",\"Bran\",\"Bran\",\"Bran\",\"Bran\",\"Bran\",\"Bran\",\"Brynden\",\"Brynden\",\"Brynden\",\"Brynden\",\"Brynden\",\"Brynden\",\"Cersei\",\"Cersei\",\"Cersei\",\"Cersei\",\"Cersei\",\"Cersei\",\"Cersei\",\"Cersei\",\"Cersei\",\"Cersei\",\"Cersei\",\"Cersei\",\"Cersei\",\"Cersei\",\"Cersei\",\"Gendry\",\"Gendry\",\"Gregor\",\"Gregor\",\"Gregor\",\"Gregor\",\"Gregor\",\"Gregor\",\"Joffrey\",\"Joffrey\",\"Joffrey\",\"Joffrey\",\"Joffrey\",\"Joffrey\",\"Joffrey\",\"Joffrey\",\"Joffrey\",\"Joffrey\",\"Joffrey\",\"Jon\",\"Jon\",\"Jon\",\"Jon\",\"Jon\",\"Jon\",\"Jon\",\"Jon\",\"Jon\",\"Jon\",\"Jon\",\"Jon\",\"Jon\",\"Jon\",\"Jon\",\"Jon\",\"Jon\",\"Jon\",\"Rickon\",\"Rickon\",\"Rickon\",\"Rickon\",\"Roose\",\"Roose\",\"Roose\",\"Sandor\",\"Sandor\",\"Sandor\",\"Sandor\",\"Sandor\",\"Balon\",\"Balon\",\"Balon\",\"Loras\",\"Loras\",\"Loras\",\"Loras\",\"Loras\",\"Belwas\",\"Belwas\",\"Belwas\",\"Belwas\",\"Barristan\",\"Barristan\",\"Barristan\",\"Hodor\",\"Hodor\",\"Hodor\",\"Jojen\",\"Luwin\",\"Theon\",\"Brienne\",\"Brienne\",\"Brienne\",\"Bronn\",\"Podrick\",\"Podrick\",\"Lothar\",\"Lothar\",\"Lothar\",\"Lothar\",\"Walder\",\"Walder\",\"Walder\",\"Walder\",\"Walder\",\"Catelyn\",\"Catelyn\",\"Catelyn\",\"Catelyn\",\"Catelyn\",\"Catelyn\",\"Catelyn\",\"Catelyn\",\"Catelyn\",\"Catelyn\",\"Edmure\",\"Edmure\",\"Edmure\",\"Hoster\",\"Jeyne\",\"Lysa\",\"Lysa\",\"Lysa\",\"Lysa\",\"Lysa\",\"Petyr\",\"Petyr\",\"Robb\",\"Robb\",\"Robb\",\"Robb\",\"Robb\",\"Sansa\",\"Sansa\",\"Sansa\",\"Sansa\",\"Sansa\",\"Sansa\",\"Sansa\",\"Sansa\",\"Sansa\",\"Stannis\",\"Stannis\",\"Stannis\",\"Elia\",\"Ilyn\",\"Pycelle\",\"Shae\",\"Shae\",\"Varys\",\"Varys\",\"Craster\",\"Craster\",\"Daario\",\"Daario\",\"Daario\",\"Daario\",\"Drogo\",\"Drogo\",\"Drogo\",\"Irri\",\"Irri\",\"Daenerys\",\"Daenerys\",\"Daenerys\",\"Daenerys\",\"Daenerys\",\"Daenerys\",\"Daenerys\",\"Daenerys\",\"Jorah\",\"Rhaegar\",\"Davos\",\"Davos\",\"Davos\",\"Davos\",\"Renly\",\"Tommen\",\"Tommen\",\"Janos\",\"Kevan\",\"Dalla\",\"Qhorin\",\"Qhorin\",\"Rattleshirt\",\"Marillion\"]},\"selected\":{\"id\":\"2085\"},\"selection_policy\":{\"id\":\"2086\"}},\"id\":\"1953\",\"type\":\"ColumnDataSource\"},{\"attributes\":{},\"id\":\"2083\",\"type\":\"Selection\"},{\"attributes\":{\"edge_renderer\":{\"id\":\"1954\"},\"inspection_policy\":{\"id\":\"1989\"},\"layout_provider\":{\"id\":\"1956\"},\"node_renderer\":{\"id\":\"1950\"},\"selection_policy\":{\"id\":\"1987\"}},\"id\":\"1947\",\"type\":\"GraphRenderer\"},{\"attributes\":{},\"id\":\"2082\",\"type\":\"UnionRenderers\"},{\"attributes\":{},\"id\":\"2086\",\"type\":\"UnionRenderers\"},{\"attributes\":{},\"id\":\"1924\",\"type\":\"LinearScale\"},{\"attributes\":{\"axis\":{\"id\":\"1932\"},\"dimension\":1,\"ticker\":null},\"id\":\"1935\",\"type\":\"Grid\"}],\"root_ids\":[\"1919\"]},\"title\":\"Bokeh Application\",\"version\":\"2.1.0\"}};\n var render_items = [{\"docid\":\"660f0b46-c85a-491e-8339-49b5a74481b4\",\"root_ids\":[\"1919\"],\"roots\":{\"1919\":\"4e0d57d9-40c8-4fec-a9b5-6761de88ac2b\"}}];\n root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n\n }\n if (root.Bokeh !== undefined) {\n embed_document(root);\n } else {\n var attempts = 0;\n var timer = setInterval(function(root) {\n if (root.Bokeh !== undefined) {\n clearInterval(timer);\n embed_document(root);\n } else {\n attempts++;\n if (attempts > 100) {\n clearInterval(timer);\n console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n }\n }\n }, 10, root)\n }\n})(window);", "application/vnd.bokehjs_exec.v0+json": "" }, "metadata": { "application/vnd.bokehjs_exec.v0+json": { "id": "1919" } }, "output_type": "display_data" } ], "source": [ "#Choose colors for node and edge highlighting\n", "node_highlight_color = 'white'\n", "edge_highlight_color = 'black'\n", "\n", "#Choose attributes from G network to size and color by — setting manual size (e.g. 10) or color (e.g. 'skyblue') also allowed\n", "size_by_this_attribute = 'adjusted_node_size'\n", "color_by_this_attribute = 'modularity_color'\n", "\n", "#Pick a color palette — Blues8, Reds8, Purples8, Oranges8, Viridis8\n", "color_palette = Blues8\n", "\n", "#Choose a title!\n", "title = 'Game of Thrones Network'\n", "\n", "#Establish which categories will appear when hovering over each node\n", "HOVER_TOOLTIPS = [\n", " (\"Character\", \"@index\"),\n", " (\"Degree\", \"@degree\"),\n", " (\"Modularity Class\", \"@modularity_class\"),\n", " (\"Modularity Color\", \"$color[swatch]:modularity_color\"),\n", "]\n", "\n", "#Create a plot — set dimensions, toolbar, and title\n", "plot = figure(tooltips = HOVER_TOOLTIPS,\n", " tools=\"pan,wheel_zoom,save,reset\", active_scroll='wheel_zoom',\n", " x_range=Range1d(-10.1, 10.1), y_range=Range1d(-10.1, 10.1), title=title)\n", "\n", "#Create a network graph object\n", "# https://networkx.github.io/documentation/networkx-1.9/reference/generated/networkx.drawing.layout.spring_layout.html\n", "network_graph = from_networkx(G, networkx.spring_layout, scale=10, center=(0, 0))\n", "\n", "#Set node sizes and colors according to node degree (color as category from attribute)\n", "network_graph.node_renderer.glyph = Circle(size=size_by_this_attribute, fill_color=color_by_this_attribute)\n", "#Set node highlight colors\n", "network_graph.node_renderer.hover_glyph = Circle(size=size_by_this_attribute, fill_color=node_highlight_color, line_width=2)\n", "network_graph.node_renderer.selection_glyph = Circle(size=size_by_this_attribute, fill_color=node_highlight_color, line_width=2)\n", "\n", "#Set edge opacity and width\n", "network_graph.edge_renderer.glyph = MultiLine(line_alpha=0.3, line_width=1)\n", "#Set edge highlight colors\n", "network_graph.edge_renderer.selection_glyph = MultiLine(line_color=edge_highlight_color, line_width=2)\n", "network_graph.edge_renderer.hover_glyph = MultiLine(line_color=edge_highlight_color, line_width=2)\n", "\n", "#Highlight nodes and edges\n", "network_graph.selection_policy = NodesAndLinkedEdges()\n", "network_graph.inspection_policy = NodesAndLinkedEdges()\n", "\n", "plot.renderers.append(network_graph)\n", "\n", "#Add Labels\n", "x, y = zip(*network_graph.layout_provider.graph_layout.values())\n", "node_labels = list(G.nodes())\n", "source = ColumnDataSource({'x': x, 'y': y, 'name': [node_labels[i] for i in range(len(x))]})\n", "labels = LabelSet(x='x', y='y', text='name', source=source, background_fill_color='white', text_font_size='10px', background_fill_alpha=.7)\n", "plot.renderers.append(labels)\n", "\n", "show(plot)\n", "#save(plot, filename=f\"{title}.html\")" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.8" } }, "nbformat": 4, "nbformat_minor": 4 }