{ "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": [ "
\n", " \"Network\n", " \n", "
\n", "\n" ] }, { "cell_type": "code", "execution_count": 36, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "\n", "\n" ], "text/plain": [ "" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from IPython.core.display import HTML\n", "def css_styling():\n", " styles = open(\"./custom.css\", \"r\").read()\n", " return HTML(styles)\n", "css_styling()" ] } ], "metadata": { "kernelspec": { "display_name": "Python 2", "language": "python", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.10" } }, "nbformat": 4, "nbformat_minor": 0 }