Recursion Graphviz(xdot):如何创建递归节点?

Recursion Graphviz(xdot):如何创建递归节点?,recursion,graph,graphviz,dot,Recursion,Graph,Graphviz,Dot,我目前正在用Java编写一个图形库,我想要一个工具来可视化一些图形。我发现了Graph viz,这恰好是一种很好的方法,尽管它有很多车 在我的模型中,图由节点和边组成。每个节点都有一定数量的端口(I/O/IO)和边缘将这些端口链接在一起。一些特殊节点称为图形节点,并嵌入图形。这些图形节点的端口映射到内部节点的一些端口 我想提供几个代表。我感到满意的第一点是: 输入端口用绿色表示,输出端口用红色表示,输入输出端口用蓝色表示 在此表示法中,图形节点不会展开,只显示为简单的节点。在第二个版本中,我希望

我目前正在用Java编写一个图形库,我想要一个工具来可视化一些图形。我发现了Graph viz,这恰好是一种很好的方法,尽管它有很多车

在我的模型中,节点组成。每个节点都有一定数量的端口(I/O/IO)和边缘将这些端口链接在一起。一些特殊节点称为图形节点,并嵌入图形。这些图形节点的端口映射到内部节点的一些端口

我想提供几个代表。我感到满意的第一点是:

输入端口
用绿色表示,输出端口用红色表示,输入输出端口用蓝色表示

在此表示法中,图形节点不会展开,只显示为简单的节点。在第二个版本中,我希望创建类似下图的内容:

问题是我无法创建具有固定区域的子图(集群)(似乎不可能)。我尝试的另一个解决方案是将图形嵌入到节点中。但是,在HTML标签的
部分插入一些代码不会计算代码:

digraph graph0
{

    node1
    [
        label =
        <
            <table border="0" cellspacing="0">
                <tr>
                    <td cellpadding="0">
                        <table border="0" cellspacing="0">
                            <tr>
                                <td bgcolor="palegreen" border="1" port="port2">port2</td>
                                <td bgcolor="palegreen" border="1" port="port3">port3</td>
                            </tr>
                        </table>
                    </td>
                </tr>
                <tr>
                    <td cellpadding="0">
                        <table border="0" cellspacing="0">
                            <tr>
                                <td cellpadding="0">
                                    <table border="0" cellspacing="0">
                                        <tr>
                                            <td bgcolor="skyblue" border="1" port="port5">port5</td>
                                        </tr>
                                    </table>
                                </td>
                                <td bgcolor="peachpuff" border="1">

                                    subgraph clusterTest
                                    {
                                        nodeTest
                                    }

                                </td>
                            </tr>
                        </table>
                    </td>
                </tr>
                <tr>
                    <td cellpadding="0">
                        <table border="0" cellspacing="0">
                            <tr>
                                <td bgcolor="lightpink" border="1" port="port4">port4</td>
                            </tr>
                        </table>
                    </td>
                </tr>
            </table>
        >
        style = "invisible"
    ]

}
有向图0
{
节点1
[
标签=
<
端口2
端口3
端口5
子图聚类检验
{
节点测试
}
端口4
>
style=“不可见”
]
}
前面的代码创建以下图形:

最后,我能想出的最佳解决方案如下:

但是我不满意它,因为图形节点端口有时放置在奇怪的位置

你知道我怎样才能达到目标图形布局吗?如果需要,请询问任何其他信息



编辑:我仍然没有找到任何解决方案。处理这种情况的一种方法是能够固定包含集群的给定节点的位置,但使用“点”布局似乎是不可能的。有什么想法吗?

使用有向图,可以指定节点的位置(相对于彼此)。这可以用来强制某些元素出现在其他元素之上。而其他节点可以强制显示在同一级别(本例中为端口101和102)

伪嵌套:此图不使用嵌套的纯文本/半html节点,因为我认为这是不可能的(不是功能)。我不确定是否有任何graphviz库支持它们,但可能值得研究其他库。我甚至从未使用过Java或Python中的点,否则我会提出一个建议



有向图{ nodesep=0.2 ranksep=0.8 pad=0.1 节点[形状=正方形] 节点[样式=填充] 边[箭头=无]

//rankdir=LR

组件\u启动器[标签=< 端口02 端口03 端口06 s 端口07 端口08 端口04 端口05 >style=“不可见”]

子图簇容器{ label=“带组件的I/O设备” 颜色=橙色

//margin = 0
edge [ style="invis"]
//edge [ len="0.5" minlen="1" ]
node [ height="0.5" width="2" fixedsize=true ];
node [ shape=rectangle style=filled ]
{ 
node [ color=palegreen ];
    { rank = same port101 -> port102 }
}
{
node [ color=skyblue];
    port103 port104 }
{
node [ height="1.5" width="2" fixedsize=true ];
node [ color=peachpuff];
    //notaport
}
{
node [ height="0.5" width="4" fixedsize=true ];
node [ color=lightpink];
    output
}
//--


上面的点文件已压缩。使用
base64-d nesting.bz2.base64 | bzcat
查看它

QlpoOTFBWSZTWd/epEIABCzfgHAwWAP/3zgkmAq/7//6UASZm8a7VNrQBQQlSDUaYjTINGjIyZAG
ho0aNMgkUZJpEIzUw0TTEzQBoAIwCTUiFT1NppDymGk0Pap6gMmCaAAcwAAAAAAAAAAFSRJoGp6B
TyNTyhABoD1DQ0aephLyAcTAhMSQiKogMBLsVaZBYIwUHIGFISYVKCMVkRgLypG2mhHPb5z0hBap
yN3HCL2iJVDYvXI6SykmzPN9LCaex+63c7jyTnk18c2KgvDZq6Kkz+WWf4DU4KoQsCQJ1gKpAcwC
mp5nGnmlI8wBNtgDi+Hmf0/g/v4PoNaZVrhy5cdWCavJkutPC0t50kljBJLHXrbQUjJMPPDCUKwN
NHO8aaiqKTus3tLEpprCW8Gzr68DtvyteHrqa7JJ9J46R4muUMuU39kJYPEgwJWwCSqsgMteezTo
ta1rr3va1sccdW/32OJUROFkmUzqeyHn+g96EccgEY5SfJixh2aJgQC0JVmWAtrdagoOkDZAViKA
qUpGZ1dXNJikmmsRZmAO16Kq9osW7KzzPZPS9IeLIqXo0cOoNwatry3Mi792YMRvA3oiKxe84ac7
EMGmdrabTaG0qqDpAMJJn5IeAbvMNiSJW8og7y+Ik+CExJBhLDZlKFSFKMBgIIMai57J5pLmgl5R
Qm261e797RF6qhy82NQypLEa8ktUVAL2R1hxThWC3pVB0jBThRxVLfHHJeZHv+pMEkxZ3P6KP+ho
QWyC9gtIM2cxJK2pIiiIooOPlxE0kkspJPijcgrHRHw6XvMpwy5ldiqlUpWzvymgxr78zAXh4vSW
L3jya8Hqc6ekwhhDROybThDBnIdmdlN6ClO8bo7ucxNqSVjHNGd8F8ocW2qmT0bJRujojA9MJqnC
TPg09tZlJ5d/am7W8E6GeU3TkyVC0N5nTgeXXn7Sj1UWijm1Q07OKeXiyPbENRSNcNzrnkyxkNeu
RgS5GWEXKkpTdIy8NenUhVYpqkbUCushe+cQ15oMcRIrb4GZscDDVmLk3LF7Txk6yFvmky8aoiK5
T+3pVRjVVVUtLRVFFI0q1lrpHlGqNnHKOVIKkktUYAuq2L1bekwQeG68LX3tK64kVNRw2tDb7rLn
acBl0J61Ld57HXXHKpXLjoqAo5yyRvQ/YxLdufjNCSaEk4mmYLcZp1ybI1BqDTum20PSm2cId4pU
Zx00pZzOJZwnSHjAqXNkWCM4s/+LuSKcKEhv71IhAA==

我把这个放在你的膝上,因为我现在必须运行。请告诉我是否有问题(细节)可以添加到答案中…嗨!谢谢你的回答,很抱歉我以前无法测试它。但是我无法运行它。看起来Python在检索属性“width”时失败。你使用哪个版本的Xdot来可视化它(我的是0.4)还是另一个软件?不管怎样,你的答案对我来说很完美!我直接用graphviz渲染了它。dot-graphviz版本2.26.3是的,我刚刚测试过,效果很好!看起来Xdot无法处理固定大小的元素。谢谢大家!
    component_c [ label = <
        <table border="0" cellspacing="0"><tr>
            <td border="1" bgcolor="white"   > </td>
            <td border="1" bgcolor="palegreen" port="port32">port32</td>
            <td border="1" bgcolor="palegreen" port="port33">port33</td>
        </tr><tr>
            <td border="1" bgcolor="skyblue"   port="port35">port35</td>
            <td border="1" bgcolor="peachpuff" colspan="2"> C </td>
        </tr><tr>
         <td border="1" bgcolor="lightpink" colspan="3" port="port34">port34</td>
        </tr></table> > style = "invisible" ]
//}


port101 -> port103
port102 -> component_a 
port102 -> component_b
port103 -> port104

component_a -> output;
component_b -> output;
component_c -> output;

edge [ style="" arrowhead="normal" color="#444444"]
component_a:port4 -> output;

component_c:port34 -> component_a:port3;
component_a:port5 -> component_b:port22;

port101 -> component_c:port33
{ rank = same

    edge [ dir=back ]
    port104 -> component_a:port8
}

}

component_starter;
component_starter:port5 -> port101;

}
QlpoOTFBWSZTWd/epEIABCzfgHAwWAP/3zgkmAq/7//6UASZm8a7VNrQBQQlSDUaYjTINGjIyZAG
ho0aNMgkUZJpEIzUw0TTEzQBoAIwCTUiFT1NppDymGk0Pap6gMmCaAAcwAAAAAAAAAAFSRJoGp6B
TyNTyhABoD1DQ0aephLyAcTAhMSQiKogMBLsVaZBYIwUHIGFISYVKCMVkRgLypG2mhHPb5z0hBap
yN3HCL2iJVDYvXI6SykmzPN9LCaex+63c7jyTnk18c2KgvDZq6Kkz+WWf4DU4KoQsCQJ1gKpAcwC
mp5nGnmlI8wBNtgDi+Hmf0/g/v4PoNaZVrhy5cdWCavJkutPC0t50kljBJLHXrbQUjJMPPDCUKwN
NHO8aaiqKTus3tLEpprCW8Gzr68DtvyteHrqa7JJ9J46R4muUMuU39kJYPEgwJWwCSqsgMteezTo
ta1rr3va1sccdW/32OJUROFkmUzqeyHn+g96EccgEY5SfJixh2aJgQC0JVmWAtrdagoOkDZAViKA
qUpGZ1dXNJikmmsRZmAO16Kq9osW7KzzPZPS9IeLIqXo0cOoNwatry3Mi792YMRvA3oiKxe84ac7
EMGmdrabTaG0qqDpAMJJn5IeAbvMNiSJW8og7y+Ik+CExJBhLDZlKFSFKMBgIIMai57J5pLmgl5R
Qm261e797RF6qhy82NQypLEa8ktUVAL2R1hxThWC3pVB0jBThRxVLfHHJeZHv+pMEkxZ3P6KP+ho
QWyC9gtIM2cxJK2pIiiIooOPlxE0kkspJPijcgrHRHw6XvMpwy5ldiqlUpWzvymgxr78zAXh4vSW
L3jya8Hqc6ekwhhDROybThDBnIdmdlN6ClO8bo7ucxNqSVjHNGd8F8ocW2qmT0bJRujojA9MJqnC
TPg09tZlJ5d/am7W8E6GeU3TkyVC0N5nTgeXXn7Sj1UWijm1Q07OKeXiyPbENRSNcNzrnkyxkNeu
RgS5GWEXKkpTdIy8NenUhVYpqkbUCushe+cQ15oMcRIrb4GZscDDVmLk3LF7Txk6yFvmky8aoiK5
T+3pVRjVVVUtLRVFFI0q1lrpHlGqNnHKOVIKkktUYAuq2L1bekwQeG68LX3tK64kVNRw2tDb7rLn
acBl0J61Ld57HXXHKpXLjoqAo5yyRvQ/YxLdufjNCSaEk4mmYLcZp1ybI1BqDTum20PSm2cId4pU
Zx00pZzOJZwnSHjAqXNkWCM4s/+LuSKcKEhv71IhAA==