BridgeMentor / visualize_network.py
SushantGautam's picture
Implement network visualization with Django models and save as HTML
6bf314a
import networkx as nx
import django
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "BridgeMentor.settings")
django.setup()
from core.models import Author, Institution, Concept, AuthorConcept, Affiliation, Work, Topic, Subfield, Field, Domain, AuthorTopic # noqa: E402
from pyvis.network import Network # noqa: E402
G = nx.Graph()
# Add authors
for a in Author.objects.all()[:100]:
G.add_node(a.id, label=a.name, group="Author")
# Add institutions
for i in Institution.objects.all()[:100]:
G.add_node(i.id, label=i.name, group="Institution")
# Add affiliations
for af in Affiliation.objects.select_related('author', 'institution')[:100]:
G.add_edge(af.author.id, af.institution.id, title="affiliated_with")
# Add concepts
for c in Concept.objects.all()[:100]:
G.add_node(c.id, label=c.name, group="Concept")
# AuthorConcept edges
for ac in AuthorConcept.objects.select_related('author', 'concept')[:100]:
G.add_edge(ac.author.id, ac.concept.id, title="interested_in")
# Works and their authors
for w in Work.objects.select_related('author')[:100]:
G.add_node(w.id, label=w.title, group="Work")
G.add_edge(w.author.id, w.id, title="authored")
# Topics
for t in Topic.objects.select_related('subfield')[:100]:
G.add_node(t.id, label=t.name, group="Topic")
G.add_edge(t.id, t.subfield.id, title="belongs_to")
# AuthorTopics
for at in AuthorTopic.objects.select_related('author', 'topic')[:100]:
G.add_edge(at.author.id, at.topic.id, title="researches")
# Subfields
for sf in Subfield.objects.select_related('field')[:100]:
G.add_node(sf.id, label=sf.name, group="Subfield")
G.add_edge(sf.id, sf.field.id, title="part_of")
# Fields
for f in Field.objects.select_related('domain')[:100]:
G.add_node(f.id, label=f.name, group="Field")
G.add_edge(f.id, f.domain.id, title="within")
# Domains
for d in Domain.objects.all()[:100]:
G.add_node(d.id, label=d.name, group="Domain")
# Generate minimal graph
net = Network(
height="800px",
width="100%",
bgcolor="#ffffff",
font_color="black",
heading="Norway Computer Science Research Graph", # Remove heading
# directed=False, # Simpler view
# select_menu=True, # Enables dropdown to highlight node + neighbors
# filter_menu=True # Enables advanced filtering by attributes
)
# Reduce interactivity and noise
net.barnes_hut(gravity=-20000, central_gravity=0.3)
net.set_options("""
{
"nodes": {
"shape": "dot",
"size": 10,
"font": {
"size": 12,
"face": "Arial"
}
},
"edges": {
"color": {
"inherit": true
},
"smooth": false
},
"layout": {
"improvedLayout": false
},
"interaction": {
"hover": true,
"tooltipDelay": 200,
"hideEdgesOnDrag": true,
"navigationButtons": true,
"keyboard": {
"enabled": true,
"speed": {
"x": 10,
"y": 10,
"zoom": 0.02
},
"bindToWindow": true
}
},
"physics": {
"enabled": true,
"barnesHut": {
"gravitationalConstant": -20000,
"centralGravity": 0.3,
"springLength": 95
}
},
"manipulation": {
"enabled": false
},
"configure": {
"enabled": false,
"filter": ["nodes", "edges", "physics"],
"showButton": false
}
}
""")
net.from_nx(G)
html_content = net.generate_html()
# Save the modified HTML
html_path = "test.html"
with open(html_path, "w", encoding="utf-8") as f:
f.write(html_content)