如何使用Python可视化具有大量节点和边的图?

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

我想可视化一个具有大量节点和边的有向图。该图有大约 2000 个节点,这些节点之间的有向边数量几乎相同。边可以连接两个节点。例如,node_1 和node_2 可以通过边node_1_node_2 连接,反之亦然,node_2_node_1。可能存在多个将这些节点或其他节点连接到该节点的节点。 我想可视化所有节点和所有现有边。 目前,节点和边位于 CSV 表中,但可以将它们加载到 dict 或 json 文件中。 我用 python 实现了代码,并得到了一张漂亮的图形图片:

为此,我使用了以下代码:

from matplotlib import pyplot as plt
import networkx as nx

G = nx.MultiDiGraph([
    ('BAY_530', 'BAY_530_E'),
    ('BAY_530_E', 'BAY_530_W'),
    ('BAY_530_E', 'SSX_W'),
    ('BAY_530', 'INTR_530'),
    ('BAY_530_W', 'BAY_530'),
    ('INTR_530', 'BAY_530'),
    ('INTR_530', 'M_502_5'),
    ('M_502_1', 'M_502_2'),
    ('M_502_2', 'M_502_1'),
    ('M_502_2', 'M_502_3'),
    ('M_502_3', 'M_502_2'),
    ('M_502_3', 'M_502_4'),
    ('M_502_4', 'M_502_3'),
    ('M_502_4', 'M_502_5'),
    ('M_502_5', 'M_502_4'),
    ('M_502_5', 'SSX_S'),
    ('SSX_N', 'SSX_S'),
    ('SSX_N', 'SSX_W'),
    ('SSX_S', 'INTR_530'),
    ('SSX_S', 'SSX_N'),
    ('SSX_W', 'BAY_530_E'),
    ('SSX_W', 'SSX_N')
])

pos = nx.circular_layout(G)
#pos = nx.spring_layout(G, seed=3113794652)
names = {name: name for name in G.nodes}
options = {"edgecolors": "tab:gray", "node_size": 800, "alpha": 0.9}

nx.draw_networkx_nodes(G, pos, node_color='b', node_size=1500, alpha=1)
nx.draw_networkx_labels(G, pos, names, font_size=8, font_color='w')

ax = plt.gca()
for e in G.edges:
    ax.annotate("",
                xy=pos[e[1]], xycoords='data',
                xytext=pos[e[0]], textcoords='data',
                arrowprops=dict(arrowstyle="->", color="0",
                                shrinkA=10, shrinkB=10,
                                patchA=None, patchB=None,
                                connectionstyle="arc3,rad={}".format(0.3 * e[2])
                                )
                )

plt.tight_layout()
plt.axis('off')
plt.show()

它适用于少量的边和节点, 但是如果我增加节点的数量,就很难以漂亮的方式排列这些节点和边缘。因为它们相互重叠,所以不可能理解什么与什么相关。

我还尝试使用鼠标悬停来选择一个节点,然后突出显示进出该节点的边缘。 我必须在这里指出,为了更好地理解两个节点之间的连接/关系,每个连接的边必须是分开的。 我也尝试过使用圆形布局,但后来它变得很大并且没有显示所有连接。

我知道 javascript 中有一个 D3 库可能适合我,但我想用 python 实现它。

是否存在更好的方法在 python 中实现这一点,或者是否有更好的库可以处理大量的边和节点?我还希望支持动态元素,例如 onclick 或 mouseover,以便能够实现选择节点,然后突出显示连接的节点和边。

javascript python d3.js graph-theory graph-visualization
1个回答
0
投票

你能找到解决方案吗?我仍然需要使它适合我的用例,但此链接可能有用。

https://examples.holoviz.org/uk_researchers/uk_researchers.html

© www.soinside.com 2019 - 2024. All rights reserved.