使用 pyvis 处理大图

问题描述 投票:0回答:1

我正在尝试制作一个包含 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")
python matplotlib graphics networkx pyvis
1个回答
0
投票

将网络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)
© www.soinside.com 2019 - 2024. All rights reserved.