{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import sys\n", "sys.path.append('../')\n", "from pyvis.network import Network" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Basic Example" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "g = Network(notebook=True)\n", "g.add_nodes(range(5))\n", "g.add_edges([\n", " (0, 2),\n", " (0, 3),\n", " (0, 4),\n", " (1, 1),\n", " (1, 3),\n", " (1, 2)\n", "])\n", "g.show(\"example.html\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Dot File example" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "h = Network(notebook=True)\n", "h.from_DOT(\"test.dot\")\n", "\n", "# All properties have to be enclosed by double quotes and \n", "# there and there must be no comma at the end of a list.\n", "# See https://visjs.github.io/vis-network/docs/network/ for all options\n", "h.set_options(\"\"\"\n", "var options = {\n", " \"physics\": {\n", " \"enabled\": true,\n", " \"barnesHut\": {\n", " \"theta\": 0.5,\n", " \"gravitationalConstant\": -2000,\n", " \"centralGravity\": 0.3,\n", " \"springLength\": 200,\n", " \"springConstant\": 0.04,\n", " \"damping\": 0.09,\n", " \"avoidOverlap\": 0\n", " },\n", " \"maxVelocity\": 50,\n", " \"minVelocity\": 0.1,\n", " \"solver\": \"barnesHut\",\n", " \"stabilization\": {\n", " \"enabled\": true,\n", " \"iterations\": 1000,\n", " \"updateInterval\": 100,\n", " \"onlyDynamicEdges\": false,\n", " \"fit\": true\n", " }\n", " }\n", "}\n", "\"\"\")\n", "h.show(\"dot.html\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Basic NetworkX example" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "import networkx as nx" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "scrolled": false }, "outputs": [ { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "nxg = nx.random_tree(20)\n", "g.from_nx(nxg)\n", "g.show(\"example.html\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Disabling Physics interaction" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "g.toggle_physics(False)\n", "g.show(\"example.html\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Explicit coordinates to layout nodes" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "g = Network(notebook=True)\n", "g.add_nodes([1,2,3],\n", " value=[10, 100, 400],\n", " title=[\"I am node 1\", \"node 2 here\", \"and im node 3\"],\n", " x=[21.4, 21.4, 21.4], y=[100.2, 223.54, 32.1],\n", " label=[\"NODE 1\", \"NODE 2\", \"NODE 3\"],\n", " color=[\"#00ff1e\", \"#162347\", \"#dd4b39\"])\n", "g.show(\"example.html\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Full Game of Thrones example" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import pandas as pd\n", "\n", "got_net = Network(notebook=True, height=\"750px\", width=\"100%\", bgcolor=\"#222222\", font_color=\"white\")\n", "\n", "# set the physics layout of the network\n", "got_net.barnes_hut()\n", "got_data = pd.read_csv(\"https://www.macalester.edu/~abeverid/data/stormofswords.csv\")\n", "\n", "sources = got_data['Source']\n", "targets = got_data['Target']\n", "weights = got_data['Weight']\n", "\n", "edge_data = zip(sources, targets, weights)\n", "\n", "for e in edge_data:\n", " src = e[0]\n", " dst = e[1]\n", " w = e[2]\n", "\n", " got_net.add_node(src, src, title=src)\n", " got_net.add_node(dst, dst, title=dst)\n", " got_net.add_edge(src, dst, value=w)\n", "\n", "neighbor_map = got_net.get_adj_list()\n", "\n", "# add neighbor data to node hover data\n", "for node in got_net.nodes:\n", " node[\"title\"] += \" Neighbors:
\" + \"
\".join(neighbor_map[node[\"id\"]])\n", " node[\"value\"] = len(neighbor_map[node[\"id\"]]) # this value attrribute for the node affects node size\n", "\n", "got_net.show(\"example.html\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Experimenting with options UI\n", "Scroll down underneath the graph to play around with the physics settings to acheive optimal layout and behavior. You can use the generate options button to display the JSON representation of the configuration." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "got_net.show_buttons(filter_=\"physics\")\n", "got_net.show(\"example.html\")" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "got_net.set_options('''var options = {\n", " \"physics\": {\n", " \"barnesHut\": {\n", " \"gravitationalConstant\": -80000,\n", " \"springLength\": 250,\n", " \"springConstant\": 0.001\n", " },\n", " \"maxVelocity\": 34,\n", " \"minVelocity\": 0.75\n", " }\n", "}''')" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "import networkx as nx" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "nx_graph = nx.cycle_graph(10)\n", "nx_graph.nodes[1]['title'] = 'Number 1'\n", "nx_graph.nodes[1]['group'] = 1\n", "nx_graph.nodes[3]['title'] = 'I belong to a different group!'\n", "nx_graph.nodes[3]['group'] = 10\n", "nx_graph.add_node(20, size=20, title='couple', group=2)\n", "nx_graph.add_node(21, size=15, title='couple', group=2)\n", "nx_graph.add_edge(20, 21, weight=5)\n", "nx_graph.add_node(25, size=25, label='lonely', title='lonely node', group=3)\n", "\n", "nt = Network(notebook=True, height=\"750px\", width=\"100%\")\n", "\n", "nt.from_nx(nx_graph)\n", "nt.show(\"nx.html\")" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "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.10" } }, "nbformat": 4, "nbformat_minor": 2 }