File size: 1,694 Bytes
5ce695c |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
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>"""
|