We define our graph as an igraph.Graph
object. Python igraph
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
Out[3]:
In [4]:
print data.keys()
Get the number of nodes:
In [5]:
N=len(data['nodes'])
N
Out[5]:
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]
Out[8]:
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]
Out[29]:
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<br> 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: <a href='http://bost.ocks.org/mike/miserables/miserables.json'>[1]</a>",
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')
Out[35]:
In [36]:
from IPython.core.display import HTML
def css_styling():
styles = open("./custom.css", "r").read()
return HTML(styles)
css_styling()
Out[36]: