gpt4 book ai didi

graphviz - 在 Graphviz 中合并图形

转载 作者:行者123 更新时间:2023-12-01 10:20:11 26 4
gpt4 key购买 nike

我有一组用 DOT 语言编码的有向图,我想将它们合并成一个有向图,其中不同输入图中具有相同名称的节点合并在一起。

例如给定以下文件:
1.dot :

digraph {
A -> B
A -> C
}
2.dot :
digraph {
D -> E
E -> F
}
3.dot :
digraph {
D -> G
G -> A
}

我想获得以下 result.dot :
digraph {
subgraph {
A -> B
A -> C
}
subgraph {
D -> E
E -> F
}
subgraph {
D -> G
G -> A
}
}

我尝试使用 gvpack但它重命名了重复的节点。
> gvpack -u 1.dot 2.dot 3.dot
Warning: node D in graph[2] %15 already defined
Some nodes will be renamed.
digraph root {
node [label="\N"];
{
node [label="\N"];
A -> B;
A -> C;
}
{
node [label="\N"];
D -> E;
E -> F;
}
{
node [label="\N"];
D_gv1 -> G;
G -> A_gv1;
}
}

我找到了 a similar question on SO建议使用 sed重命名重命名的节点,但这似乎不太干净。

有没有办法按照我想要的方式合并图形?

最佳答案

对于您所描述的情况,使用您提供的示例文件,使用 m4 有一个非常简单的答案。 - 一个标准的 GNU Linux 工具,应该在大多数发行版中默认安装。

创建文件 merge123.m4有了这个内容:

digraph 123 {
define(`digraph',`subgraph')
include(1.dot)
include(2.dot)
include(3.dot)
}

并使用命令执行它
m4 merge123.m4 > 123.dot

以及由此产生的 123.dot文件将是
digraph 123 {

subgraph {
A -> B
A -> C
}

subgraph {
D -> E
E -> F
}

subgraph {
D -> G
G -> A
}

}

如果您不喜欢空行,请使用 dnl 关闭脚本中的每一行。 (内置 dnl 代表“丢弃到下一行”:),例如
include(1.dot)dnl
m4非常有用,因为它为 graphviz 添加了功能这对更多参与的项目真的很有帮助;另见 this SO question .

编辑以回答评论中的问题:

如果您需要包含文件并且不知道它们的编号和名称,您(至少)有两个选择:

1) 如果文件数量很少,并且您知道它们可能具有的所有名称,您可以 sinclude()商场:
digraph 123 {
define(`digraph',`subgraph')
sinclude(1.dot)
sinclude(2.dot)
sinclude(3.dot)
sinclude(4.dot)
sinclude(5.dot)
}
m4将只包含实际存在的文件,而不会提示丢失的文件( s 表示“静默”)。

2) 如果您产生较大数量的 .dot具有不可预测名称的文件,您将需要进行一些预处理。创建 shell 脚本 include.sh类似于这个
#!/bin/sh
# get *.dot files (or any pattern you like) into one place
ls *.dot > files.txt
# bring them into a format m4 likes
awk '{print "include(" $1 ")" "dnl"}' files.txt > includes.txt
#done
includes.txt现在提供 m4提供必要的信息:
include(1.dot)dnl
include(2.dot)dnl
include(3.dot)dnl

现在修改您的 merge.m4文件,使其能够使用提供的文件列表(我在此处添加 dnl 以避免在生成的合并文件中出现大量空白空间):
### merge dot files
digraph 123 {
define(`digraph',`subgraph')dnl
syscmd(`./include.sh')dnl
include(`includes.txt')dnl
}

为了将生成的文件与输入文件分开,合并时最好使用不同的扩展名:
m4 merge.m4 > merged.gv

现在看起来像
### merge dot files
digraph 123 {
subgraph {
A -> B
A -> C
}
subgraph {
D -> E
E -> F
}
subgraph {
D -> G
G -> A
}
}

关于graphviz - 在 Graphviz 中合并图形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53202550/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com