我有一个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)
但它不是交互式的. 我还试图用数组的实际标签来替换图上的标签(是字符串--比如,'一','二'......'十').最后,目标是让图上的边缘的宽度是数组中的数字。
通过 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()