簡體   English   中英

pygraphviz 或 networkx:獲取給定節點的所有子圖的名稱

[英]pygraphviz or networkx: getting the name of all subgraphs given node

我想知道給定節點的子圖結構。

我也可以使用 networkx 解決方案。

這是我的代碼。

import pygraphviz as pgv

class Test:
    subgraph1 = 'foo'
    subgraph2 = 'bar'

    def __init__(self):
        self.G = pgv.AGraph(directed=True)
        self.G.add_subgraph(label=self.subgraph1, name='cluster_' + self.subgraph1)

        s1 = self.G.get_subgraph('cluster_' + self.subgraph1)
        s1.add_subgraph(label=self.subgraph2, name='cluster_' + self.subgraph2)
        s1.add_node('s1 node')

        s2 = s1.get_subgraph('cluster_' + self.subgraph2)
        s2.add_node('s2 node')

    def main(self):
        print(self.G.subgraph('1st node'))
        print(self.G.subgraph_parent('1st node'))
        print(self.G.subgraph_root('1st node'))
        n = self.G.get_node('1st node')
        print(n.attr['subgraph'])
        print(n.attr['label'])


if __name__ == '__main__': Test().main()

我想要一個 function 給我一個給定整個圖中的任何節點的子圖列表。 像這樣的東西...

在: subgraph_structure_as_list('s2 node')

輸出: ['foo', 'bar']

在: subgraph_structure_as_list('s1 node')

出: ['foo']

您可以使用這樣的遞歸方法:

import pygraphviz as pgv

class Test:
    subgraph1 = 'foo'
    subgraph2 = 'bar'

    def __init__(self):
        self.structure = []
        self.G = pgv.AGraph(directed=True)
        self.G.add_subgraph(label=self.subgraph1, name='cluster_' + self.subgraph1)

        s1 = self.G.get_subgraph('cluster_' + self.subgraph1)
        s1.add_subgraph(label=self.subgraph2, name='cluster_' + self.subgraph2)
        s1.add_node('s1 node')

        s2 = s1.get_subgraph('cluster_' + self.subgraph2)
        s2.add_node('s2 node')

    #  ... other methods here ...

    def get_structure(self, node_name, node=None):
        if node is None:
            node = self.G
        for subgraph in node.subgraphs():
            if node_name in subgraph.nodes():
                self.structure.append(subgraph.node_attr['label'])
            self.get_structure(node_name, subgraph)

    def subgraph_structure_as_list(self, node_name):
        self.structure = []
        self.get_structure(node_name)
        return self.structure

您可以像這樣使用subgraph_structure_as_list

a = Test()
print(a.subgraph_structure_as_list('s2 node'))
print(a.subgraph_structure_as_list('s1 node'))

Output:

['foo', 'bar']
['foo']

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM