linpershey/process_mining
0
1import dash2from dash import dcc, html3from dash.dependencies import Input, Output4import plotly.graph_objects as go5import networkx as nx6 7# Create a directed graph8G = nx.DiGraph()9 10# Add nodes11G.add_nodes_from([1, 2, 3, 4, 5, 6, 7, 8, 9])12 13# Add directed edges14G.add_edges_from([(1, 2), (1, 3), (2, 4), (3, 5), (1, 6), (4,7), (4,8),(5,7), (5,8), (7,9), (8,9), (6,9), (6,6)])15 16# Initialize the Dash app17app = dash.Dash(__name__)18 19app.layout = html.Div([20 dcc.Dropdown(21 id='node-dropdown',22 options=[{'label': f'Node {i}', 'value': i} for i in G.nodes],23 value=None,24 placeholder="Select a node to filter"25 ),26 dcc.Graph(id='network-graph')27])28 29@app.callback(30 Output('network-graph', 'figure'),31 Input('node-dropdown', 'value')32)33def update_graph(selected_node):34 if selected_node is not None:35 nodes_to_filter = [selected_node]36 else:37 nodes_to_filter = []38 39 filtered_graph = filter_nodes(G, nodes_to_filter)40 41 pos = nx.spring_layout(filtered_graph)42 43 node_trace = go.Scatter(44 x=[pos[n][0] for n in filtered_graph.nodes],45 y=[pos[n][1] for n in filtered_graph.nodes],46 text=list(filtered_graph.nodes),47 mode='markers+text',48 textposition='top center',49 marker=dict(size=20, color='LightSkyBlue', line=dict(width=2))50 )51 52 edge_trace = go.Scatter(53 x=(),54 y=(),55 line=dict(width=1.5, color='Gray'),56 hoverinfo='none',57 mode='lines'58 )59 60 annotations = []61 for edge in filtered_graph.edges:62 x0, y0 = pos[edge[0]]63 x1, y1 = pos[edge[1]]64 edge_trace['x'] += (x0, x1, None)65 edge_trace['y'] += (y0, y1, None)66 67 annotations.append(68 dict(69 ax=x0,70 ay=y0,71 axref='x',72 ayref='y',73 x=x1,74 y=y1,75 xref='x',76 yref='y',77 showarrow=True,78 arrowhead=2,79 arrowsize=1,80 arrowwidth=2,81 arrowcolor='Gray'82 )83 )84 85 fig = go.Figure(data=[edge_trace, node_trace],86 layout=go.Layout(87 showlegend=False,88 hovermode='closest',89 margin=dict(b=0, l=0, r=0, t=0),90 annotations=annotations,91 xaxis=dict(showgrid=False, zeroline=False),92 yaxis=dict(showgrid=False, zeroline=False)93 ))94 95 return fig96 97def filter_nodes(graph, nodes_to_remove):98 filtered_graph = graph.copy()99 for node in nodes_to_remove:100 if node in filtered_graph:101 filtered_graph.remove_node(node)102 return filtered_graph103 104if __name__ == '__main__':105 app.run_server(debug=True, port=8050, host='0.0.0.0')106 107 