文章目录

NetworkX

NetworkX是一个Python包,用于创建、操作和研究复杂网络的结构、动态和功能。

创建图表

import networkx as nx
G = nx.Graph()

根据定义,aGraph是节点(顶点)的集合以及已识别的节点对(称为边、链接等)。在 NetworkX 中,节点可以是任何可散列的对象,例如,文本字符串、图像、XML 对象、另一个 Graph、自定义节点对象等。

Node

该图G可以通过多种方式增长。NetworkX 包含许多 图形生成器函数和 工具,可以读取和写入多种格式的图形。首先,我们将看看简单的操作。您可以一次添加一个节点,

G.add_node(1)

或从任何可迭代容器中添加节点,例如列表

G.add_nodes_from([2, 3])

如果您的容器产生以下形式的 2 元组,您还可以添加节点以及节点属性 :(node, node_attribute_dict)

G.add_nodes_from([
(4, {"color": "red"}),
(5, {"color": "green"}),
])

节点属性将在下面进一步讨论。
一个图中的节点可以合并到另一个图中:

H = nx.path_graph(10)
G.add_nodes_from(H)

G现在包含 的节点H作为 的节点G。相反,您可以将图形H用作 中的节点G。

G.add_node(H)

该图G现在包含H一个节点。这种灵活性非常强大,因为它允许图形图形、文件图形、函数图形等等。值得考虑如何构建您的应用程序,使节点成为有用的实体。当然,G 如果您愿意,您始终可以使用唯一标识符,并拥有一个单独的字典,该字典由节点信息的标识符键控。

Edge

G也可以通过一次添加一条边来增长,

G.add_edge(1, 2)
e = (2, 3)
G.add_edge(*e) # unpack edge tuple*

通过添加边列表,

G.add_edges_from([(1, 2), (1, 3)])

或通过添加任何边缘。ebunch是边缘元组的任何可迭代容器。边元组可以是节点的 2 元组或 2 个节点后跟边属性字典的 3 元组,例如 . 边缘属性将在 下面进一步讨论。(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

检查图的元素

我们可以检查节点和边。四个基本图形属性便于报告:G.nodes、G.edges和。这些是图中节点、边、邻居(邻接)和节点度数的集合视图。它们为图形结构提供了一个不断更新的只读视图。它们也类似于 dict,因为您可以通过视图查找节点和边缘数据属性,并使用方法迭代数据属性,. 如果你想要一个特定的容器类型而不是一个视图,你可以指定一个。这里我们使用列表,尽管集合、字典、元组和其他容器在其他情况下可能会更好。G.adjG.degree.items().data()

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

可以指定使用nbunch报告来自所有节点子集的边缘和度数。nbunch是以下任何一种:(表示None所有节点)、节点或节点的可迭代容器,其本身不是图中的节点。
NextworkX教程_有向图

从图中删除元素

可以以与添加类似的方式从图中删除节点和边。使用方法 Graph.remove_node(), 和 Graph.remove_nodes_from(), 例如Graph.remove_edge()Graph.remove_edges_from()
NextworkX教程_迭代_02

使用图构造函数

图形对象不必以增量方式构建 - 指定图形结构的数据可以直接传递给各种图形类的构造函数。通过实例化其中一个图形类来创建图形结构时,您可以指定多种格式的数据。

NextworkX教程_迭代_03

访问边和邻居

除了视图Graph.edges和之外Graph.adj,还可以使用下标表示法访问边和邻居。
NextworkX教程_迭代_04
如果边缘已经存在,您可以使用下标表示法获取/设置边缘的属性。
NextworkX教程_元组_05
G.adjacency()使用或可以快速检查所有(节点、邻接)对 G.adj.items()。请注意,对于无向图,邻接迭代会看到每条边两次。
NextworkX教程_python_06
使用edges 属性可以方便地访问所有边缘。
NextworkX教程_python_07

向图、节点和边添加属性

诸如权重、标签、颜色或任何您喜欢的 Python 对象之类的属性都可以附加到图形、节点或边上。

每个图、节点和边都可以在关联的属性字典中保存键/值属性对(键必须是可散列的)。默认情况下,这些是空的,但可以使用add_edge或直接操作名为、和 的add_node属性字典来添加或更改属性。G.graphG.nodesG.edgesG

图属性

创建新图形时分配图形属性
NextworkX教程_python_08
或者您可以稍后修改属性
NextworkX教程_迭代_09

节点属性

add_node()使用、add_nodes_from()或添加节点属性G.nodes

NextworkX教程_迭代_10
请注意,添加节点G.nodes不会将其添加到图形中,用于 G.add_node()添加新节点。对于边缘也是如此。

边缘属性

add_edge()使用、add_edges_from()或下标符号添加/更改边缘属性。
NextworkX教程_python_11
PS:特殊属性weight应该是数字的,因为它被需要加权边缘的算法使用。

有向图

该类DiGraph提供了特定于有向边的附加方法和属性,例如 , , DiGraph.out_edges等。为了使算法能够轻松地使用这两个类,有向版本 相当于 while报告总和,即使有时可能感觉不一致.DiGraph.in_degreeDiGraph.predecessorsDiGraph.successorsneighborssuccessorsdegreein_degreeout_degree

NextworkX教程_迭代_12
一些算法仅适用于有向图,而另一些算法对有向图没有很好的定义。事实上,将有向图和无向图混为一谈的趋势是危险的。如果您想将有向图视为无向的某些测量,您可能应该使用Graph.to_undirected()或使用转换它
NextworkX教程_元组_13

多重图

NetworkX 提供了允许任意一对节点之间存在多条边的图类。和MultiGraph类 MultiDiGraph 允许您添加相同的边缘两次,可能使用不同的边缘数据。这对于某些应用程序来说可能很强大,但许多算法在此类图上没有很好地定义。如果结果定义明确,例如,MultiGraph.degree()我们提供函数。否则,您应该以使测量明确定义的方式转换为标准图表。
NextworkX教程_python_14

分析图表

结构G可以使用各种图论函数进行分析,例如:
NextworkX教程_元组_15
一些具有大输出的函数迭代 (node, value) 2 元组。dict如果您愿意,这些很容易存储在结构中。

NextworkX教程_元组_16

绘制图形

NetworkX 主要不是一个图形绘图包,而是包含使用 Matplotlib 的基本绘图以及使用开源 Graphviz 软件包的接口。这些是networkx.drawing 模块的一部分,如果可能,将被导入。

首先导入 Matplotlib 的绘图界面(pylab 也可以)

NextworkX教程_迭代_17
使用以下之一测试导入nx_pylab是否成功绘制G
NextworkX教程_有向图_18
NextworkX教程_迭代_19
绘制到交互式显示器时。请注意,您可能需要发布一个 Matplotlib
NextworkX教程_python_20