创建一个空图
import networkx as nx
G = nx.Graph()
此时如果报以下错误:
则注意文件名不能是:networkx.py
,修改文件名就好了。
图G的增长可以通过添加节点来实现
G.add_node(100)
G.add_nodes_from([2, 3])
H = nx.path_graph(10)
G.add_nodes_from(H)
G 现在包含 H 的节点作为 G 的节点(节点编号从0开始,到9结束)。
相比之下,您可以将图形 H用作G中的节点。
G.add_node(H)
图G现在包含H作为一个节点。图G现在包含H作为一个节点。 这种灵活性非常强大,因为它允许图形图形、文件图形、函数图形等等。
简单示例:
也可以通过添加边来实现
G.add_edge(1, 2)
e = (2, 3)
G.add_edge(*e) # unpack edge tuple*
简单示例:
G.add_edges_from([(1, 2), (1, 3)])
简单示例:注意看对比
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.clear()会清除所有节点和边
G.number_of_nodes():图G中结点的数量
G.number_of_edges():图G中边的数量
G.nodes():图G中的节点的情况
G.edges():图G中边的情况
G.adj():某一结点的邻接节点情况
G.degree():节点的度
G.edges()、G.degree()可以添加参数,具体的示例如下:
print(G.edges([1, 'm']))
print(G.degree([1, 'm']))
可以以与添加类似的方式从图中删除节点和边。
使用方法:Graph.remove_node(),Graph.remove_nodes_from(),Graph.remove_edge()和Graph.remove_edges_from(),例如:
G.remove_node(2)
G.remove_nodes_from("spam")
list(G.nodes)
G.remove_edge(1, 3)
图形对象不必增量构建 - 数据指定图结构可以直接传递给各种构造函数图类。
通过实例化其中一个图来创建图结构时类,可以指定多种格式的数据。
import networkx as nx
G = nx.Graph()
G.add_edge(1, 2)
H = nx.DiGraph(G) # create a DiGraph using the connections from G
print("edges:",list(H.edges()))
edgelist = [(0, 1), (1, 2), (2, 3)]
H = nx.Graph(edgelist) # create a graph from an edge list
print("edges:",list(H.edges()))
adjacency_dict = {0: (1, 2), 1: (0, 2), 2: (0, 1)}
H = nx.Graph(adjacency_dict) # create a Graph dict mapping nodes to nbrs
print("edges:",list(H.edges()))
除了视图G.edges和G.adj,使用下标符号可以访问边和邻居:
G = nx.Graph([(1, 2, {"color": "yellow"})])
G[1] # same as G.adj[1]
G[1][2]
G.edges[1, 2]
如果边存在,还可以使用下标符号获取/设置边的属性:
G.add_edge(1, 3)
G[1][3]['color'] = "blue"
G.edges[1, 2]['color'] = "red"
G.edges[1, 2]
所有(节点,邻接)对的快速检查是使用G.adjacency()
或 G.adj.items()
。请注意,对于无向图,邻接迭代会看到每条边两次。
G = nx.Graph()
G.add_weighted_edges_from([(1, 2, 0.125), (1, 3, 0.75), (2, 4, 1.2), (3, 4, 0.375)])
for n, nbrs in G.adj.items():
for nbr, eattr in nbrs.items():
wt = eattr['weight']
if wt < 0.5: print(f"({n}, {nbr}, {wt:.3})")
使用 edge 属性可以方便地访问所有边:
G = nx.Graph()
G.add_weighted_edges_from([(1, 2, 0.125), (1, 3, 0.75), (2, 4, 1.2), (3, 4, 0.375)])
for n, nbrs in G.adj.items():
for nbr, eattr in nbrs.items():
wt = eattr['weight']
# if wt < 0.5: print(f"({n}, {nbr}, {wt:.3})")
for (u, v, wt) in G.edges.data('weight'):
if wt < 0.5:
print(f"({u}, {v}, {wt:.3})")
诸如权重、标签、颜色或任何您喜欢的 Python 对象之类的属性,可以附加到图、节点或边。
每个图、节点和边都可以在关联的属性字典(键必须是可散列的)。 默认情况下,这些是空的,但是可以使用 add_edge、add_node 或直接添加或更改属性操作名为“G.graph”、“G.nodes”和图形“G”的“G.edges”。
G = nx.Graph(day="Friday")
G.graph
修改属性:
G.graph['day'] = "Monday"
G.graph
G.add_node(1, time='5pm')
G.add_nodes_from([3], time='2pm')
G.nodes[1]
G.nodes[1]['room'] = 714
G.nodes.data()
注意:请注意,将节点添加到 G.nodes 不会将其添加到图形中,请使用G.add_node() 添加新节点。 缘也是如此。
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.edges[3, 4]['weight'] = 4.2
特殊属性 weight 应该是数字,因为它被使用需要加权边的算法。
DiGraph 类提供特定的附加方法和属性到有向边,例如:DiGraph.out_edges、DiGraph.in_degree、DiGraph.predecessors、DiGraph.successors 等。
为了让算法能够轻松地处理这两个类,有向版本的neighbors 等价于successors, degree 等价于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')
DG.degree(1, weight='weight')
print(list(DG.successors(3)))
print(list(DG.neighbors(1)))
G = nx.petersen_graph()
subax1 = plt.subplot(121)
nx.draw(G, with_labels=True, font_weight='bold')
subax2 = plt.subplot(122)
nx.draw_shell(G, nlist=[range(5, 10), range(5)], with_labels=True, font_weight='normal')
plt.show()