目录
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.绘图
使用函数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') # 边的颜色
5.输出邻接矩阵
W=nx.to_numpy_array(G)