NetoworkX根据权重设置边缘宽度。

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

我有一个numpy数组。

[[12,  1,  5,  2,  2,  2,  1,  3,  1,  2],
   [ 1, 10,  3,  2,  1,  7,  2,  6,  1,  0],
   [ 5,  3, 26,  5,  1,  5,  2, 11,  3,  5],
   [ 2,  2,  5, 11,  1,  2,  1,  7,  2,  4],
   [ 2,  1,  1,  1, 17,  2,  1,  6,  2,  2],
   [ 2,  7,  5,  2,  2, 22, 12,  8,  1,  0],
   [ 1,  2,  2,  1,  1, 12, 21,  7,  0,  1],
   [ 3,  6, 11,  7,  6,  8,  7, 23,  0,  5],
   [ 1,  1,  3,  2,  2,  1,  0,  0,  3,  1],
   [ 2,  0,  5,  4,  2,  0,  1,  5,  1,  4]]

我想创建一个二维网络图,比如说 这个 - 在页面的底部(只是2D)。我找到了一个名为 networkx 它有一个非常简单的函数来从一个numpy数组中创建一个二维图形。

import networkx as nx
G = nx.from_numpy_matrix(array)
nx.draw(G, with_labels=1)

enter image description here但它不是交互式的. 我还试图用数组的实际标签来替换图上的标签(是字符串--比如,'一','二'......'十').最后,目标是让图上的边缘的宽度是数组中的数字。

python numpy graph plotly networkx
1个回答
1
投票

通过 nx.draw 您可以自定义可视化,以满足大多数上述要求。尽管在某些情况下,您可能需要使用在 绘图 诸如 nx. draw_networkx_nodes 等来进一步定制。

在这种情况下,假设你有一个包含你想设置的标签名的数组,你可以使用 nx.draw_networkx_labels 并用一个字典指定标签的映射,你可以定义为。

G = nx.from_numpy_matrix(a)

nodelist = G.nodes()
num_words = ['Zero', 'One', 'Two', 'Three', 'Four', 'Five', 'Six', 'Seven', 'Eight', 'Nine']
d_labels = dict(zip(nodelist, num_words))

注意,通过使用 nx.from_numpy_matrix 数组中的实际值被设置为边沿 weights所以你可以使用 nx.get_edge_attributes 以获得相应的边缘宽度。

widths = nx.get_edge_attributes(G, 'weight')

这些宽度可以在以后的 nx.draw_networkx_edges 纵观 width 参数。最后,关于如何使图形具有交互性,你可以考虑一下以下几点 node_picking.

把所有的东西放在一起,我们可以把这个图画成。

plt.figure(figsize=(18,13))

pos = nx.spring_layout(G, scale=0.2)
nx.draw_networkx_nodes(G,pos,
                       nodelist=nodelist,
                       with_labels=True,
                       node_size=1500,
                       node_color='black',
                       font_color='white',
                       alpha=0.7)
nx.draw_networkx_edges(G,pos,
                       edgelist = widths.keys(),
                       width=list(widths.values()),
                       edge_color='orange',
                       alpha=0.6)
nx.draw_networkx_labels(G, pos=pos,
                        labels=d_labels,
                        font_color='white')
plt.box(False)
plt.show()

enter image description here

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