Skip to content

Optimization for layered graph layouts

import networkx as nx
from IPython.display import SVG
from matplotlib import pyplot as plt

from vizopt.animation import SnapshotCallback
from vizopt.base import OptimConfig
from vizopt.templates.layered_graph import LayeredGraphOptimizer
# Build a simple DAG
dag = nx.DiGraph()
dag.add_edges_from(
    [
        ("A", "B"),
        ("A", "C"),
        ("B", "D"),
        ("B", "E"),
        ("C", "E"),
        ("C", "F"),
        ("D", "G"),
        ("E", "G"),
        ("F", "G"),
    ]
)

optimizer = LayeredGraphOptimizer(
    dag, min_distance=1.5, preferred_edge_vector=(1.0, 0.0), weight_edge_direction=0.0
)
optimizer.optimize(OptimConfig(n_iters=5000, learning_rate=1e-2))

optimizer.plot()
plt.title("Layered graph layout (standard direction → (1, 0))")
plt.show()

output

snapshot_cb = SnapshotCallback(every=50)
optimizer = LayeredGraphOptimizer(
    dag, min_distance=1.5, preferred_edge_vector=(1.0, 0.0), weight_edge_direction=0.0
)
optimizer.optimize(OptimConfig(n_iters=5000, learning_rate=3e-3), callback=snapshot_cb)

svg = optimizer.animate_svg(snapshot_cb, fps=12, size=500)
SVG(data=svg)

output