备战数模,还是知道多点好。networkx这个库的话,画网络图贼好用。
一、安装
安装的话,跟其他包的安装差不多吧。我用的是anaconda就不用装了。其他的话,就用pip install networkx吧,最好的话,需要装下malplotlib这个库。
二、建立图
import networkx as nx
G=nx.Graph()#创建空的简单图
G=nx.DiGraph()#创建空的简单有向图
G=nx.MultiGraph()#创建空的多图
G=nx.MultiDiGraph()#创建空的有向多图
加点、加边
G.add_node(1)#加1这个点
G.add_node(1,1)#用(1,1)这个坐标加点
G.add_nodes_from([2,3])#加列表中的点
G.add_edge(1,2)#加边,起点是1终点是2
G.add_weight_edge(1,2,3.0)#第三个是权值
G.add_edges_from(list)#添加列表中的边
G.add_weight_edges_from(list)
删除点和边的话
G.remove_node()
G.remove_nodes_from()
G.remove_edge()
G.remove_edges_from()
G.clear()
遍历点和边的话
G.add_nodes_from([1,2,3])
for n in G.nodes():
print(n)
G.add_edges_from([(1,2),(1,3)])
for e in G.edges():
print(e)
print(G.degree())
输出:
1
2
3
(1, 2)
(1, 3)
[(1, 2), (2, 1), (3, 1)]#1这个点有两条边连着,2、3只有一条边连着
一些特殊的图的生成:
k_5=nx.complete_graph(5)#完全图
k_3_3=nx.complete_bipartite_graph(3,3)#完全二分图
三、画网络图from matplotlib import pyplot as plt
import networkx as nx
G=nx.Graph()
G.add_nodes_from([1,2,3])
G.add_edges_from([(1,2),(1,3)])
nx.draw_networkx(G)
plt.show()
输出:
这个应该是最简单的用法了。复杂的图的,还有各种参数的使用只能去networkx的GitHub上看了
四、最短路径的运用
1、无权无向图最短路径
from matplotlib import pyplot as plt
import networkx as nx
G=nx.path_graph(5)
path=nx.single_source_shortest_path(G,2)
length=nx.single_source_shortest_path_length(G,2)
print(path)
print(length)
nx.draw_networkx(G)
plt.show()
输出:
{2: [2], 1: [2, 1], 3: [2, 3], 0: [2, 1, 0], 4: [2, 3, 4]}
{2: 0, 1: 1, 3: 1, 0: 2, 4: 2}
2、有权无向图
以我上个博客为例子吧。
from matplotlib import pyplot as plt
import networkx as nx
nodes=[0,1,2,3,4]
edges=[(0,1,10),(0,3,30),(0,4,100),(1,2,50),(2,3,20),(2,4,10),(3,4,60)]
G=nx.Graph()
G.add_nodes_from(nodes)
G.add_weighted_edges_from(edges)
path=nx.single_source_dijkstra_path(G,4)
length=nx.single_source_dijkstra_path_length(G,4)
print(path)
print(length)
nx.draw_networkx(G)
plt.show()
输出:
{4: [4], 0: [4, 2, 3, 0], 2: [4, 2], 3: [4, 2, 3], 1: [4, 2, 1]}
{4: 0, 2: 10, 3: 30, 1: 60, 0: 60}
可以好好跟我的上个博客对比一下。
五、参考
https://networkx.github.io/documentation/networkx-1.9