简介
去年和师兄一起做社交网络分析的时候发现了networkx这个python工具包。这个工具包对于图数据的分析非常的方便,不需要自己再去定义一些数据结构,里面也集成了很多的算法,如bfs和dfs等。
使用的环境主要是Anaconda3集成的。
基本的图创建
在学习的过程中和大多数Python的工具包一样,代码实例和使用手册一起食用会更香哦。
networkx官网地址:https://networkx.org/
图的生成
在数据结构中,图是一种多对多逻辑的数据结构。以往说的图大多是不含自环和重边的图,按方向主要区分为有向图和无向图。但现实中的图数据是更为复杂的数据,例如知识图谱就是一个有向重边图。
networkx对此也非常人性化的对此以区分。下面是四种图的构造:
import networkx as nx #载入networkx包
import matplotlib.pyplot as plt #用于画图
G1 = nx.Graph() #无向图
G2 = nx.DiGraph() #有向图
G3 = nx.MultiGraph() #重边图
G4 = nx.MultiDiGraph() #有向重边图
我们生成了四种不同的图,它们现在没有边,没有节点。
print(G1.number_of_nodes(), G1.number_of_nodes())
输出结果
0 0
添加节点和边
主要使用以下函数进行添加
# 添加一个节点,可以添加任意数据类型
G1.add_node(1)
# 添加一些节点,传入一个列表
G1.add_nodes_from([2,3])
# 添加一条边,若边中的节点不在图中将会自动添加节点
# 如节点3已在图中,但节点4不在图中,节点4会被自动添加
G1.add_edge(3,4)
# 同理,添加一些边
G1.add_edges_from([(1,3),(3,5)])
将上述代码的add改为remove就能把添加改为删除,
# G1.remove_node(1)
# G1.remove_nodes_from([2,3])
# G1.remove_edge(3,4)
# G1.remove_edges_from([(1,3),(3,5)])
我们可以用以下方式查看一下graph生成的结果
# 查看节点
print(G1.nodes())
out:
[1, 2, 3, 4, 5]
# 查看边
print(G1.edges())
out:
[(1, 3), (3, 4), (3, 5)]
# 指定节点查看
print(G1[1])
print(G1[2])
out:
{3: {}}
{}
可以看到1和3有连边,2没有任何的连边
# 指定边查看
print(G1[1][3])
print(G1.has_edge(1,2))
print(G1.has_node(2))
out:
{}
False
True
这里1和2并没有边,直接索引会报错
索引1和3的边输出空字典,这是因为边没有任何属性
使用has_edge函数检测边是否存在
使用has_node函数检测节点是否存在
画图
简单的画图
我们可以看到,仅有一个点没有与其他点连接,根据代码可以推测出,节点2是没有与其他点连接的,并且可以看到节点3与其他点都进行了连接。
nx.draw(G1)
稍微复杂点的画图
# 为每个节点打上标签
labels={}
for node in G1.nodes():
labels[node]=str(node)
# 生成节点位置信息
pos=nx.kamada_kawai_layout(G1)
# 设置画布大小
plt.rcParams['figure.figsize']= (6, 4)
# 画节点
nx.draw_networkx_nodes(G1,pos)
# 画边
nx.draw_networkx_edges(G1,pos)
# 画标签
nx.draw_networkx_labels(G1,pos,labels)
# 画坐标轴的选项
# plt.axis('on')
# 去掉坐标刻度
# plt.xticks([])
# plt.yticks([])
# 保存并显示图片
plt.savefig("temp.png")
plt.show()
我们将同样的代码使用在G2上会得到下图,重边图稍微有点复杂,之后会结合知识图谱的数据来结合使用。
完整代码资源
参考
networkx官网地址:https://networkx.org/