从属性中选择具有networkx图的节点和边

jez*_*zzy 5 python graph matplotlib networkx

我刚开始在networkx中做图表,我想及时跟踪图形的演变:它是如何变化的,图形中指定时间t的节点/边缘是什么.

这是我的代码:

import networkx as nx
import matplotlib.pyplot as plt
G=nx.Graph()
G.add_node(1,id=1000,since='December 2008')
G.add_node(2,id=2000,since='December 2008')
G.add_node(3,id=3000,since='January 2010')
G.add_node(4,id=2000,since='December 2016')
G.add_edge(1,2,since='December 2008')
G.add_edge(1,3,since='February 2010')
G.add_edge(2,3,since='March 2014')
G.add_edge(2,4,since='April 2017')
nx.draw_spectral(G,with_labels=True,node_size=3000)
plt.show()
Run Code Online (Sandbox Code Playgroud)

这显示了包含所有节点和边的图.

所以,我的问题是:

如何设计一个基于时间的过滤器,它将在时间t仅提取我的图G图上的相关节点/边,例如'2014年7月'.完成后,如何使用matplotlib更新图形?

预先感谢您的帮助

Ser*_*ity 7

您可以通过条件选择节点,并使用G.nodes()方法:

selected_nodes = [n for n,v in G.nodes(data=True) if v['since'] == 'December 2008']  
print (selected_nodes)
Run Code Online (Sandbox Code Playgroud)

日期: [1, 2]

要选择边缘使用G.edges_iterG.edges方法:

selected_edges = [(u,v) for u,v,e in G.edges(data=True) if e['since'] == 'December 2008']
print (selected_edges)
Run Code Online (Sandbox Code Playgroud)

日期: [(1, 2)]

要绘制所选节点的调用 G.subgraph()

H = G.subgraph(selected_nodes)
nx.draw(H,with_labels=True,node_size=3000)
Run Code Online (Sandbox Code Playgroud)

要使用属性绘制选定边,您可以构造新图:

H = nx.Graph(((u, v, e) for u,v,e in G.edges_iter(data=True) if e['since'] == 'December 2008'))
nx.draw(H,with_labels=True,node_size=3000)
plt.show()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述