#!/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')
#