【问题标题】:Drawing weighted graph from adjacency matrix with edge labels从带有边缘标签的邻接矩阵中绘制加权图
【发布时间】:2019-06-14 12:04:10
【问题描述】:

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

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

【问题讨论】:

  • TypeError: Input graph is not a networkx graph type
  • 我可以删除 create_using=nx.DiGraph 吗?
  • @JainilPatel 是的,当然,只要图表显示有向边

标签: python networkx graph-theory


【解决方案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()

例子:

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

【讨论】:

  • raise TypeError("Input graph is not a networkx graph type") TypeError: Input graph is not a networkx graph type
  • @JainilPatel 我认为您的 networkx 包中不知何故没有 DiGraphs,它对我有用
  • 谢谢。任何想法只将实际权重显示为数值,而不是键值对?
【解决方案2】:
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()

【讨论】:

    【解决方案3】:
    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 =无,旋转=真,**kwds)[来源]

    绘制边缘标签。

    参数:

    G (graph) - 一个networkx图

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

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

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

    edge_labels (dictionary) – 字典中的边缘标签,由边缘二元组文本标签键控(默认 = 无)。仅绘制字典中键的标签。 label_pos (float) – 边缘标签沿边缘的位置(0=head, 0.5=center, 1=tail)

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

    font_color (string) – 字体颜色字符串(默认='k' black)

    font_weight (string) – 字体粗细(默认='normal')

    font_family (string) – 字体系列(默认='sans-serif')

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

    clip_on (bool) – 在轴边界处打开剪辑(默认=True)

    返回:

    边缘标注的标签字典

    返回类型:

    字典

    【讨论】:

      猜你喜欢
      • 2020-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-04
      • 1970-01-01
      相关资源
      最近更新 更多