Skip to content

sgn.visualize

visualize(pipeline, label=None, path=None)

convert a pipeline to a graphviz.DiGraph object

Source pads are light green, sink pads are light blue, and unconnected pads are red.

Parameters:

Name Type Description Default
pipeline Graph

The pipeline to visualize.

required
label str | None

Label for graph.

None
path Path | None

If set, save graph visualization to a file (format based on file extension).

None

Returns:

Type Description

graphviz.Digraph: the graph object

Source code in src/sgn/visualize.py
def visualize(pipeline, label=None, path=None):
    """convert a pipeline to a graphviz.DiGraph object

    Source pads are light green, sink pads are light blue, and
    unconnected pads are red.

    Args:
        pipeline (Graph): The pipeline to visualize.
        label (str | None): Label for graph.
        path (Path | None): If set, save graph visualization to a file
            (format based on file extension).

    Returns:
        graphviz.Digraph: the graph object

    """
    try:
        import graphviz
    except ImportError:
        raise ImportError("graphviz needs to be installed to visualize pipelines")

    # create the graph
    graph = graphviz.Digraph(
        "pipeline",
        graph_attr={
            "labelloc": "t",
            "rankdir": "LR",
            "ranksep": "2",
        },
        node_attr={
            "shape": "plaintext",
            "fontname": "times mono",
        },
    )
    if label:
        graph.graph_attr["label"] = f"""<<font point-size="32"><b>{label}</b></font>>"""

    # create nodes for all the elemnts
    for name in pipeline.nodes(pads=False):
        element = pipeline[name]
        struct = _element_struct_plaintext(element)
        graph.node(
            element.name,
            struct,
        )

    # connect all the element pads
    for sname, tname in pipeline.edges(pads=True, intra=False):
        target = pipeline[tname]
        source = pipeline[sname]
        graph.edge(
            source.element.name + ":" + _id(source.name),
            target.element.name + ":" + _id(target.name),
        )

    if path:
        graph.render(
            outfile=path,
            cleanup=True,
        )

    return graph