#!/usr/bin/env python # coding: utf-8 # ## A 3D graph representing the network of coappearances of characters in Victor Hugo's novel Les Miserables ## # We define our graph as an `igraph.Graph` object. [Python `igraph`](hhttp://igraph.org/python/) # is a library for high-performance graph generation and analysis. # In[1]: import igraph as ig # Read graph data from a `json` file: # In[2]: import json data = [] with open('miserables.json') as f: for line in f: data.append(json.loads(line)) # In[3]: data=data[0] data # In[4]: print data.keys() # Get the number of nodes: # In[5]: N=len(data['nodes']) N # Define the list of edges: # In[6]: L=len(data['links']) Edges=[(data['links'][k]['source'], data['links'][k]['target']) for k in range(L)] # Define the Graph object from Edges: # In[7]: G=ig.Graph(Edges, directed=False) # Extract the node attributes, 'group', and 'name': # In[8]: data['nodes'][0] # In[9]: labels=[] group=[] for node in data['nodes']: labels.append(node['name']) group.append(node['group']) # Get the node positions, set by the Kamada-Kawai layout for 3D graphs: # In[28]: layt=G.layout('kk', dim=3) # `layt` is a list of three elements lists (the coordinates of nodes): # In[29]: layt[5] # Set data for the Plotly plot of the graph: # In[30]: Xn=[layt[k][0] for k in range(N)]# x-coordinates of nodes Yn=[layt[k][1] for k in range(N)]# y-coordinates Zn=[layt[k][2] for k in range(N)]# z-coordinates Xe=[] Ye=[] Ze=[] for e in Edges: Xe+=[layt[e[0]][0],layt[e[1]][0], None]# x-coordinates of edge ends Ye+=[layt[e[0]][1],layt[e[1]][1], None] Ze+=[layt[e[0]][2],layt[e[1]][2], None] # In[31]: import plotly.plotly as py from plotly.graph_objs import * # In[32]: trace1=Scatter3d(x=Xe, y=Ye, z=Ze, mode='lines', line=Line(color='rgb(125,125,125)', width=1), hoverinfo='none' ) trace2=Scatter3d(x=Xn, y=Yn, z=Zn, mode='markers', name='actors', marker=Marker(symbol='dot', size=6, color=group, colorscale='Viridis', line=Line(color='rgb(50,50,50)', width=0.5) ), text=labels, hoverinfo='text' ) # In[33]: axis=dict(showbackground=False, showline=False, zeroline=False, showgrid=False, showticklabels=False, title='' ) # In[34]: layout = Layout( title="Network of coappearances of characters in Victor Hugo's novel
Les Miserables (3D visualization)", width=1000, height=1000, showlegend=False, scene=Scene( xaxis=XAxis(axis), yaxis=YAxis(axis), zaxis=ZAxis(axis), ), margin=Margin( t=100 ), hovermode='closest', annotations=Annotations([ Annotation( showarrow=False, text="Data source: [1]", xref='paper', yref='paper', x=0, y=0.1, xanchor='left', yanchor='bottom', font=Font( size=14 ) ) ]), ) # In[35]: data=Data([trace1, trace2]) py.sign_in('empet', 'jkxft90od0') fig=Figure(data=data, layout=layout) py.plot(fig, filename='Les-Miserables') #
# Network of coappearances of characters in Victor Hugo's novel<br> Les Miserables (3D visualization) # #
# # # In[36]: from IPython.core.display import HTML def css_styling(): styles = open("./custom.css", "r").read() return HTML(styles) css_styling()