{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## A 3D graph representing the network of coappearances of characters in Victor Hugo's novel Les Miserables ## "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We define our graph as an `igraph.Graph` object. [Python `igraph`](hhttp://igraph.org/python/)\n",
"is a library for high-performance graph generation and analysis."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import igraph as ig"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Read graph data from a `json` file:"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"import json\n",
"\n",
"data = []\n",
"with open('miserables.json') as f: \n",
" for line in f:\n",
" data.append(json.loads(line)) "
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"{u'links': [{u'source': 1, u'target': 0, u'value': 1},\n",
" {u'source': 2, u'target': 0, u'value': 8},\n",
" {u'source': 3, u'target': 0, u'value': 10},\n",
" {u'source': 3, u'target': 2, u'value': 6},\n",
" {u'source': 4, u'target': 0, u'value': 1},\n",
" {u'source': 5, u'target': 0, u'value': 1},\n",
" {u'source': 6, u'target': 0, u'value': 1},\n",
" {u'source': 7, u'target': 0, u'value': 1},\n",
" {u'source': 8, u'target': 0, u'value': 2},\n",
" {u'source': 9, u'target': 0, u'value': 1},\n",
" {u'source': 11, u'target': 10, u'value': 1},\n",
" {u'source': 11, u'target': 3, u'value': 3},\n",
" {u'source': 11, u'target': 2, u'value': 3},\n",
" {u'source': 11, u'target': 0, u'value': 5},\n",
" {u'source': 12, u'target': 11, u'value': 1},\n",
" {u'source': 13, u'target': 11, u'value': 1},\n",
" {u'source': 14, u'target': 11, u'value': 1},\n",
" {u'source': 15, u'target': 11, u'value': 1},\n",
" {u'source': 17, u'target': 16, u'value': 4},\n",
" {u'source': 18, u'target': 16, u'value': 4},\n",
" {u'source': 18, u'target': 17, u'value': 4},\n",
" {u'source': 19, u'target': 16, u'value': 4},\n",
" {u'source': 19, u'target': 17, u'value': 4},\n",
" {u'source': 19, u'target': 18, u'value': 4},\n",
" {u'source': 20, u'target': 16, u'value': 3},\n",
" {u'source': 20, u'target': 17, u'value': 3},\n",
" {u'source': 20, u'target': 18, u'value': 3},\n",
" {u'source': 20, u'target': 19, u'value': 4},\n",
" {u'source': 21, u'target': 16, u'value': 3},\n",
" {u'source': 21, u'target': 17, u'value': 3},\n",
" {u'source': 21, u'target': 18, u'value': 3},\n",
" {u'source': 21, u'target': 19, u'value': 3},\n",
" {u'source': 21, u'target': 20, u'value': 5},\n",
" {u'source': 22, u'target': 16, u'value': 3},\n",
" {u'source': 22, u'target': 17, u'value': 3},\n",
" {u'source': 22, u'target': 18, u'value': 3},\n",
" {u'source': 22, u'target': 19, u'value': 3},\n",
" {u'source': 22, u'target': 20, u'value': 4},\n",
" {u'source': 22, u'target': 21, u'value': 4},\n",
" {u'source': 23, u'target': 16, u'value': 3},\n",
" {u'source': 23, u'target': 17, u'value': 3},\n",
" {u'source': 23, u'target': 18, u'value': 3},\n",
" {u'source': 23, u'target': 19, u'value': 3},\n",
" {u'source': 23, u'target': 20, u'value': 4},\n",
" {u'source': 23, u'target': 21, u'value': 4},\n",
" {u'source': 23, u'target': 22, u'value': 4},\n",
" {u'source': 23, u'target': 12, u'value': 2},\n",
" {u'source': 23, u'target': 11, u'value': 9},\n",
" {u'source': 24, u'target': 23, u'value': 2},\n",
" {u'source': 24, u'target': 11, u'value': 7},\n",
" {u'source': 25, u'target': 24, u'value': 13},\n",
" {u'source': 25, u'target': 23, u'value': 1},\n",
" {u'source': 25, u'target': 11, u'value': 12},\n",
" {u'source': 26, u'target': 24, u'value': 4},\n",
" {u'source': 26, u'target': 11, u'value': 31},\n",
" {u'source': 26, u'target': 16, u'value': 1},\n",
" {u'source': 26, u'target': 25, u'value': 1},\n",
" {u'source': 27, u'target': 11, u'value': 17},\n",
" {u'source': 27, u'target': 23, u'value': 5},\n",
" {u'source': 27, u'target': 25, u'value': 5},\n",
" {u'source': 27, u'target': 24, u'value': 1},\n",
" {u'source': 27, u'target': 26, u'value': 1},\n",
" {u'source': 28, u'target': 11, u'value': 8},\n",
" {u'source': 28, u'target': 27, u'value': 1},\n",
" {u'source': 29, u'target': 23, u'value': 1},\n",
" {u'source': 29, u'target': 27, u'value': 1},\n",
" {u'source': 29, u'target': 11, u'value': 2},\n",
" {u'source': 30, u'target': 23, u'value': 1},\n",
" {u'source': 31, u'target': 30, u'value': 2},\n",
" {u'source': 31, u'target': 11, u'value': 3},\n",
" {u'source': 31, u'target': 23, u'value': 2},\n",
" {u'source': 31, u'target': 27, u'value': 1},\n",
" {u'source': 32, u'target': 11, u'value': 1},\n",
" {u'source': 33, u'target': 11, u'value': 2},\n",
" {u'source': 33, u'target': 27, u'value': 1},\n",
" {u'source': 34, u'target': 11, u'value': 3},\n",
" {u'source': 34, u'target': 29, u'value': 2},\n",
" {u'source': 35, u'target': 11, u'value': 3},\n",
" {u'source': 35, u'target': 34, u'value': 3},\n",
" {u'source': 35, u'target': 29, u'value': 2},\n",
" {u'source': 36, u'target': 34, u'value': 2},\n",
" {u'source': 36, u'target': 35, u'value': 2},\n",
" {u'source': 36, u'target': 11, u'value': 2},\n",
" {u'source': 36, u'target': 29, u'value': 1},\n",
" {u'source': 37, u'target': 34, u'value': 2},\n",
" {u'source': 37, u'target': 35, u'value': 2},\n",
" {u'source': 37, u'target': 36, u'value': 2},\n",
" {u'source': 37, u'target': 11, u'value': 2},\n",
" {u'source': 37, u'target': 29, u'value': 1},\n",
" {u'source': 38, u'target': 34, u'value': 2},\n",
" {u'source': 38, u'target': 35, u'value': 2},\n",
" {u'source': 38, u'target': 36, u'value': 2},\n",
" {u'source': 38, u'target': 37, u'value': 2},\n",
" {u'source': 38, u'target': 11, u'value': 2},\n",
" {u'source': 38, u'target': 29, u'value': 1},\n",
" {u'source': 39, u'target': 25, u'value': 1},\n",
" {u'source': 40, u'target': 25, u'value': 1},\n",
" {u'source': 41, u'target': 24, u'value': 2},\n",
" {u'source': 41, u'target': 25, u'value': 3},\n",
" {u'source': 42, u'target': 41, u'value': 2},\n",
" {u'source': 42, u'target': 25, u'value': 2},\n",
" {u'source': 42, u'target': 24, u'value': 1},\n",
" {u'source': 43, u'target': 11, u'value': 3},\n",
" {u'source': 43, u'target': 26, u'value': 1},\n",
" {u'source': 43, u'target': 27, u'value': 1},\n",
" {u'source': 44, u'target': 28, u'value': 3},\n",
" {u'source': 44, u'target': 11, u'value': 1},\n",
" {u'source': 45, u'target': 28, u'value': 2},\n",
" {u'source': 47, u'target': 46, u'value': 1},\n",
" {u'source': 48, u'target': 47, u'value': 2},\n",
" {u'source': 48, u'target': 25, u'value': 1},\n",
" {u'source': 48, u'target': 27, u'value': 1},\n",
" {u'source': 48, u'target': 11, u'value': 1},\n",
" {u'source': 49, u'target': 26, u'value': 3},\n",
" {u'source': 49, u'target': 11, u'value': 2},\n",
" {u'source': 50, u'target': 49, u'value': 1},\n",
" {u'source': 50, u'target': 24, u'value': 1},\n",
" {u'source': 51, u'target': 49, u'value': 9},\n",
" {u'source': 51, u'target': 26, u'value': 2},\n",
" {u'source': 51, u'target': 11, u'value': 2},\n",
" {u'source': 52, u'target': 51, u'value': 1},\n",
" {u'source': 52, u'target': 39, u'value': 1},\n",
" {u'source': 53, u'target': 51, u'value': 1},\n",
" {u'source': 54, u'target': 51, u'value': 2},\n",
" {u'source': 54, u'target': 49, u'value': 1},\n",
" {u'source': 54, u'target': 26, u'value': 1},\n",
" {u'source': 55, u'target': 51, u'value': 6},\n",
" {u'source': 55, u'target': 49, u'value': 12},\n",
" {u'source': 55, u'target': 39, u'value': 1},\n",
" {u'source': 55, u'target': 54, u'value': 1},\n",
" {u'source': 55, u'target': 26, u'value': 21},\n",
" {u'source': 55, u'target': 11, u'value': 19},\n",
" {u'source': 55, u'target': 16, u'value': 1},\n",
" {u'source': 55, u'target': 25, u'value': 2},\n",
" {u'source': 55, u'target': 41, u'value': 5},\n",
" {u'source': 55, u'target': 48, u'value': 4},\n",
" {u'source': 56, u'target': 49, u'value': 1},\n",
" {u'source': 56, u'target': 55, u'value': 1},\n",
" {u'source': 57, u'target': 55, u'value': 1},\n",
" {u'source': 57, u'target': 41, u'value': 1},\n",
" {u'source': 57, u'target': 48, u'value': 1},\n",
" {u'source': 58, u'target': 55, u'value': 7},\n",
" {u'source': 58, u'target': 48, u'value': 7},\n",
" {u'source': 58, u'target': 27, u'value': 6},\n",
" {u'source': 58, u'target': 57, u'value': 1},\n",
" {u'source': 58, u'target': 11, u'value': 4},\n",
" {u'source': 59, u'target': 58, u'value': 15},\n",
" {u'source': 59, u'target': 55, u'value': 5},\n",
" {u'source': 59, u'target': 48, u'value': 6},\n",
" {u'source': 59, u'target': 57, u'value': 2},\n",
" {u'source': 60, u'target': 48, u'value': 1},\n",
" {u'source': 60, u'target': 58, u'value': 4},\n",
" {u'source': 60, u'target': 59, u'value': 2},\n",
" {u'source': 61, u'target': 48, u'value': 2},\n",
" {u'source': 61, u'target': 58, u'value': 6},\n",
" {u'source': 61, u'target': 60, u'value': 2},\n",
" {u'source': 61, u'target': 59, u'value': 5},\n",
" {u'source': 61, u'target': 57, u'value': 1},\n",
" {u'source': 61, u'target': 55, u'value': 1},\n",
" {u'source': 62, u'target': 55, u'value': 9},\n",
" {u'source': 62, u'target': 58, u'value': 17},\n",
" {u'source': 62, u'target': 59, u'value': 13},\n",
" {u'source': 62, u'target': 48, u'value': 7},\n",
" {u'source': 62, u'target': 57, u'value': 2},\n",
" {u'source': 62, u'target': 41, u'value': 1},\n",
" {u'source': 62, u'target': 61, u'value': 6},\n",
" {u'source': 62, u'target': 60, u'value': 3},\n",
" {u'source': 63, u'target': 59, u'value': 5},\n",
" {u'source': 63, u'target': 48, u'value': 5},\n",
" {u'source': 63, u'target': 62, u'value': 6},\n",
" {u'source': 63, u'target': 57, u'value': 2},\n",
" {u'source': 63, u'target': 58, u'value': 4},\n",
" {u'source': 63, u'target': 61, u'value': 3},\n",
" {u'source': 63, u'target': 60, u'value': 2},\n",
" {u'source': 63, u'target': 55, u'value': 1},\n",
" {u'source': 64, u'target': 55, u'value': 5},\n",
" {u'source': 64, u'target': 62, u'value': 12},\n",
" {u'source': 64, u'target': 48, u'value': 5},\n",
" {u'source': 64, u'target': 63, u'value': 4},\n",
" {u'source': 64, u'target': 58, u'value': 10},\n",
" {u'source': 64, u'target': 61, u'value': 6},\n",
" {u'source': 64, u'target': 60, u'value': 2},\n",
" {u'source': 64, u'target': 59, u'value': 9},\n",
" {u'source': 64, u'target': 57, u'value': 1},\n",
" {u'source': 64, u'target': 11, u'value': 1},\n",
" {u'source': 65, u'target': 63, u'value': 5},\n",
" {u'source': 65, u'target': 64, u'value': 7},\n",
" {u'source': 65, u'target': 48, u'value': 3},\n",
" {u'source': 65, u'target': 62, u'value': 5},\n",
" {u'source': 65, u'target': 58, u'value': 5},\n",
" {u'source': 65, u'target': 61, u'value': 5},\n",
" {u'source': 65, u'target': 60, u'value': 2},\n",
" {u'source': 65, u'target': 59, u'value': 5},\n",
" {u'source': 65, u'target': 57, u'value': 1},\n",
" {u'source': 65, u'target': 55, u'value': 2},\n",
" {u'source': 66, u'target': 64, u'value': 3},\n",
" {u'source': 66, u'target': 58, u'value': 3},\n",
" {u'source': 66, u'target': 59, u'value': 1},\n",
" {u'source': 66, u'target': 62, u'value': 2},\n",
" {u'source': 66, u'target': 65, u'value': 2},\n",
" {u'source': 66, u'target': 48, u'value': 1},\n",
" {u'source': 66, u'target': 63, u'value': 1},\n",
" {u'source': 66, u'target': 61, u'value': 1},\n",
" {u'source': 66, u'target': 60, u'value': 1},\n",
" {u'source': 67, u'target': 57, u'value': 3},\n",
" {u'source': 68, u'target': 25, u'value': 5},\n",
" {u'source': 68, u'target': 11, u'value': 1},\n",
" {u'source': 68, u'target': 24, u'value': 1},\n",
" {u'source': 68, u'target': 27, u'value': 1},\n",
" {u'source': 68, u'target': 48, u'value': 1},\n",
" {u'source': 68, u'target': 41, u'value': 1},\n",
" {u'source': 69, u'target': 25, u'value': 6},\n",
" {u'source': 69, u'target': 68, u'value': 6},\n",
" {u'source': 69, u'target': 11, u'value': 1},\n",
" {u'source': 69, u'target': 24, u'value': 1},\n",
" {u'source': 69, u'target': 27, u'value': 2},\n",
" {u'source': 69, u'target': 48, u'value': 1},\n",
" {u'source': 69, u'target': 41, u'value': 1},\n",
" {u'source': 70, u'target': 25, u'value': 4},\n",
" {u'source': 70, u'target': 69, u'value': 4},\n",
" {u'source': 70, u'target': 68, u'value': 4},\n",
" {u'source': 70, u'target': 11, u'value': 1},\n",
" {u'source': 70, u'target': 24, u'value': 1},\n",
" {u'source': 70, u'target': 27, u'value': 1},\n",
" {u'source': 70, u'target': 41, u'value': 1},\n",
" {u'source': 70, u'target': 58, u'value': 1},\n",
" {u'source': 71, u'target': 27, u'value': 1},\n",
" {u'source': 71, u'target': 69, u'value': 2},\n",
" {u'source': 71, u'target': 68, u'value': 2},\n",
" {u'source': 71, u'target': 70, u'value': 2},\n",
" {u'source': 71, u'target': 11, u'value': 1},\n",
" {u'source': 71, u'target': 48, u'value': 1},\n",
" {u'source': 71, u'target': 41, u'value': 1},\n",
" {u'source': 71, u'target': 25, u'value': 1},\n",
" {u'source': 72, u'target': 26, u'value': 2},\n",
" {u'source': 72, u'target': 27, u'value': 1},\n",
" {u'source': 72, u'target': 11, u'value': 1},\n",
" {u'source': 73, u'target': 48, u'value': 2},\n",
" {u'source': 74, u'target': 48, u'value': 2},\n",
" {u'source': 74, u'target': 73, u'value': 3},\n",
" {u'source': 75, u'target': 69, u'value': 3},\n",
" {u'source': 75, u'target': 68, u'value': 3},\n",
" {u'source': 75, u'target': 25, u'value': 3},\n",
" {u'source': 75, u'target': 48, u'value': 1},\n",
" {u'source': 75, u'target': 41, u'value': 1},\n",
" {u'source': 75, u'target': 70, u'value': 1},\n",
" {u'source': 75, u'target': 71, u'value': 1},\n",
" {u'source': 76, u'target': 64, u'value': 1},\n",
" {u'source': 76, u'target': 65, u'value': 1},\n",
" {u'source': 76, u'target': 66, u'value': 1},\n",
" {u'source': 76, u'target': 63, u'value': 1},\n",
" {u'source': 76, u'target': 62, u'value': 1},\n",
" {u'source': 76, u'target': 48, u'value': 1},\n",
" {u'source': 76, u'target': 58, u'value': 1}],\n",
" u'nodes': [{u'group': 1, u'name': u'Myriel'},\n",
" {u'group': 1, u'name': u'Napoleon'},\n",
" {u'group': 1, u'name': u'Mlle.Baptistine'},\n",
" {u'group': 1, u'name': u'Mme.Magloire'},\n",
" {u'group': 1, u'name': u'CountessdeLo'},\n",
" {u'group': 1, u'name': u'Geborand'},\n",
" {u'group': 1, u'name': u'Champtercier'},\n",
" {u'group': 1, u'name': u'Cravatte'},\n",
" {u'group': 1, u'name': u'Count'},\n",
" {u'group': 1, u'name': u'OldMan'},\n",
" {u'group': 2, u'name': u'Labarre'},\n",
" {u'group': 2, u'name': u'Valjean'},\n",
" {u'group': 3, u'name': u'Marguerite'},\n",
" {u'group': 2, u'name': u'Mme.deR'},\n",
" {u'group': 2, u'name': u'Isabeau'},\n",
" {u'group': 2, u'name': u'Gervais'},\n",
" {u'group': 3, u'name': u'Tholomyes'},\n",
" {u'group': 3, u'name': u'Listolier'},\n",
" {u'group': 3, u'name': u'Fameuil'},\n",
" {u'group': 3, u'name': u'Blacheville'},\n",
" {u'group': 3, u'name': u'Favourite'},\n",
" {u'group': 3, u'name': u'Dahlia'},\n",
" {u'group': 3, u'name': u'Zephine'},\n",
" {u'group': 3, u'name': u'Fantine'},\n",
" {u'group': 4, u'name': u'Mme.Thenardier'},\n",
" {u'group': 4, u'name': u'Thenardier'},\n",
" {u'group': 5, u'name': u'Cosette'},\n",
" {u'group': 4, u'name': u'Javert'},\n",
" {u'group': 0, u'name': u'Fauchelevent'},\n",
" {u'group': 2, u'name': u'Bamatabois'},\n",
" {u'group': 3, u'name': u'Perpetue'},\n",
" {u'group': 2, u'name': u'Simplice'},\n",
" {u'group': 2, u'name': u'Scaufflaire'},\n",
" {u'group': 2, u'name': u'Woman1'},\n",
" {u'group': 2, u'name': u'Judge'},\n",
" {u'group': 2, u'name': u'Champmathieu'},\n",
" {u'group': 2, u'name': u'Brevet'},\n",
" {u'group': 2, u'name': u'Chenildieu'},\n",
" {u'group': 2, u'name': u'Cochepaille'},\n",
" {u'group': 4, u'name': u'Pontmercy'},\n",
" {u'group': 6, u'name': u'Boulatruelle'},\n",
" {u'group': 4, u'name': u'Eponine'},\n",
" {u'group': 4, u'name': u'Anzelma'},\n",
" {u'group': 5, u'name': u'Woman2'},\n",
" {u'group': 0, u'name': u'MotherInnocent'},\n",
" {u'group': 0, u'name': u'Gribier'},\n",
" {u'group': 7, u'name': u'Jondrette'},\n",
" {u'group': 7, u'name': u'Mme.Burgon'},\n",
" {u'group': 8, u'name': u'Gavroche'},\n",
" {u'group': 5, u'name': u'Gillenormand'},\n",
" {u'group': 5, u'name': u'Magnon'},\n",
" {u'group': 5, u'name': u'Mlle.Gillenormand'},\n",
" {u'group': 5, u'name': u'Mme.Pontmercy'},\n",
" {u'group': 5, u'name': u'Mlle.Vaubois'},\n",
" {u'group': 5, u'name': u'Lt.Gillenormand'},\n",
" {u'group': 8, u'name': u'Marius'},\n",
" {u'group': 5, u'name': u'BaronessT'},\n",
" {u'group': 8, u'name': u'Mabeuf'},\n",
" {u'group': 8, u'name': u'Enjolras'},\n",
" {u'group': 8, u'name': u'Combeferre'},\n",
" {u'group': 8, u'name': u'Prouvaire'},\n",
" {u'group': 8, u'name': u'Feuilly'},\n",
" {u'group': 8, u'name': u'Courfeyrac'},\n",
" {u'group': 8, u'name': u'Bahorel'},\n",
" {u'group': 8, u'name': u'Bossuet'},\n",
" {u'group': 8, u'name': u'Joly'},\n",
" {u'group': 8, u'name': u'Grantaire'},\n",
" {u'group': 9, u'name': u'MotherPlutarch'},\n",
" {u'group': 4, u'name': u'Gueulemer'},\n",
" {u'group': 4, u'name': u'Babet'},\n",
" {u'group': 4, u'name': u'Claquesous'},\n",
" {u'group': 4, u'name': u'Montparnasse'},\n",
" {u'group': 5, u'name': u'Toussaint'},\n",
" {u'group': 10, u'name': u'Child1'},\n",
" {u'group': 10, u'name': u'Child2'},\n",
" {u'group': 4, u'name': u'Brujon'},\n",
" {u'group': 8, u'name': u'Mme.Hucheloup'}]}"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data=data[0]\n",
"data"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[u'nodes', u'links']\n"
]
}
],
"source": [
"print data.keys()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Get the number of nodes:"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"77"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"N=len(data['nodes'])\n",
"N"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Define the list of edges:"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"L=len(data['links'])\n",
"Edges=[(data['links'][k]['source'], data['links'][k]['target']) for k in range(L)]\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Define the Graph object from Edges:"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"G=ig.Graph(Edges, directed=False)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Extract the node attributes, 'group', and 'name':"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"{u'group': 1, u'name': u'Myriel'}"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data['nodes'][0]"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"labels=[]\n",
"group=[]\n",
"for node in data['nodes']:\n",
" labels.append(node['name'])\n",
" group.append(node['group'])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Get the node positions, set by the Kamada-Kawai layout for 3D graphs:"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"layt=G.layout('kk', dim=3) "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"`layt` is a list of three elements lists (the coordinates of nodes):"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"[-2.165298835959627, -3.688710574002034, -1.6020681541017792]"
]
},
"execution_count": 29,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"layt[5]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Set data for the Plotly plot of the graph:"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"Xn=[layt[k][0] for k in range(N)]# x-coordinates of nodes\n",
"Yn=[layt[k][1] for k in range(N)]# y-coordinates\n",
"Zn=[layt[k][2] for k in range(N)]# z-coordinates\n",
"Xe=[]\n",
"Ye=[]\n",
"Ze=[]\n",
"for e in Edges:\n",
" Xe+=[layt[e[0]][0],layt[e[1]][0], None]# x-coordinates of edge ends\n",
" Ye+=[layt[e[0]][1],layt[e[1]][1], None] \n",
" Ze+=[layt[e[0]][2],layt[e[1]][2], None] "
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import plotly.plotly as py\n",
"from plotly.graph_objs import *"
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"trace1=Scatter3d(x=Xe,\n",
" y=Ye,\n",
" z=Ze,\n",
" mode='lines',\n",
" line=Line(color='rgb(125,125,125)', width=1),\n",
" hoverinfo='none'\n",
" )\n",
"trace2=Scatter3d(x=Xn,\n",
" y=Yn,\n",
" z=Zn, \n",
" mode='markers',\n",
" name='actors',\n",
" marker=Marker(symbol='dot',\n",
" size=6, \n",
" color=group, \n",
" colorscale='Viridis',\n",
" line=Line(color='rgb(50,50,50)', width=0.5)\n",
" ),\n",
" text=labels,\n",
" hoverinfo='text'\n",
" )"
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"\n",
"axis=dict(showbackground=False,\n",
" showline=False, \n",
" zeroline=False,\n",
" showgrid=False,\n",
" showticklabels=False,\n",
" title='' \n",
" )"
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"layout = Layout(\n",
" title=\"Network of coappearances of characters in Victor Hugo's novel
Les Miserables (3D visualization)\", \n",
" width=1000,\n",
" height=1000,\n",
" showlegend=False,\n",
" scene=Scene( \n",
" xaxis=XAxis(axis),\n",
" yaxis=YAxis(axis), \n",
" zaxis=ZAxis(axis), \n",
" ),\n",
" margin=Margin(\n",
" t=100\n",
" ),\n",
" hovermode='closest',\n",
" annotations=Annotations([\n",
" Annotation(\n",
" showarrow=False, \n",
" text=\"Data source: [1]\",\n",
" xref='paper', \n",
" yref='paper', \n",
" x=0, \n",
" y=0.1, \n",
" xanchor='left', \n",
" yanchor='bottom', \n",
" font=Font(\n",
" size=14 \n",
" ) \n",
" )\n",
" ]), )"
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"u'https://plot.ly/~empet/9059'"
]
},
"execution_count": 35,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data=Data([trace1, trace2])\n",
"py.sign_in('empet', 'jkxft90od0')\n",
"fig=Figure(data=data, layout=layout)\n",
"\n",
"py.plot(fig, filename='Les-Miserables')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"