我想通过节点获得一个子图(红色区域):该子图由所有可从输入节点到达的节点组成。
像G.subgraph(3)一样,从红色区域返回一个新的DiGraph。
例如,我创建一个DiGraph,如下所示:
import networkx as nx
G = nx.DiGraph()
G.add_path([1,2,3,4])
G.add_path([3,'a','b'])
A = nx.to_agraph(G)
A.layout()
A.draw('graph.png')
我查看了https://networkx.github.io/documentation/latest/reference/generated/networkx.Graph.subgraph.html并将其转换为单向的。我测试了out_egdes,强/弱_connected_component,但它从未起作用。我还看上去像How to find subgraphs in a directed graph without converting to undirected graph?和Networkx: extract the connected component containing a given node (directed graph)。
我知道子图在DiGraph中不起作用。
有人能告诉我怎么做吗?如果生成的图形也是一个DiGraph,那就更好了
发布于 2015-10-06 13:02:41
根据我的理解,创建子图的标准取决于可以从输入节点到达的节点。然后,下面的递归函数应该足够完成工作。
def create_subgraph(G,sub_G,start_node):
for n in G.successors_iter(start_node):
sub_G.add_path([start_node,n])
create_subgraph(G,sub_G,n)
我复制了您的代码来创建图形,初始化了一个空有向图,并按如下方式调用了该函数:
G = nx.DiGraph()
G.add_path([1,2,3,4])
G.add_path([3,'a','b'])
sub_G = nx.DiGraph()
create_subgraph(G, sub_G,3)
结果的有向图如图所示。
发布于 2017-08-14 16:26:49
使用内建遍历算法可以获得更好的性能,支持双向选择,避免递归深度限制.
def create_subgraph(G, node):
edges = nx.dfs_successors(G, node)
nodes = []
for k,v in edges.items():
nodes.extend([k])
nodes.extend(v)
return G.subgraph(nodes)
或者是统一方向的简明版本:
def create_subgraph(G, node):
nodes = nx.single_source_shortest_path(G,node).keys()
return G.subgraph(nodes)
在我的例子中,内建版本比递归版本快3倍。它的子图3000从5000个节点:
In [1]: %timeit -n10 use_built_in('O_CONTRACT_PRODUCT')
10 loops, best of 3: 102 ms per loop
In [2]: %timeit -n10 use_recursive('O_CONTRACT_PRODUCT')
10 loops, best of 3: 341 ms per loop
create_subgraph(G,3)的结果如图所示:
发布于 2018-06-13 16:45:39
浅析@vaettchen对How to extract a subgraph from a dot file的神秘评论
gvpr
命令文件,从https://gist.github.com/blabber/74b8d9ed59d0b2ad0d7a734113996424#file-reduce-g获取reduce.g
gvpr
上运行reduce.g
gvpr -f reduce.g -a '"3" 10' mygraph.dot > myreduced.graph.dot
其中-a
是reduce.g
程序的参数,即目标node=3和要遵循的跳数。如果你跳过-a
,它就会告诉你。
This script takes exactly two parameter. 1: name of node, 2: number of hops
现在,从它的立场来看,reduce.g
确实修改了相当多的图形--我从水平方向切换到垂直方向。
顺便说一句,由于将参数输入到bash
脚本中,使我在很大程度上被引号所困扰,所以我添加了一些有用的内容。
gvpr -f reduce.g -a " \"$node_to_select\" 10" mygraph.dot
https://stackoverflow.com/questions/32935510
复制相似问题