文章目录
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所有节点)、节点或节点的可迭代容器,其本身不是图中的节点。
从图中删除元素
可以以与添加类似的方式从图中删除节点和边。使用方法 Graph.remove_node(), 和 Graph.remove_nodes_from(), 例如Graph.remove_edge()Graph.remove_edges_from()
使用图构造函数
图形对象不必以增量方式构建 - 指定图形结构的数据可以直接传递给各种图形类的构造函数。通过实例化其中一个图形类来创建图形结构时,您可以指定多种格式的数据。
访问边和邻居
除了视图Graph.edges和之外Graph.adj,还可以使用下标表示法访问边和邻居。
如果边缘已经存在,您可以使用下标表示法获取/设置边缘的属性。
G.adjacency()使用或可以快速检查所有(节点、邻接)对 G.adj.items()。请注意,对于无向图,邻接迭代会看到每条边两次。
使用edges 属性可以方便地访问所有边缘。
向图、节点和边添加属性
诸如权重、标签、颜色或任何您喜欢的 Python 对象之类的属性都可以附加到图形、节点或边上。
每个图、节点和边都可以在关联的属性字典中保存键/值属性对(键必须是可散列的)。默认情况下,这些是空的,但可以使用add_edge或直接操作名为、和 的add_node属性字典来添加或更改属性。G.graphG.nodesG.edgesG
图属性
创建新图形时分配图形属性
或者您可以稍后修改属性
节点属性
add_node()使用、add_nodes_from()或添加节点属性G.nodes
请注意,添加节点G.nodes不会将其添加到图形中,用于 G.add_node()添加新节点。对于边缘也是如此。
边缘属性
add_edge()使用、add_edges_from()或下标符号添加/更改边缘属性。
PS:特殊属性weight应该是数字的,因为它被需要加权边缘的算法使用。
有向图
该类DiGraph提供了特定于有向边的附加方法和属性,例如 , , DiGraph.out_edges等。为了使算法能够轻松地使用这两个类,有向版本 相当于 while报告总和,即使有时可能感觉不一致.DiGraph.in_degreeDiGraph.predecessorsDiGraph.successorsneighborssuccessorsdegreein_degreeout_degree
一些算法仅适用于有向图,而另一些算法对有向图没有很好的定义。事实上,将有向图和无向图混为一谈的趋势是危险的。如果您想将有向图视为无向的某些测量,您可能应该使用Graph.to_undirected()或使用转换它
多重图
NetworkX 提供了允许任意一对节点之间存在多条边的图类。和MultiGraph类 MultiDiGraph 允许您添加相同的边缘两次,可能使用不同的边缘数据。这对于某些应用程序来说可能很强大,但许多算法在此类图上没有很好地定义。如果结果定义明确,例如,MultiGraph.degree()我们提供函数。否则,您应该以使测量明确定义的方式转换为标准图表。
分析图表
结构G可以使用各种图论函数进行分析,例如:
一些具有大输出的函数迭代 (node, value) 2 元组。dict如果您愿意,这些很容易存储在结构中。
绘制图形
NetworkX 主要不是一个图形绘图包,而是包含使用 Matplotlib 的基本绘图以及使用开源 Graphviz 软件包的接口。这些是networkx.drawing 模块的一部分,如果可能,将被导入。
首先导入 Matplotlib 的绘图界面(pylab 也可以)
使用以下之一测试导入nx_pylab是否成功绘制G
绘制到交互式显示器时。请注意,您可能需要发布一个 Matplotlib