【问题标题】:GraphViz - adding node to existing clusterGraphViz - 将节点添加到现有集群
【发布时间】:2012-11-18 23:05:47
【问题描述】:

我正在使用 Perl GraphViz 模块来创建依赖关系树图。假设我有两个类,A 类和 B 类。我希望 A 类中的所有节点成为一个集群,B 类中的所有节点成为另一个集群。

在 Perl 中,我获取每个节点的类并按照以下方式进行操作:

if ($currentClass ne $lastClass) {
    $classCluster = {name => "class B"};
}
else {
    $classCluster = {name => "class A"};
}

$graph->add_node($currentNode, cluster => $classCluster);

但是,这似乎并没有产生预期的结果。它创建了一个图,其中所有节点都正确绘制图形,但它们没有被分配到适当的集群,它们看起来好像它们不是任何集群的一部分。此外,“A 类”和“B 类”也出现在图中,但其中没有节点。

换句话说,我正在尝试将节点动态分配给集群。有什么想法可以做到吗?谢谢!

【问题讨论】:

  • @stevenl:这段代码在GraphViz2下工作还有很长的路要走,我相信它一定是在使用GraphViz

标签: perl graphviz


【解决方案1】:

我不知道 GraphViz 模块,但我怀疑问题在于您正在创建多个匿名哈希来定义相同的集群。

每次 Perl 执行 {name => "class B"} 时,它都会创建一个 new 哈希,因此您正在为每个恰好具有相同名称的节点创建一个新集群。

我建议你尝试写作

my $clusterA = { name => 'Class A' };
my $clusterB = { name => 'Class B' };

在主循环之外,然后将您显示的代码替换为

if ($currentClass ne $lastClass) {
    $cluster = $clusterB;
}
else {
    $cluster = $clusterA;
}

$graph->add_node($currentNode, cluster => $cluster);

你应该得到一些更好的结果。

我担心您在集群 A 和集群 B 之间进行选择的方式。按照您的方式,所有内容都将进入集群 A,除非它的类与前一个节点的类不同,而且这似乎没有对。但是如果没有看到您的程序的更多内容,尤其是您的数据的性质以及向图中添加节点的循环,我就无法正确判断。

【讨论】:

  • 谢谢,没想到 Perl 每次都会创建一个新的哈希。我最终在循环之外找到了所有可能的类并将它们存储在哈希中。
猜你喜欢
  • 2020-09-13
  • 2021-09-15
  • 2015-11-26
  • 2012-01-03
  • 1970-01-01
  • 1970-01-01
  • 2014-05-14
  • 2016-09-04
  • 2020-01-14
相关资源
最近更新 更多