【问题标题】:subgraph method in python graphviz?python graphviz中的子图方法?
【发布时间】:2020-02-25 12:55:30
【问题描述】:

所以我尝试在python上使用graphviz包,它有一个名为subgraph()的方法,但我认为它与网络理论中广泛使用的定义不同。

据我所知,子图是指一个图,其节点和边是另一个图的子集。

graphviz 用户指南上说:
将给定的唯一图形参数的当前内容添加为子图或返回上下文管理器,该上下文管理器返回使用给定(名称、注释等)参数创建的新图形实例,其内容在离开上下文管理器的 with 块时作为子图添加。

这是用户指南中的示例

import graphviz
p = Graph(name='parent')
p.edge('spam', 'eggs')
c = Graph(name='child', node_attr={'shape': 'box'})
c.edge('foo', 'bar')

p.subgraph(c)

根据网络理论,图 p 应该有所有节点 'spam'、'eggs'、'foo'、'bar' 并且子图 c 应该由图 p 中使用的节点和边组成。

但事实并非如此。似乎 subgraph() 方法只是将两个图合二为一。我说的对吗?

什么是特殊的簇子图? (如果子图的名称以“集群”开头,布局引擎会将其视为特殊的集群子图)。我在谷歌上找不到任何结果。

谢谢

【问题讨论】:

    标签: python network-programming networkx graphviz pygraphviz


    【解决方案1】:

    您可以将subgraph 视为对节点和边进行逻辑分组的工具。

    考虑以下示例(如果您不介意,我将使用本机 Graphviz 语法,而不是 Python Graphviz 包装器):

    digraph {
        a -> b
        c
        d -> e
        f
        g -> h
        c -> a
    }
    

    现在让我们在节点cde 周围添加一个子图,并更改全局节点属性,例如,赋予它们矩形形状和红色:

    digraph {
        a -> b
        subgraph mysubgraph {
            node [shape=rect color=red]
            c
            d -> e
        }
        f
        g -> h
        c -> a
    }
    

    如您所见,节点放置没有任何变化,但是子图中的那些节点改变了形状和颜色。另外,请注意您是对的:我们同时影响了定义为节点的 c 节点和隐式定义为边的 d;e 节点。

    我们还可以使用带有rank 属性的子图来控制节点放置(这就是大多数时候使用的子图)。要强制子图中的节点出现在同一行,请将rank=same 属性添加到您的子图中:

    digraph {
        a -> b
        subgraph mysubgraph {
            node [shape=rect color=red]
            rank=same
            c
            d -> e
        }
        f
        g -> h
        c -> a
    }
    

    集群是一个完全不同的故事。当您在子图名称的开头添加单词“集群”时,在该集群内定义的节点将物理地聚集在一起。您还将获得一个矩形(默认情况下)将这些节点包裹在您的图表上:

    digraph {
        a -> b
        subgraph cluster_mysubgraph {
            node [shape=rect color=red]
            c
            d -> e
        }
        f
        g -> h
        c -> a
    }
    

    注意这张图和第二张图的区别。 我建议您谨慎使用集群。一旦您在集群内部和外部的节点之间建立了连接,就布局而言,事情可能会变得很奇怪。

    顺便说一句,通过官方文档学习 garphviz 真的很难,因为它们更多的是参考而不是指导。但他们也有一个很好的指南,用普通人(对不起,数学家)的好语言编写,但它被埋在 Graphviz 网站中:https://graphviz.gitlab.io/_pages/pdf/dotguide.pdf

    【讨论】:

    • 感谢您的友好回答。所以graphviz中的子图与网络理论中使用的定义完全不同,对吧?它用于对节点和边进行分组,然后可能会更改属性。
    • 在指南中(我发布了错误的链接,现已修复),它仍然是这样定义的:在主图中,subgraph 定义了节点的子集和边缘。 它仍然是一个子集,但它主要用于批量分配属性和调整具有子图特定rank 属性的布局。另请注意,您可以在子图中定义节点,但在主图中引用它们(例如在边中使用它们),它们就是这样工作的
    猜你喜欢
    • 1970-01-01
    • 2021-11-22
    • 2012-09-09
    • 2012-11-01
    • 2020-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-23
    相关资源
    最近更新 更多