|
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>""" |
|
|