1

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

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

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

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

4

2 回答 2

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')
于 2012-06-12T04:54:30.603 回答
0

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

在链接的帖子中,启发式地描述了该方法。在自动生成控制流图constraint时对我有用的方法是在后向边缘上设置一个 false 。

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

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

于 2014-09-10T06:33:50.720 回答