| import json | |
| from pyvis.network import Network | |
| def create_graph(nodes, edges, physics_enabled=True): | |
| net = Network( | |
| notebook=True, | |
| height="100vh", | |
| width="100vw", | |
| bgcolor="#222222", | |
| font_color="white", | |
| cdn_resources="remote", | |
| ) | |
| for node in nodes: | |
| net.add_node( | |
| node["id"], | |
| label=node["label"], | |
| title=node["label"], | |
| color="blue" if node["label"] == "OOP" else "green", | |
| ) | |
| for edge in edges: | |
| net.add_edge(edge["source"], edge["target"], title=edge["type"]) | |
| net.force_atlas_2based( | |
| gravity=-50, | |
| central_gravity=0.01, | |
| spring_length=100, | |
| spring_strength=0.08, | |
| damping=0.4, | |
| ) | |
| options = { | |
| "nodes": {"physics": physics_enabled}, | |
| "edges": {"smooth": True}, | |
| "interaction": {"hover": True, "zoomView": True}, | |
| "physics": { | |
| "enabled": physics_enabled, | |
| "stabilization": {"enabled": True, "iterations": 200}, | |
| }, | |
| } | |
| net.set_options(json.dumps(options)) | |
| return net | |
| def visualize_graph(json_data, physics_enabled=True): | |
| if isinstance(json_data, str): | |
| data = json.loads(json_data) | |
| else: | |
| data = json_data | |
| nodes = data["nodes"] | |
| edges = data["edges"] | |
| net = create_graph(nodes, edges, physics_enabled) | |
| html = net.generate_html() | |
| html = html.replace("'", '"') | |
| html = html.replace( | |
| '<div id="mynetwork"', '<div id="mynetwork" style="height: 100vh; width: 100%;"' | |
| ) | |
| return f"""<iframe style="width: 100%; height: 100vh; border: none; margin: 0; padding: 0;" srcdoc='{html}'></iframe>""" | |