import numpy as np import pandas as pd import holoviews as hv import networkx as nx hv.extension('matplotlib')
element provides an easy way to represent and visualize network graphs. It differs from other elements in HoloViews in that it consists of multiple sub-elements. The data of the
element itself are the abstract edges between the nodes. By default the element will automatically compute concrete
positions for the nodes and represent them using a
element, which is stored on the Graph. The abstract edges and concrete node positions are sufficient to render the
by drawing straight-line edges between the nodes. In order to supply explicit edge paths we can also declare
, providing explicit coordinates for each edge to follow.
To summarize a
consists of three different components:
Graphitself holds the abstract edges stored as a table of node indices.
Nodeshold the concrete
ypositions of each node along with a node
Nodesmay also define any number of value dimensions, which can be revealed when hovering over the nodes or to color the nodes by.
EdgePathscan optionally be supplied to declare explicit node paths.
This reference document describes only basic functionality, for a more detailed summary on how to work with network graphs in HoloViews see the User Guide .
A simple Graph ¶
Let's start by declaring a very simple graph connecting one node to all others. If we simply supply the abstract connectivity of the
, it will automatically compute a layout for the nodes using the
operation, which defaults to a circular layout:
# Declare abstract edges N = 8 node_indices = np.arange(N) source = np.zeros(N) target = node_indices padding = dict(x=(-1.2, 1.2), y=(-1.2, 1.2)) simple_graph = hv.Graph(((source, target),)).redim.range(**padding) simple_graph
Accessing the nodes and edges ¶
We can easily access the
element using the corresponding properties:
simple_graph.nodes + simple_graph.edgepaths
from matplotlib.colors import ListedColormap # Node info x, y = simple_graph.nodes.array([0, 1]).T node_labels = ['Output']+['Input']*(N-1) # Compute edge paths def bezier(start, end, control, steps=np.linspace(0, 1, 100)): return (1-steps)**2*start + 2*(1-steps)*steps*control+steps**2*end paths =  for node_index in node_indices: ex, ey = x[node_index], y[node_index] paths.append(np.column_stack([bezier(x, ex, 0), bezier(y, ey, 0)])) # Declare Graph nodes = hv.Nodes((x, y, node_indices, node_labels), vdims='Type') graph = hv.Graph(((source, target), nodes, paths)) graph.redim.range(**padding).opts(plot=dict(color_index='Type'), style=dict(cmap=ListedColormap(['blue', 'yellow'])))