从带有边标签的邻接矩阵绘制加权图

cha*_*ani 6 python graph-theory networkx

这是加权图的邻接矩阵,其中元素 a i,j是从节点 i 到节点 j 的有向边的权重。

A = [
    [0, 1,  0,  .8, 0],
    [0, 0,  .4, 0,  .3],
    [0, 0,  0,  0,  0],
    [0, 0,  .6, 0,  .7],
    [0, 0,  0,  .2, 0]]
Run Code Online (Sandbox Code Playgroud)

我的主要目标是生成该图的插图。

我可以在 networkx 中生成一个图,如下所示:

import matplotlib.pyplot as plt
import networkx as nx
import numpy as np

G = nx.from_numpy_matrix(np.matrix(A), create_using=nx.DiGraph)
nx.draw(G)
plt.show()
Run Code Online (Sandbox Code Playgroud)

但我看不到重量。我对这张图片也不是很满意,它还没有准备好出版。有没有人有一个好方法来做到这一点?

Lom*_*rur 6

您需要指定要绘制边缘标签。为此,您必须调用networkx.drawing.nx_pylab.draw_networkx_edge_labels

它有一个参数pos,一个以节点为键、位置为值的字典。重要的是您对节点和标签使用相同的布局,否则它们将不会对齐!

一个简单的方法是让 networkx 处理布局,例如使用spring_layout.

import matplotlib.pyplot as plt
import networkx as nx
import numpy as np

A = [
    [0, 1,  0,  .8, 0],
    [0, 0,  .4, 0,  .3],
    [0, 0,  0,  0,  0],
    [0, 0,  .6, 0,  .7],
    [0, 0,  0,  .2, 0]]

G = nx.from_numpy_matrix(np.matrix(A), create_using=nx.DiGraph)
layout = nx.spring_layout(G)
nx.draw(G, layout)
nx.draw_networkx_edge_labels(G, pos=layout)
plt.show()
Run Code Online (Sandbox Code Playgroud)

例子:

带边缘标签的可视化示例

请注意,spring_layout使用 Fruchterman-Reingold 力导向算法,该算法是非确定性的,因此您的图表几乎肯定不会看起来相同。然而,通常它会产生漂亮的结果,因此这不应该是一个主要问题。

文档:networkx.drawing.layout.spring_layout,不幸的是它没有提到它是不确定的。

更新:

让标签仅是权重(而不是字典):

labels = nx.get_edge_attributes(G, "weight")
nx.draw_networkx_edge_labels(G, pos=layout, edge_labels=labels)
Run Code Online (Sandbox Code Playgroud)