this is a more general question asking about Python libraries that are able to showcase networks with following criterias:

  • Different size of the nodes depending on a metric (e.g. sum of some variable X received by all other nodes)
  • Direction of the connection between the nodes (e.g. Node A sends X units to Node B, while Node B sends Y units to Node A and Q units to Node C) - So a node can receive and send at the same time.
  • The connectors may vary in "thickness" relative to each other depending how many units they receive/send
  • Dynamic UI - Network should be dynamic for e.g. filters like date ranges etc. that can be selected by the user.

I checked for Networkx and Plotlty, however they do not satisfy the direction criteria of the connectors.

Someone any idea?

A representation like this would work as well: https://viz.ged-project.de/


1 Answer 1


Here's a solution based on gravis, an open source Python package I've written for network visualization. I think it fulfills all your requirements except live filtering by date ranges, though other forms of interactivity are available such as dragging nodes and changing node and edge appearances:

import gravis as gv
import networkx as nx

# e.g. Node A sends X units to Node B, while Node B sends Y units to Node A and Q units to Node C
data = [
    ('A', 'B', 2.2),
    ('B', 'A', 3.7),
    ('B', 'C', 0.9),

dg = nx.DiGraph()
for n1, n2, sent in data:
    dg.add_edge(n1, n2, size=sent)

for node in dg.nodes:
    size = 0.0
    for n1, n2 in dg.in_edges(node):
        e = dg.edges[(n1, n2)]
        size += e['size']
    dg.nodes[node]['size'] = size * 5

gv.d3(dg, edge_curvature=0.5)

Here's how it looks when that code is used inside a Jupyter notebook, though it could be done in a regular Python interpreter as well:



Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.