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

10

我刚开始使用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()

这显示了所有节点和边的图。
那么,我的问题是:
如何设计一个基于时间的过滤器,在时间t(例如“2014年7月”)仅提取图G中相关的节点/边。完成后,我如何使用matplotlib更新图形?
非常感谢您的帮助。
1个回答

19
你可以使用列表推导式和 G.nodes() 方法按条件选择节点:
selected_nodes = [n for n,v in G.nodes(data=True) if v['since'] == 'December 2008']  
print (selected_nodes)

输出: [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)

输出:[(1, 2)]

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

H = G.subgraph(selected_nodes)
nx.draw(H,with_labels=True,node_size=3000)

您可以构建新的图形来绘制带有属性的选定边:

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

输入图像描述


更好的绘制子图的方法是使用指定了nodelistedgelistdraw命令来绘制G。连续调用指定了posnodecolor值的命令可以在同一坐标轴上以不同颜色绘制图形的几个部分。 - Joel
非常感谢。起初,我考虑编写一个函数,它需要图形、日期范围(之前和之后),然后使用过滤器。但是,你的建议也可以。 - jezzy
实际上,我最初想到的是获取图在日期范围内的状态。例如,考虑“2014年3月”,这意味着从日期T0到“2014年3月”的图。我认为“Serenity”的提议只是给出了一个日期的快照,而不是之前发生的事情。 - jezzy
要对边列表进行切片,您可以执行list(G.edges)[0:20:None]。 - Mehmet Burak Sayıcı
@jezzy,你可以通过将过滤器中的 == 更改为某种形式的 <= 检查来轻松实现上述日期范围(这将需要一个具有排序概念的结构化数据类型,而不是您在问题中使用的字符串属性)。 - Kalo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接