Recursion Graphviz(xdot):如何创建递归节点?
我目前正在用Java编写一个图形库,我想要一个工具来可视化一些图形。我发现了Graph viz,这恰好是一种很好的方法,尽管它有很多车 在我的模型中,图由节点和边组成。每个节点都有一定数量的端口(I/O/IO)和边缘将这些端口链接在一起。一些特殊节点称为图形节点,并嵌入图形。这些图形节点的端口映射到内部节点的一些端口 我想提供几个代表。我感到满意的第一点是: 输入端口用绿色表示,输出端口用红色表示,输入输出端口用蓝色表示 在此表示法中,图形节点不会展开,只显示为简单的节点。在第二个版本中,我希望创建类似下图的内容: 问题是我无法创建具有固定区域的子图(集群)(似乎不可能)。我尝试的另一个解决方案是将图形嵌入到节点中。但是,在HTML标签的Recursion Graphviz(xdot):如何创建递归节点?,recursion,graph,graphviz,dot,Recursion,Graph,Graphviz,Dot,我目前正在用Java编写一个图形库,我想要一个工具来可视化一些图形。我发现了Graph viz,这恰好是一种很好的方法,尽管它有很多车 在我的模型中,图由节点和边组成。每个节点都有一定数量的端口(I/O/IO)和边缘将这些端口链接在一起。一些特殊节点称为图形节点,并嵌入图形。这些图形节点的端口映射到内部节点的一些端口 我想提供几个代表。我感到满意的第一点是: 输入端口用绿色表示,输出端口用红色表示,输入输出端口用蓝色表示 在此表示法中,图形节点不会展开,只显示为简单的节点。在第二个版本中,我希望
部分插入一些代码不会计算代码:
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==