Source code for pm4py.visualization.networkx.variants.digraph
'''
PM4Py – A Process Mining Library for Python
Copyright (C) 2024 Process Intelligence Solutions UG (haftungsbeschränkt)
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see this software project's root or
visit <https://www.gnu.org/licenses/>.
Website: https://processintelligence.solutions
Contact: info@processintelligence.solutions
'''
from enum import Enum
from pm4py.util import exec_utils, constants
from typing import Optional, Dict, Any
import graphviz
import tempfile
import uuid
import networkx as nx
[docs]
class Parameters(Enum):
FORMAT = "format"
BGCOLOR = "bgcolor"
RANKDIR = "rankdir"
INCLUDE_NODE_ATTRIBUTES = "include_node_attributes"
INCLUDE_EDGE_ATTRIBUTES = "include_edge_attributes"
[docs]
def apply(
G: nx.DiGraph, parameters: Optional[Dict[Any, Any]] = None
) -> graphviz.Digraph:
"""
Creates a Graphviz Digraph from a NetworkX DiGraph object.
Minimum viable example:
import pm4py
from pm4py.visualization.networkx import visualizer as nx_to_gv_vis
log = pm4py.read_xes("../tests/input_data/running-example.xes")
# gets an 'event graph' where events, cases and their relationships
# are represented in a graph (NetworkX DiGraph)
event_graph = pm4py.convert_log_to_networkx(log)
# visualize the NX DiGraph using Graphviz
gviz = nx_to_gv_vis.apply(event_graph, parameters={"format": "svg"})
nx_to_gv_vis.view(gviz)
Parameters
---------------
G
NetworkX DiGraph
parameters
Parameters of the visualization, including:
- Parameters.FORMAT => format of the visualization (.png, .svg)
- Parameters.BGCOLOR => background color of the visualization (transparent, white)
- Parameters.RANKDIR => direction of the graph (LR or TB)
- Parameters.INCLUDE_NODE_ATTRIBUTES => includes the node attributes in the node's label in the representation
- Parameters.INCLUDE_EDGE_ATTRIBUTES => includes the edge attributes in the edge's label in the representation
Returns
--------------
digraph
Graphviz DiGraph object
"""
if parameters is None:
parameters = {}
format = exec_utils.get_param_value(
Parameters.FORMAT, parameters, constants.DEFAULT_FORMAT_GVIZ_VIEW
)
bgcolor = exec_utils.get_param_value(
Parameters.BGCOLOR, parameters, constants.DEFAULT_BGCOLOR
)
rankdir = exec_utils.get_param_value(Parameters.RANKDIR, parameters, "LR")
include_node_attributes = exec_utils.get_param_value(
Parameters.INCLUDE_NODE_ATTRIBUTES, parameters, True
)
include_edge_attributes = exec_utils.get_param_value(
Parameters.INCLUDE_EDGE_ATTRIBUTES, parameters, True
)
filename = tempfile.NamedTemporaryFile(suffix=".gv")
viz = graphviz.Digraph(
"networkx_digraph",
filename=filename.name,
engine="dot",
graph_attr={"bgcolor": bgcolor},
)
nodes_dict = {}
for node in G.nodes:
node_id = str(uuid.uuid4())
nodes_dict[node] = node_id
label = str(node)
if include_node_attributes and G.nodes[node]:
label += "\n" + str(G.nodes[node]).replace(", ", ",\n")
viz.node(node_id, label=label, shape="box")
for edge in G.edges:
label = " "
if include_edge_attributes and G.edges[edge]:
label = str(G.edges[edge]).replace(", ", ",\n")
viz.edge(nodes_dict[edge[0]], nodes_dict[edge[1]], label=label)
viz.attr(rankdir=rankdir)
viz.format = format.replace("html", "plain-ext")
return viz