networkx官方文档解读之图的创建Creating a graph


官网链接

创建一个图

import networkx as nx
G = nx.Graph()

根据定义,Graph是节点(顶点)以及已标识的节点对(称为边,链接等)的集合。 在NetworkX中,节点可以是任何可哈希对象,例如 文本字符串,图像,XML对象等(注意:python的None对象不应用作节点,因为它确定是否已在许多函数中分配了可选函数参数)

节点

图G可以用几种方式进行生成。 NetworkX包括许多图形生成器功能和设施,可以以多种格式读取和写入图形。 首先,我们将介绍一些简单的操作。 你可以一次添加一个节点

G.add_nodes_from([2, 3])

或添加任何nbunch节点。 nbunch是节点的任何可迭代容器,它们本身并不是图中的节点。 (例如列表,集合,图形,文件等。)

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

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

G.add_node(H)

图G现在包含H作为节点。 这种灵活性非常强大,因为它允许图的图形,文件的图形,功能的图形等等。 值得考虑如何构造应用程序,使节点成为有用的实体。 当然,您始终可以在G中使用唯一标识符,并且可以根据需要使用由标识符键入节点信息的单独字典。 (注意:如果哈希取决于其内容,则不应更改节点对象。)

也可以通过一次添加一条边来生成G,

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

通过添加边列表

G.add_edges_from(H.edges())

可以用这些函数的方式删除图形。 使用Graph.remove_node(), Graph.remove_nodes_from(), Graph.remove_edge() and Graph.remove_edges_from(),
e.g

G.remove_node(H)

例如,删除所有节点和边,

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") # add 4 nodes: 's', 'p', 'a', 'm'

在这个阶段,图G由8个节点和2个边组成,可以通过以下方式看到:

G.number_of_nodes()
#输出为8
G.number_of_edges()
# 输出为2

我们可以用

G.remove_nodes_from("spam")
G.nodes()
#输出为[1,2,3,'spam']
G.remove_edge(1, 3)

