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

4

这是一个加权图的邻接矩阵,其中元素ai,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()

但我看不到权重。我对这个图像也不是很满意,它还没有准备好发表。


类型错误:输入的图形不是networkx图形类型。 - Jainil Patel
我可以删除create_using=nx.DiGraph吗? - Jainil Patel
@JainilPatel 当然可以,只要图表显示有向边。 - chasmani
3个回答

5
你需要指定要绘制边缘标签。为此,您必须调用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)

引发 TypeError("输入的图形不是 networkx 图形类型") TypeError: 输入的图形不是 networkx 图形类型 - Jainil Patel
@JainilPatel 我认为你的networkx包中可能没有DiGraphs,这对我是有效的。 - chasmani
有没有办法只显示实际权重,而不是键值对? - chasmani

4
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()

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)[source]

绘制边缘标签。

参数:

G (图表) - 一个networkx图表

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

ax (Matplotlib Axes对象,可选) - 在指定的Matplotlib axes中绘制图表。

alpha (浮点数) - 文本透明度(默认为1.0)

edge_labels (字典) - 边缘标签在一个字典中,以文本标签的两个元组为键(默认为None)。仅绘制字典中键的标签。

label_pos (浮点数) - 边缘标签沿边缘的位置(0 = 头部,0.5 = 中心,1 = 尾部)

font_size (整数) - 文本标签的字体大小(默认为12)

font_color (字符串) - 字体颜色字符串(默认为'k'黑色)

font_weight (字符串) - 字体粗细(默认值为“normal”)

font_family (字符串) - 字体族(默认值为“sans-serif”)

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

clip_on (布尔值) - 在轴边界处打开剪辑(默认值为True)

返回:

以边缘为键的标签字典

返回类型:

字典


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接