Spaces:
Sleeping
Sleeping
| import streamlit as st | |
| import networkx as nx | |
| from pyvis.network import Network | |
| import json | |
| from streamlit.components.v1 import html | |
| # Streamlit app layout | |
| st.title("Interactive Graph Visualization and Editor") | |
| st.write("Edit the graph's JSON data and visualize updates dynamically.") | |
| # Read the test.json file initially | |
| default_file = "test.json" | |
| # Function to load JSON from file | |
| def load_json_file(file_path): | |
| try: | |
| with open(file_path, "r") as file: | |
| return json.load(file) | |
| except Exception as e: | |
| st.error(f"Error loading the file: {e}") | |
| return {"nodes": [], "edges": []} | |
| # Load the graph data from the default JSON file | |
| graph_data = load_json_file(default_file) | |
| # Sidebar editor for JSON input | |
| st.sidebar.header("Edit Graph JSON") | |
| json_editor = st.sidebar.text_area("Graph JSON", value=json.dumps(graph_data, indent=4), height=300) | |
| if st.sidebar.button("Update Graph"): | |
| try: | |
| # Parse the updated JSON | |
| graph_data = json.loads(json_editor) | |
| # Save back to the file | |
| with open(default_file, "w") as file: | |
| json.dump(graph_data, file, indent=4) | |
| st.success("Graph JSON updated successfully!") | |
| except Exception as e: | |
| st.sidebar.error(f"Invalid JSON format: {e}") | |
| # Validate JSON structure | |
| if "nodes" not in graph_data or "edges" not in graph_data: | |
| st.error("The JSON file must contain 'nodes' and 'edges' keys.") | |
| else: | |
| try: | |
| # Function to create a NetworkX graph from data | |
| def create_graph(data): | |
| G = nx.DiGraph() | |
| for node in data["nodes"]: | |
| G.add_node(node["id"], label=node.get("label", node["id"])) | |
| for edge in data["edges"]: | |
| G.add_edge(edge["source"], edge["target"], label=edge.get("label", "")) | |
| return G | |
| # Generate the graph | |
| graph = create_graph(graph_data) | |
| # Function to create a pyvis network from NetworkX graph | |
| def create_pyvis_graph(G): | |
| net = Network(height="600px", width="100%", directed=True) | |
| for node, data in G.nodes(data=True): | |
| net.add_node(node, label=data.get("label", node)) | |
| for source, target, data in G.edges(data=True): | |
| net.add_edge(source, target, title=data.get("label", "")) | |
| return net | |
| # Create the Pyvis graph | |
| pyvis_graph = create_pyvis_graph(graph) | |
| # Generate the HTML representation of the graph | |
| pyvis_graph_html = pyvis_graph.generate_html() | |
| # Display the graph in Streamlit | |
| html(pyvis_graph_html, height=600) | |
| except Exception as e: | |
| st.error(f"Error processing the graph: {e}") | |