官网链接
创建一个图
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')