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

时间:2019-06-14 12:04:10

标签: python networkx graph-theory

这是加权图的邻接矩阵,因此元素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]]

我的主要目的是生成该图的图示。

我可以在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()

但是我看不到重量。我也对图像不满意,还没有准备好发布。 有人能做到这一点吗?

3 个答案:

答案 0 :(得分:1)

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]]

import matplotlib.pyplot as plt
import networkx as nx
import numpy as np
G = nx.from_numpy_matrix(np.matrix(A))
edge_labels=nx.draw_networkx_edge_labels(G,pos=nx.spring_layout(G))
nx.draw(G)
plt.show()

draw_networkx_edge_labels

draw_networkx_edge_labels(G,pos,edge_labels = None,label_pos = 0.5,font_size = 10,font_color ='k',font_family ='sans-serif',font_weight ='normal',alpha = 1.0,bbox = None,ax = None,rotate = True,** kwds)[源代码]

绘制边缘标签。

参数:

G(图)–一个networkx图

pos(字典)–以节点为键,位置为值的字典。位置应为长度2的序列。

ax(Matplotlib轴对象,可选)–在指定的Matplotlib轴上绘制图形。

alpha(浮点)–文本透明度(默认= 1.0)

edge_labels(词典)–字典中的边缘标签由边缘两元组文本标签(默认值:无)键入。仅绘制字典中键的标签。 label_pos(浮动)–边缘标签沿边缘的位置(0 =头,0.5 =中心,1 =尾巴)

font_size(int)–文本标签的字体大小(默认= 12)

font_color(字符串)–字体颜色字符串(默认=“ k”黑色)

font_weight(字符串)–字体粗细(默认=“正常”)

font_family(字符串)–字体家族(默认=“ sans-serif”)

bbox(Matplotlib bbox)–指定文本框的形状和颜色。

clip_on(布尔型)–在轴边界处启用剪裁(默认值为True)

返回:

在边缘上键入标签的字典

返回类型:

dict

答案 1 :(得分:1)

您需要指定要绘制边缘标签。为此,您必须致电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()

示例:

Example visualization with edge labels

请注意,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)

答案 2 :(得分:1)

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, node_size=1000, with_labels=True, font_weight='bold',    font_size=15)
labels = nx.get_edge_attributes(G,'weight')
nx.draw_networkx_edge_labels(G,pos=layout,edge_labels=labels)
plt.show()