创建图结构时(通过实例化图类之一,可以指定几种格式的数据。

H = nx.DiGraph(G)
H.edges()
#输出为[(1, 2), (2, 1)]
edgelist = [(0,1),(1,2), (2,3)]
H = nx.Graph(edgelist)

节点和边的使用

您可能会注意到没有将节点和边指定为NetworkX对象。 这使您可以自由使用有意义的项目作为节点和边。 最常见的选择是数字或字符串,但是节点可以是任何可散列的对象(无除外),并且可以使用G.add_edge(n1,n2,object = x)将边与任何对象x关联。

例如,n1和n2可以是来自RCSB蛋白质数据库的蛋白质对象,x可以引用出版物的XML记录,详细记录了它们之间相互作用的实验观察结果。

我们已经发现这种功能非常有用,但是除非有人熟悉Python,否则它的滥用会导致意外的意外。 如有疑问,请考虑使用convert_node_labels_to_integers()获得带有整数标签的更传统的图形。

除了方法Graph.nodes(),Graph.edges()和Graph.neighbors()之外,迭代器版本(例如Graph.edges_iter())还可以使您避免在创建大型列表时进行迭代。 无论如何。

使用下标符号也可以快速直接访问图形数据结构

注意:不要更改返回的dict,它是图形数据结构的一部分,直接操作可能会使图形处于不一致状态。

G[1] # Warning:do not chage the resulting dict
# {2:{}}
G[1][2]
# {}

如果边缘已经存在,则可以使用下标符号安全地设置边缘的属性。

FG  = nx.Graph()
FG.add_weighted_edges_from([(1,2,0.125), (1,3,0.75), (2,4,1.2), (3,4,0.375)])
for n, nbrs in FG.adjacency_iter():
    for nbr, eattr in nbrs.items():
        data = eattr['weight']
        if data<0.5:
            print('(%d, %d, %.3f)' % (n, nbr, data))
 
#(1,2,0.125)
#(2,1,0.125)
#(3,4,0.375)
#(4,3,0.375)

向图,节点和边添加属性

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

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

图的属性

创建新图形时定义图形属性

G.graph['day'] = 'Monday'
G.graph
# {'day':'Monday'}

节点属性

在使用add_node(), add_nodes_from() or G.node时可以添加节点属性

G.add_node(1, time='5pm')
G.add_nodes_from([3], time='2pm')
G.node[1]
# {'time':'5pm'}
G.node[1]['room'] = 714
G.nodes(data=True)
# [(1, {'room':714, 'time':'5mp'}), (3, {'time':'2pm'})]

请注意,将节点添加到G.node不会将其添加到图中,请使用G.add_node()添加新节点。

边的属性

使用add_edge(),add_edges_from(),下标符号或G.edge添加边缘属性。

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

特殊属性“权重”应为数字,并包含需要权重边缘的算法所使用的值。

有向图

DiGraph类提供了特定于有向边的其他方法,例如 DiGraph.out_edges(),DiGraph.in_degree(),DiGraph.predecessors(),DiGraph.successors()等。为了允许算法轻松地同时使用这两个类,neighbors()和degree()的有向版本等效于successors() 和in_degree()和out_degree()的总和,尽管有时可能会感到不一致

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

一些算法仅适用于有向图,而其他算法则不适用于有向图。 确实,将有向图和无向图集中在一起的趋势很危险。 如果您想将有向图在某些测量中视为无向图,则应该使用Graph.to_undirected()或使用

H = nx.Graph(G)  # convert G to undirected graph转变图为无向图
多图

NetworkX为图提供了类,这些图允许任意一对节点之间有多个边。 MultiGraph和MultiDiGraph类使您可以两次添加相同的边,可能添加不同的边数据。 对于某些应用程序来说,这可能很强大,但是在这些图形上并没有很好地定义许多算法。 最短路径就是一个例子。 明确定义结果的地方 我们提供了MultiGraph.degree()函数。 否则,您应该以一种使测量清晰定义的方式转换为标准图形

MG = nx.MultiGraph()
MG.add_weighted_edges_from([(1,2,.5), (1,2,.75), (2,3,.5)])
MG.degree(weight='weight')
# {1:1.25, 2:1.75, 3:0.5}
GG = nx.Graph()
for n, nbrs in MG.adjacency_iter():
    for nbr, edict in nbrs.items():
        minvalue = min([d['weight'] for d in edict.values()])
        GG.add_edge(n, nbr, weight = minvalue)
nx.shortest_path(GG, 1, 3)
#[1,2,3]

图的生成和图的一些操作

除了按节点或按边构造图形外,还可以通过以下方式生成图形:
1.应用经典图形操作,例如:

subgraph(G, nbunch)       - induce subgraph of G on nodes in nbunch # 在nbunch的节点上诱导G的子图
union(G1, G2)            - graph union #图聚合
disjoint_union(G1, G2)   - graph union assuming all nodes are different #假设所有节点都不同的图并集
cartesian_product(G1, G2) - return Cartesian product graph # -返回笛卡尔积图
compose(G1, G2)           - combine graphs identifying nodes common to both  # -组合识别双方共同节点的图
complement(G)             - graph complement  # 图的补集
create_empty_copy(G)      - return an empty copy of the same graph class  # -返回相同图类的空副本
conver_to_undirected(G)   - return an undirected representation of G  # -返回G的无向表示
conver_to_directed(G)      - return a directed representation of G  # -返回G的有向表示

2.使用一些经典的小图,例如

petersen = nx.petersen_graph()
tutte = nx.tutte_graph()
maze = nx.sedgewick_maze_graph()
tet = nx.tetrahedral_graph()

3.使用生成器生成经典的图

K_5 = nx.complete_graph(5)
K_3_5 = nx.complete_bipartite_graph(3, 5)
barbell = nx.barbell_graph(10, 10)
lollipop = nx.lollipop_graph(10, 20)

4.使用随机图生成器

er = nx.erdos_renyi_graph(100, 0.15)
ws = nx.watts_strogatz_graph(30, 3, 0.1)
ba = nx.barabasi_albert_graph(100, 5)
red = nx.random_lobster(100, 0.9, 0.9)

5.使用常见的图形格式(例如边列表,邻接列表,GML,GraphML,pickle,LEDA等)读取存储在文件中的图形。

nx.write_gml(red, "path.to.file")
mygraph = nx.read_gml("path.to.file")

图的格式细节请看链接
生成图的细节请看

分析图

G的结构可以使用各种图论函数进行分析,例如:

G = nx.Graph()
G.add_edges_from([(1,2), (1,3)])
G.add_node("spam")    # add node "spam"
nx.connected_components(G)
# [[1, 2, 3], ['spam']]
sorted(nx.degree(G).values())
# [0, 1, 1, 2]
nx.clustering(G)
# {1:0.0, 2:0.0, 3:0.0, 'spam':0.0}

返回节点属性的函数返回以节点标签为键的字典。

nx.degree(G)
# {1:2, 2:1, 3:1, 'spam':0}

对于特定节点的值,您可以提供一个节点或一小部分节点作为参数。 如果指定了单个节点,则返回单个值。 如果指定了nbunch,则该函数将返回字典。

nx.degree(G, 1)
# 2
G.degree(1)
# 2
G.degree([1,2])
# {1:2, 2:1}
sorted(G.degree([1,2]).values())
# [1, 2]
sorted(G.degree().values())
# [0,1,1,2]

图算法的具体细节

画图

NetworkX并不是主要的图形绘图程序包,而是包含Matplotlib的基本图形以及使用开源Graphviz软件包的界面。 这些是networkx.drawing包的一部分,如果可能,将被导入。 有关详细信息,请参见图纸。

请注意,NetworkX中的绘图包尚未与Python 3.0及更高版本兼容。

首先导入Matplotlib的绘图界面(pylab也可以)
您可能会发现使用“ ipython -pylab”进行交互式测试代码很有用,它结合了ipython和matplotlib的强大功能,并提供了一种方便的交互模式。

若要测试networkx.drawing的导入是否成功,请使用以下方法之一绘制G

import matplotlib.pyplot as plt
import nxworkx as nx
nx.draw(G)
nx.draw_random(G)
nx.draw_spectral(G)
# 显示图 when drawing to an interactive display.Note that you may need to issue a Matplotlib
plt.show()
# 保存图 To save drawings to a file, use, for example
nx.draw(G)
plt.savefig("path.png")
# writes to the "path.png" in the local directory .if Graphviz and PyGraphviz, or pydot, are available on your system, you can also use
# 写入本地目录中的文件“ path.png”。 如果您的系统上有Graphviz和PyGraphviz或pydot,则也可以使用

nx.draw_graphviz(G)
nx.write_dot(G, 'file.dot')

有关画图的细节请看

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值