我正在尝试制作一个包含 1500 个节点的图表(稍后,它们应该是 1000 万个......)。我使用 pyvis 是因为它可以使图形在大范围内可读(使用 networkx 看起来非常糟糕)。 但是当我只有 1500 个节点并且物理激活时,加载(html)需要 2 分钟。而且,当我禁用物理功能时,我会得到一个奇怪的结果,如下所示: (请注意,大多数节点都位于同一位置的中心,因此即使缩放也无法读取)。 当物理看起来像这样时
所以我想知道是否可以在没有物理的情况下得到一个漂亮的图表,或者是否有办法使物理的生成过程更快
以我的代码为例,它从 JSON 生成图形,并根据 python 中的连接将大小应用于节点:
import networkx as nx
import matplotlib.pyplot as plt
import json
from pyvis.network import Network
def create_from_json(json_file):
G = nx.DiGraph(directed=True)
with open(json_file, 'r') as f:
data = json.load(f)
for key, values in data.items():
for element in values:
G.add_edge(str(key), str(element))
node_degree = dict(G.degree())
for key in data.keys():
if key in node_degree:
del node_degree[key]
scale = 10
node_size = {node: scale * degree for node, degree in node_degree.items()}
nx.set_node_attributes(G, node_size, 'size')
G2 = Network(height="1500px", width="1900px", bgcolor="#222222", font_color="white", directed=True)
G2.from_nx(G)
G2.toggle_physics(False)
G2.show_buttons(True)
G2.show("wikimap.html", notebook=False)
create_from_json("dico_unique.json")
将网络x导入为nx 将 matplotlib.pyplot 导入为 plt 导入 json 从 pyvis.network 导入网络
def create_from_json(json_file): G = nx.DiGraph(有向=True) 将 open(json_file, 'r') 作为 f: 数据 = json.load(f) 对于 data.items() 中的键、值: 对于值中的元素: G.add_edge(str(key), str(element))
layout = nx.spring_layout(G)
G2 = Network(height="1500px", width="1900px", bgcolor="#222222", font_color="white", directed=True)
G2.from_nx(G, default_node_size=30)
for node in G2.nodes:
node_id = node["id"]
if node_id in layout:
node["x"], node["y"] = layout[node_id][0]*1000, layout[node_id][1]*1000 # Adjust scaling factor as needed
G2.toggle_physics(False)
G2.show_buttons(filter_=['physics'])
G2.show("wikimap.html", notebook=False)