6

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

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

我想提供几个代表。我满意的第一个如下:http: //i.stack.imgur.com/ujU71.png

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

在此表示中,GraphNodes没有展开,并且显示为简单的Nodes。在第二个版本中,我想创建如下图所示的内容:http: //i.stack.imgur.com/Cx624.png

问题是我无法创建具有固定区域的子图(集群)(似乎不可能)。我尝试的另一个解决方案是将图形嵌入到节点中。但是,将一些代码插入<td> </td>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"
    ]

}

前面的代码创建了以下图表:http: //i.stack.imgur.com/E9jQ1.png

最后,我能想到的最佳解决方案如下:http: //i.stack.imgur.com/VzS5g.png

但是我对此并不满意,因为GraphNodes端口有时被放置在奇怪的位置。

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


编辑:我仍然没有找到任何解决方案。处理此问题的一种方法是能够修复包含集群内给定节点的位置,但“点”布局似乎不可能。任何想法 ?

4

1 回答 1

1

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

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


嵌套


digraph { nodesep = 0.2 rankep = 0.8 pad = 0.1 node [ shape=square ] node [ style=filled ] edge [ arrowhead=none ]

//rankdir = LR

component_starter [ label = < port02 port03 port06 S port07 port08 port04 port05 > style = "invisible" ]

subgraph cluster_container { label="I/O device with components " color=orange

//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
}

//--

//subgraph  cluster_inner {
    //label="abstractions"
    //color="black"
    //style="invis"
    component_a [ label = <
        <table border="0" cellspacing="0"><tr>
            <td border="1" bgcolor="white"   > </td>
            <td border="1" bgcolor="palegreen" port="port2">port2</td>
            <td border="1" bgcolor="palegreen" port="port3">port3</td>
        </tr><tr>
            <td border="1" bgcolor="skyblue"   port="port6">port6</td>
            <td border="1" bgcolor="peachpuff" rowspan="3" colspan="2">A</td>
        </tr><tr>
            <td border="1" bgcolor="skyblue"   port="port7">port7</td>
        </tr><tr>
            <td border="1" bgcolor="skyblue"   port="port8">port8</td>
        </tr><tr>
           <td border="1" bgcolor="lightpink" colspan="1" port="port4">port4</td>
           <td border="1" bgcolor="lightpink" colspan="2" port="port5">port5</td>
        </tr></table> > style = "invisible" ]

    component_b [ label = <
        <table border="0" cellspacing="0"><tr>
            <td border="1" bgcolor="white"   > </td>
            <td border="1" bgcolor="palegreen" port="port22">port22</td>
            <td border="1" bgcolor="palegreen" port="port23">port23</td>
        </tr><tr>
            <td border="1" bgcolor="skyblue"   port="port25">port25</td>
            <td border="1" bgcolor="peachpuff" colspan="2"> B </td>
        </tr><tr>
        <td border="1" bgcolor="lightpink" colspan="3" port="port24">port24</td>
        </tr></table> > style = "invisible" ]

//-

    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;

}

上面的点文件,压缩了。用于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==
于 2013-07-31T23:33:07.937 回答