Python中的Networkx能够方便地创建社会网络,语义网络等网络结构,并进行各种分析,记录下学习的过程,方便自己的记忆。
1. 安装
在windows中安装的python3.9以及pycharm2020社区版,配置python环境变量
安装networkx,直接pip install nexworkx即可,调试版本为networkx2.6.2, 在pycharm中创建python项目,Venv中再次导入一下networkx。
2. 无向图
例1:创建无向图nx.Graph() 无向图中两点间最多只有一条边。
import networkx as nx
import matplotlib.pyplot as plt
#无向图
G = nx.Graph()
G.add_node(1) #添加一个节点
G.add_edge(2,3) #添加一个边,隐含的添加两个节点2,3
G.add_edge(3,2) #无向图中,23和32是同一条边
print('nodes:',G.nodes()) #输出全部的节点
print('edges:', G.edges()) #输出全部的边
print('number of edges:',G.number_of_edges()) #输出边的数量
nx.draw(G)
plt.savefig("wuxiangtu.png")
plt.show()
创建的点的位置是随机的,结果如下:
例2:
import networkx as nx
import matplotlib.pyplot as plt
G = nx.Graph()
G.add_node(1)
G.add_node(2) # 加点
G.add_nodes_from([3, 4, 5, 6]) # 加点集合
G.add_edge(1, 3)
nx.add_cycle(G, [1,2,3,4]) #加环,使用nx的add_cycle()方法,创建4条边
G.add_edges_from([(3, 5), (3, 6), (6, 7)]) # 加边集合
nx.draw(G)
plt.savefig("youxiangtu.png")
plt.show()
3. 有向图
nx.DiGraph()创建有向图
例1:
import networkx as nx
import matplotlib.pyplot as plt
G = nx.DiGraph()
G.add_node(1)
G.add_node(2)
G.add_nodes_from([3, 4, 5, 6])
nx.add_cycle(G,[1, 2, 3, 4]) #创建环
G.add_edge(1, 3)
G.add_edges_from([(3, 5), (3, 6), (6, 7)])
# G = G.to_undirected() #测试有向图转换为无向图
# G = G.to_directed() #测试无向图转换为有向图
nx.draw(G, with_labels=True) #为了显示节点的标签名称,使用with_labels=True
plt.savefig("youxiangtu.png")
plt.show()
有向图和无向图可以互相转换
- Graph.to_undirected()
- Graph.to_directed()
在无向图转换为有向图时,所有边将变成双向边
例2:
import networkx as nx
import matplotlib.pyplot as plt
G = nx.DiGraph()
#road_nodes = {'a': 1, 'b': 2, 'c': 3}
road_nodes = {'a':{1:1}, 'b':{2:2}, 'c':{3:3}}
road_edges = [('a', 'b'), ('b', 'c')]
G.add_nodes_from(road_nodes.items())
G.add_edges_from(road_edges)
nx.draw(G, with_labels=True)
plt.savefig("youxiangtu.png")
plt.show()
4. 加权图
有向图和无向图都可以给边赋予权重,用到的方法是add_weighted_edges_from,它接受1个或多个三元组[u,v,w]作为参数,其中u是起点,v是终点,w是权重。
import networkx as nx
import matplotlib.pyplot as plt
G = nx.Graph() # 建立一个空的无向图G
G.add_edge(2, 3) # 添加一条边2-3(隐含着添加了两个节点2、3)
G.add_weighted_edges_from([(3, 4, 3.5), (3, 5, 7.0)]) # 对于无向图,边3-2与边2-3被认为是一条边
print("weight from 2 to 3", G.get_edge_data(2, 3))
print("weight from 3 to 4", G.get_edge_data(3, 4))
print("weight from 3 to 5", G.get_edge_data(3, 5))
nx.draw(G, with_labels=True)
plt.savefig("wuxiangtu.png")
plt.show()
结果:
weight from 2 to 3 {}
weight from 3 to 4 {'weight': 3.5}
weight from 3 to 5 {'weight': 7.0}