Spaces:
Running
Running
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) | |