top of page
Writer's pictureThe Tech Platform

Network Graph in Python



A network graph is a chart that displays relations between elements (nodes) using simple links. Network graph allows us to visualize clusters and relationships between the nodes quickly; the chart is often used in industries such as life science, cybersecurity, intelligence, etc.


Creating a network graph is straightforward. Below figure shows five nodes and the relationship between them. Node 1 has a relationship with the nodes 3, 4, and 2. The node 5 also has a relationship with nodes 2 and 4, but not with node 3.



Visualize a network graph created using networkx.

Install the Python library networkx with pip install networkx.


Create random graph

import plotly.graph_objects as go
import networkx as nx
G = nx.random_geometric_graph(200, 0.125)


Create Edges

Add edges as disconnected lines in a single trace and nodes as a scatter trace

edge_x = []
edge_y = []
for edge in G.edges():
    x0, y0 = G.nodes[edge[0]]['pos']
    x1, y1 = G.nodes[edge[1]]['pos']
    edge_x.append(x0)
    edge_x.append(x1)
    edge_x.append(None)
    edge_y.append(y0)
    edge_y.append(y1)
    edge_y.append(None)

edge_trace = go.Scatter(
    x=edge_x, y=edge_y,
    line=dict(width=0.5, color='#888'),
    hoverinfo='none',
    mode='lines')
    
node_x = []
node_y = []
for node in G.nodes():
    x, y = G.nodes[node]['pos']
    node_x.append(x)
    node_y.append(y)
    
node_trace = go.Scatter(
    x=node_x, y=node_y,
    mode='markers',
    hoverinfo='text',
    marker=dict(
        showscale=True,
        # colorscale options
        #'Greys' | 'YlGnBu' | 'Greens' | 'YlOrRd' | 'Bluered' | 'RdBu' |
        #'Reds' | 'Blues' | 'Picnic' | 'Rainbow' | 'Portland' | 'Jet' |
        #'Hot' | 'Blackbody' | 'Earth' | 'Electric' | 'Viridis' |
        colorscale='YlGnBu',
        reversescale=True,
        color=[],
        size=10,
        colorbar=dict(
            thickness=15,
            title='Node Connections',
            xanchor='left',
            titleside='right'
        ),
        line_width=2
    )
)


Color Node Points

Color node points by the number of connections.

Another option would be to size points by the number of connections i.e. node_trace.marker.size = node_adjacencies

node_adjacencies = []
node_text = []
for node, adjacencies in enumerate(G.adjacency()):
    node_adjacencies.append(len(adjacencies[1]))
    node_text.append('# of connections: '+str(len(adjacencies[1])))

node_trace.marker.color = node_adjacencies
node_trace.text = node_text


Create Network Graph

fig = go.Figure(data=[edge_trace, node_trace],
    layout=go.Layout(
        title='<br>Network graph made with Python',
        titlefont_size=16,
        showlegend=False,
        hovermode='closest',
        margin=dict(b=20,l=5,r=5,t=40),
        annotations=[ dict(
            text="Python code: <a href='https://plotly.com/ipython-
            notebooks/network-graphs/'> https://plotly.com/ipython-
            notebooks/network-graphs/</a>",
            showarrow=False,
            xref="paper", yref="paper",
            x=0.005, y=-0.002 ) ],
        xaxis=dict(showgrid=False, 
                    zeroline=False, 
                    showticklabels=False),
        yaxis=dict(showgrid=False, zeroline=False, showticklabels=False))
        )

fig.show()

Network graph made with python


Network graphs in Dash

Dash is the best way to build analytical apps in Python using Plotly figures. To run the app below, run pip install dash dash-cytoscape, click "Download" to get the code and run python app.py.

from dash import Dash, html 
import dash_cytoscape as cyto  

app = Dash(__name__)  

app.layout = html.Div([     
    html.P("Dash Cytoscape:"),     
    cyto.Cytoscape(         
        id='cytoscape',         
        elements=[             
            {'data': {'id': 'ca', 'label': 'Canada'}},              
            {'data': {'id': 'on', 'label': 'Ontario'}},              
            {'data': {'id': 'qc', 'label': 'Quebec'}},             
            {'data': {'source': 'ca', 'target': 'on'}},              
            {'data': {'source': 'ca', 'target': 'qc'}}         
        ],         
        layout={'name': 'breadthfirst'},         
        style={'width': '400px', 'height': '500px'}     
    ) 
])   

app.run_server(debug=True)


Resource: Plotly.com


The Tech Platform

0 comments

Comments


bottom of page