图机器学习NetworkX包工具使用
1 安装
pip install networkx
2 创建图
import networkx as nx
G=nx.Graph() #无向图
#G=nx.DiGraph() #有向图
#G=nx.MultiGraph() #多边无向图
#G=nx.MultiDiGraph() #多边有向图
3 点node
可以每次添加一个节点:
G.add_node(1)
或者从可迭代容器(iterable)(如列表)中添加多个节点
G.add_nodes_from([2, 3])
也可以同时添加包含节点属性的节点,如果容器以(node, node_attribute_dict)
2元组的形式
G.add_nodes_from([
(4, {"color": "red"}),
(5, {"color": "green"}),
])
一个图中的节点可以合并到另一个图
H = nx.path_graph(10)
G.add_nodes_from(H)
现在图G
中节点包括原H
中的节点。相反,也可以将整个图H
作为图G
中的一个节点
G.add_node(H)
4 边edge
图也可以以添加一条边的形式增长
G.add_edge(1, 2)
e = (2, 3)
G.add_edge(*e) # unpack edge tuple*
通过接入边的列表增长
G.add_edges_from([(1, 2), (1, 3)])
或者通过添加任何边的ebunch。
ebunch是边的元组的任何可迭代容器。边的元组可以是 2 元组节点,也可以是 3 元组:在 2 个节点后跟边的属性字典,如 (2, 3,{'weight':3.1415})
。
G.add_edges_from(H.edges)
添加现有节点或边时没有冲突。 例如,在删除所有节点和边之后,
G.clear()
添加新的节点/边时,NetworkX 悄悄地忽略任何已经存在的。
G.add_edges_from([(1, 2), (1, 3)])
G.add_node(1)
G.add_edge(1, 2)
G.add_node("spam") # adds node "spam"
G.add_nodes_from("spam") # adds 4 nodes: 's', 'p', 'a', 'm'
G.add_edge(3, 'm')
此时,图G
包含 8 个节点和 3 条边
>>> G.number_of_nodes()
8
>>> G.number_of_edges()
3
5 检查图的元素
四个基本图形属性:G.nodes
、G.edges
、G.adj
和 G.degree
>>> list(G.nodes)
[1, 2, 3, 'spam', 's', 'p', 'a', 'm']
>>> list(G.edges)
[(1, 2), (1, 3), (3, 'm')]
>>> list(G.adj[1]) # or list(G.neighbors(1))
[2, 3]
>>> G.degree[1] # the number of edges incident to 1
2
6 从图中删除元素
>>> G.remove_node(2)
>>> G.remove_nodes_from("spam")
>>> list(G.nodes)
[1, 3, 'spam']
>>> G.remove_edge(1, 3)
绘制图
首先导入 Matplotlib 的绘图接口(pylab 也可以)
import matplotlib.pyplot as plt
要测试 nx_pylab
是否成功导入,请使用以下方法之一绘制图G
G = nx.petersen_graph()
subax1 = plt.subplot(121)
nx.draw(G, with_labels=True, font_weight='bold')
subax2 = plt.subplot(122)
nx.draw_shell(G, nlist=[range(5, 10), range(5)], with_labels=True, font_weight='bold')
交互式操作时上述图像会自动展示。 注意如果没有在交互模式下使用 matplotlib,可能需要下面命令展示图形
plt.show()
options = {
'node_color': 'black',
'node_size': 100,
'width': 3,
}
subax1 = plt.subplot(221)
nx.draw_random(G, **options)
subax2 = plt.subplot(222)
nx.draw_circular(G, **options)
subax3 = plt.subplot(223)
nx.draw_spectral(G, **options)
subax4 = plt.subplot(224)
nx.draw_shell(G, nlist=[range(5,10), range(5)], **options)