Python NetworkX – Python图形库

时间:2020-02-23 14:42:20  来源:igfitidea点击:

Python NetworkX模块允许我们创建,操纵和研究复杂网络的结构,功能和动态。

1. Python NetworkX

  • NetworkX适用于现实世界中的图形问题,也擅长处理大数据。

  • 由于该库纯粹是用python制作的,因此这一事实使它同时具有高度的可伸缩性,可移植性和合理的效率。

  • 它是开源的,并根据3条款BSD许可发布。

2.为什么选择NetworkX?

NetworkX为您提供了很多使用它的理由。
以下是NetworkX使其与之配套的一些功能:

  • NetworkX具有众多标准图形算法
  • 它支持图,有向图和多图的数据结构
  • 它提供了各种网络结构和分析措施
  • 使用软件包中提供的生成器,制作经典/随机图和合成网络要容易得多
  • 网络或者图中的节点绝对可以是任何东西,可以是图像,XML数据或者其他任何东西
  • 边缘还可以保存任意数据,例如时间戳和权重
  • 它已经过良好的测试,大约90%的代码覆盖率

除此之外,它还具有其他优势,因为它基于纯Python,因此,它具有快速原型语法并且非常易于学习。
让我们开始吧!

3. NetworkX入门

NetworkX需要在计算机上安装Python> = 2.7。
首先,让我们完成安装。

3.1)安装NetworkX模块

我们可以使用Python Package Index(pip)安装NetworkX:

pip install networkx

如果在使用pip安装软件包时遇到任何问题,请使用git命令从GitHub安装它:

pip install git://github.com/networkx/networkx.git

3.2)使用NetworkX

现在我们已经在计算机上安装了NetworkX,我们可以使用以下import语句在任何脚本中使用它:

import networkx

3.3)创建图

由于NetworkX库用于使用Graph结构管理关系,因此我们可以从创建没有节点和边的图开始:

import networkx
graph = networkx.Graph()

由于没有节点或者边,因此我们看不到图形,因此让我们使用闲置来检查是否已创建图形:

3.4)将节点添加到图形

添加和检查节点非常简单,可以通过以下方式完成:

graph.add_node(1)

或者将列表用作:

graph.add_nodes_from([2,3])

并查看现有图中的节点:

graph.nodes()

运行这些命令集时,我们将看到以下输出:到目前为止,系统中确实存在一个图,但图的节点尚未连接。
这可以通过在两个图节点之间建立路径的图边缘来完成。

3.5)在节点之间添加边

添加和检查边缘也非常简单,可以通过以下方式完成:

graph.add_edge(1,2)

或者将列表用作:

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

为了查看现有图形中的节点,我们可以再次打印图形对象的边缘:

graph.edges()

运行这些命令集时,将看到以下输出:

4.属性

图形是数据结构,用于连接相关数据并通过权重显示它们之间的关系。
该权重可以称为图中两个节点的关系的属性。
同样,要显示节点或者边线或者图形本身的属性,我们也可以使用属性。

4.1)图形属性

通过将图形属性添加到Graph对象,我们可以将元数据分配给Graph。
让我们看一下如何做到这一点的代码片段:

graph.graph["day"]="Monday"
graph.graph

4.2)节点属性

其中我们将属性添加到Graph对象的节点:

graph.add_node(1, time='5pm')
graph.add_nodes_from([3], time='2pm')
graph.node[1]
graph.node[1]['room'] = 714
graph.nodes(data=True)

4.3)边缘属性

最后,我们将一些属性分配给Graph对象的边缘。
分配边缘属性:

graph.add_edge(1, 2, weight=4.7 )
graph.add_edges_from([(3,4),(4,5)], color='red')
graph.add_edges_from([(1,2,{'color':'blue'}), (2,3,{'weight':8})])
graph[1][2]['weight'] = 4.7
graph.edge[1][2]['weight'] = 4

将属性添加到图,节点和边后,我们最终可以打印所有数据:

5.有向图

在上一节中,我们看到可以将属性分配给Graph的边缘。
我们可以创建一个有向图并添加加权边,如下所示。

DG=networkx.DiGraph()
DG.add_weighted_edges_from([(1,2,0.5), (3,1,0.75)])
DG.out_degree(1,weight='weight')
DG.degree(1,weight='weight')
DG.successors(1)
DG.neighbors(1)

一旦运行了这些命令,我们将能够看到我们刚刚制作的图的邻居和后继者:

6.绘图图

到目前为止,我们一直在对图形执行各种操作,但无法可视化任何操作。
现在,让我们尝试形象化它们。
为此,我们需要matplotlib库的帮助:

import matplotlib.pyplot as plt
networkx.draw(graph)
networkx.draw_random(graph)
networkx.draw_circular(graph)
networkx.draw_spectral(graph)
plt.show()