# 3D Network Graphs in Python/v3

How to make 3D Network Graphs in Python.

See our Version 4 Migration Guide for information about how to upgrade.

#### New to Plotly?¶

You can set up Plotly to work in online or offline mode, or in jupyter notebooks.
We also have a quick-reference cheatsheet (new!) to help you get started!

#### Network reflecting coappearances of characters in Victor Hugo's novel Les Miserables

We define our graph as an igraph.Graph object. Python igraph is a library for high-performance graph generation and analysis. Install the Python library with sudo pip install python-igraph.

In :
import igraph as ig


Read graph data from a json file:

In :
import json
import urllib2

data = []
req = urllib2.Request("https://raw.githubusercontent.com/plotly/datasets/master/miserables.json")
opener = urllib2.build_opener()
f = opener.open(req)

print data.keys()

[u'nodes', u'links']


Get the number of nodes:

In :
N=len(data['nodes'])
N

Out:
77

Define the list of edges and the Graph object from Edges:

In :
L=len(data['links'])

G=ig.Graph(Edges, directed=False)


Extract the node attributes, 'group', and 'name':

In :
data['nodes']

Out:
{u'group': 1, u'name': u'Myriel'}
In :
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 :
layt=G.layout('kk', dim=3)


layt is a list of three elements lists (the coordinates of nodes):

In :
layt

Out:
[4.195949332184983, 1.172321178571202, -2.5543268281789135]

Set data for the Plotly plot of the graph:

In :
Xn=[layt[k] for k in range(N)]# x-coordinates of nodes
Yn=[layt[k] for k in range(N)]# y-coordinates
Zn=[layt[k] for k in range(N)]# z-coordinates
Xe=[]
Ye=[]
Ze=[]
for e in Edges:
Xe+=[layt[e],layt[e], None]# x-coordinates of edge ends
Ye+=[layt[e],layt[e], None]
Ze+=[layt[e],layt[e], None]

In :
import plotly.plotly as py
import plotly.graph_objs as go

trace1=go.Scatter3d(x=Xe,
y=Ye,
z=Ze,
mode='lines',
line=dict(color='rgb(125,125,125)', width=1),
hoverinfo='none'
)

trace2=go.Scatter3d(x=Xn,
y=Yn,
z=Zn,
mode='markers',
name='actors',
marker=dict(symbol='circle',
size=6,
color=group,
colorscale='Viridis',
line=dict(color='rgb(50,50,50)', width=0.5)
),
text=labels,
hoverinfo='text'
)

axis=dict(showbackground=False,
showline=False,
zeroline=False,
showgrid=False,
showticklabels=False,
title=''
)

layout = go.Layout(
title="Network of coappearances of characters in Victor Hugo's novel<br> Les Miserables (3D visualization)",
width=1000,
height=1000,
showlegend=False,
scene=dict(
xaxis=dict(axis),
yaxis=dict(axis),
zaxis=dict(axis),
),
margin=dict(
t=100
),
hovermode='closest',
annotations=[
dict(
showarrow=False,
text="Data source: <a href='http://bost.ocks.org/mike/miserables/miserables.json'> miserables.json</a>",
xref='paper',
yref='paper',
x=0,
y=0.1,
xanchor='left',
yanchor='bottom',
font=dict(
size=14
)
)
],    )

In :
data=[trace1, trace2]
fig=go.Figure(data=data, layout=layout)

py.iplot(fig, filename='Les-Miserables')

Out:

#### Reference¶ 