【问题标题】:Pydot Cluster positioningPydot集群定位
【发布时间】:2012-06-12 04:31:18
【问题描述】:

如果有两个集群包含其他集群的层次结构。都很酷!

我想垂直放置两个集群。尽管其他帖子建议如何垂直放置节点(而不是集群),但我无法让它适用于集群。

size 参数对我不起作用,但无论如何这似乎是错误的答案,因为我的 python 程序通常会设置一类可能是任意大小的图形。我只想要两个集群在另一个之上,大小应该是任意的。

一个简单的例子将不胜感激。

【问题讨论】:

    标签: python pydot


    【解决方案1】:

    我解决了这个问题。 我有两个独立的集群,每个集群都包含一个子集群的层次结构并被描绘为矩形。 如果我将这两个集群添加到我的图表中,它们会从左到右显示,但我希望它们一个在另一个之上。 如果我向每个集群添加一个节点,让它们处于垂直方向。它们可以在样式修饰符中不可见,但我使用节点作为标签。通过在两个节点之间添加一条边,两个集群以最合理的方式定位自己,以最小化边长,并垂直重新排列。

    在下面的示例中,我创建了另外两个封闭块,这可能不是必需的,因为您可以将一个节点添加到 cluster1 中,另一个添加到 cluster2 中,但是我发现封闭块使我的图表更整洁。

    例如;

    #Assume cluster1 and cluser2 exist
    
    #Create enclosing cluster box
    enclosingBlock1=pydot.Cluster('eb1', label='label1',shape='rectangle')
    enclosingBlock1.add_subgraph(cluster1)
    
    # Add node to enclosing cluster
    node1=pydot.Node('D1',label='Diagram1')
    enclosingBlock1.add_node(node1)
    
    #Create second enclosing block
    enclosingBlock2=pydot.Cluster('eb2', label='label2',shape='rectangle')
    enclosingBlock2.add_subgraph(cluster2)
    # Add the node and create the joining edge
    node2=pydot.Node('D2',label='Diagram2')
    enclosingBlock2.add_node(node2)
    edge = pydot.Edge(node1,node2)
    
    graph.add_subgraph(enclosingBlock1)
    graph.add_subgraph(enclosingBlock2)
    graph.add_edge(edge)
    graph.write('xmlSQL.png',prog = 'dot',format = 'png')
    

    【讨论】:

      【解决方案2】:

      here 描述了对集群排序问题的正确解决方案。它涉及在某些边上设置constraint = false,以便dot 在对节点进行排名时忽略它们。

      在链接的帖子中,启发式地描述了该方法。自动生成control-flow graphs 时对我有用的方法是在后向边缘设置一个错误的constraint

      在控制流图中,后向边是从循环体的出口返回到其入口的边。因此,如果您的应用程序涉及到此类可识别的边缘,那么您可以将其自动化,否则仍然可以作为手动选择边缘的指导原则。

      如果从有关问题的先验结构信息中无法知道此类可识别的边,但您仍希望自动解除边的约束,则可以使用深度优先或广度优先树(您的选择)来选择边的子集作为后向。

      【讨论】:

        猜你喜欢
        • 2011-09-16
        • 2020-01-04
        • 1970-01-01
        • 1970-01-01
        • 2020-11-21
        • 1970-01-01
        • 2011-11-10
        • 1970-01-01
        • 2022-06-10
        相关资源
        最近更新 更多