Python之networkx绘制网络图

目录

1.创建指定的网络图

2.添加结点(node)、边(edge)、权重(weight)

3.设置图的位置

4.绘图

5.输出邻接矩阵


本文需要用到的库有:networkx,pylab

1.创建指定的网络图
 

图的类型

对应代码
3正则图
G=nx.cubical_graph()
无向图
G=nx.Graph()
有向图
G=nx.DiGraph()
多重无向图 G=nx.MultiGraph()
多重有向图 G=nx.MultiDiGraph()

1.1 利用邻接矩阵来创建图

在以上代码的括号内放入对应的邻接矩阵即可

例如:

G=nx.Graph(W)  # W是邻接矩阵

如果 括号内不放入邻接矩阵,那么会创建一个空对象,需要利用下面的方法向图中添加属性

2.添加结点(node)、边(edge)、权重(weight)

  • 2.1添加结点(node)

    添加结点的方式 例子 对应代码
    添加单个结点:直接在括号内填编号 添加编号为1的结点
    G.add_node(1)   # 添加编号为1的结点

    添加多个结点:在括号内放入列表 添加编号为A、B的结点
    G.add_nodes_from(['A','B'])  # 从列表中添加结点

    添加编号为1~7的结点
    G.add_nodes_from(range(1,7))

  • 2.2添加边(edge)

    添加边的方式 例子 对应代码
    添加1条边:直接在括号内填两个结点名称 在A、B之间加1条边
    G.add_edge('A','B') 

    添加多条边:在括号内放入列表 添加list中的边
    list=[(1,2),(1,3),(2,3),
    (3,2),(3,5),(4,2),
    (4,6),(5,2),(5,4),
    (6,5)]
    
    G.add_edges_from(list)

  • 2.3添加权重(weight)

    注意:权重一般不会单独添加,而是与对应的边一起同时添加

    因此,添加权重的本质是:添加有权重的边

    添加有权重的边的方式 例子 对应代码
    添加1条有权重的边:直接把两个结点、权重写在括号内
    添加结点1、2之间一条权重为0.5的边
    # 添加编号为1、编号为2的结点,并在二者之间加一条权重为0.5的边
    G.add_edge(1,2,weight=0.5)

    添加多条有权重的边:用列表 添加list中的赋权边
    list=[('A','B',0.3),('B','C',0.9),('A','C',0.5),('C','D',1.2)]
    G.add_weighted_edges_from(list)  # 从列表中添加多条赋权边

    2.4总结:

  • 无论是添加结点、边、权重,都有:

    如果添加1个,则直接写在括号内;

    如果添加多个,则先写在列表里,再放进括号内

    3.设置图的位置、字体、标题等

    注意:首先要引入库pylab

    import pylab as plt
    
    plt.subplot(221) # 设置图的位置
    plt.rc("font",size=16)  # 设置图的字体
    plt.title("My title")  # 设置图的标题

    4.绘图

    4.1使用函数nx.draw(G,pos,ax,kwds)

    参数解读:

  • G:所创建的图
  • pos:布局方式
    布局方式 对应代码
    结点在1个圆环上均匀分布 nx.circular_layout(G)
    结点在1个单位正方形内随机分布 nx.random_layout(G)
    结点在多个同心圆上分布 nx.shell_layout(G)
    结点按Fruchterman-Reingold算法分布 nx.spring_layout(G)
    结点根据图的拉普拉斯特征向量分布 nx.spectral_layout(G)
  • labels:
    可以自行以字典形式设置标记
  • with_labels=True/False:
    with_labels=True 

    若在创建图时没有标记,则系统自动添加标记为0~n-1 (n为结点个数)
    若在创建图时有标记,则显示这些已有的标记
    with_labels=False
    不显示标记
  • node_color:结点颜色
  • node_shape:结点形状
  • edge_color:边的颜色
  • 例子: 

    mark=['v'+str(i) for i in range(1,9)]
    mark=dict(zip(range(8),mark))
    nx.draw(G,
            pos=nx.circular_layout(G),  # 排布方式
            labels=mark,     # 标记(字典格式)
            node_color='y',  # 结点颜色
            node_shape='s',  # 结点形状
            edge_color='b')  # 边的颜色
    4.2使用函数nx.draw_networkx_edge_labels()为边添加标记

    参数解读:

  • G:所创建的图
  • pos:布局方式。具体同上
  • edge_labels:边的标记(以列表的形式)
  • 一般用途:用于标出边的权重

    在此之前,要先利用函数nx.get_edge_attributes() 获取边的权重

    例子:

    weight=nx.get_edge_attributes(G,"weight")  # 获取每条边的权重
    nx.draw_networkx_edge_labels(G,pos=nx.shell_layout(G),edge_labels=weight)  # 标出边的权重
     4.3使用函数nx.draw_networkx_edges()标出指定的边

    参数解读:

  • G:所创建的图
  • pos:布局方式。具体同上
  • edgelist:以列表形式给出指定的边
  • edge_color:边的颜色
  • 例子:

     nx.draw_networkx_edges(G,
                               pos=nx.shell_layout(G),
                               edgelist=path_edges,
                               edge_color='r')

    5.输出邻接矩阵

    W=nx.to_numpy_array(G) 

    作者:whY的笔记

    物联沃分享整理
    物联沃-IOTWORD物联网 » Python之networkx绘制网络图

    发表回复