如何使用带有不重叠标签的graphviz定义图

问题描述 投票:0回答:2

以下跟随点文件演示了我要解决的问题:

digraph G {
    splines=line;
    rankdir=LR;
    A -> B [label="a long label"];
    A -> C [label="a long label"];
    A -> A [label="a very long label"];
    A -> A [label="a very long label"];
    A -> D [label="a long label"];
}

它生成以下图形:

Result Graph

标签位置不佳,几乎重叠。

可以采取哪些措施来改善此图形的外观?

我会定义改进的意思是说(1)标签彼此不重叠,(2)标签不与边缘重叠,以及(3)可选/理想地标签沿边缘绘制。 #3不可能,但#1和#2应该足够。使用正交样条线将始终提供一个边缘,可以沿着该边缘绘制标签,并且仍然可以正常读取,但是我知道graphviz当前不支持此功能。

graphviz dot
2个回答
0
投票

“改进”在旁观者眼中,但这使用端口,标题标签,空格和换行符来重新排列标签。

digraph G {
    splines=line;
    rankdir=LR;
    // use ports to rearrange edges 
    // then headlabel, spaces, and newlines (\n)
    A:n -> A:w [headlabel="a very long label    "];  
    A:s -> A:w [headlabel="a very long label    "];  
    A -> B [label="a long label"];
    A -> C [label="a long label"];
    A -> D [label="\n\na long label"];
}

enter image description here


0
投票

在GraphViz中似乎没有任何支持的解决方案能够满足边缘标签所需的标准。我的解决方法是在两个节点之间分割边缘,并插入另一个包含边缘标签文本的节点。新节点的样式与普通节点有所区别。

GraphViz布局算法很好地保持了节点分离,并且不允许边缘重叠节点。

使用此替代方法更新测试用例,我有以下点文件:

digraph G {
    splines=ortho;
    rankdir=LR;

    AA1 [label="a very long label", shape="box", style = "filled", fillcolor = "#E6E6E6", color = "#FFFFFF" ] 
    AA2 [label="a very long label", shape="box", style = "filled", fillcolor = "#E6E6E6", color = "#FFFFFF" ] 
    AB1 [label="a long label", shape="box", style = "filled", fillcolor = "#E6E6E6", color = "#FFFFFF" ] 
    AC1 [label="a long label", shape="box", style = "filled", fillcolor = "#E6E6E6", color = "#FFFFFF" ] 
    AD1 [label="a long label", shape="box", style = "filled", fillcolor = "#E6E6E6", color = "#FFFFFF" ] 

    A   -> AA1 [arrowhead = "none" ];
    AA1 -> A 
    A   -> AA2 [arrowhead = "none" ];
    AA2 -> A 

    A   -> AB1 [arrowhead = "none" ];
    AB1 -> B

    A   -> AC1 [arrowhead = "none" ];
    AC1 -> C

    A   -> AD1 [arrowhead = "none" ];
    AD1 -> D
}

产生此graph

© www.soinside.com 2019 - 2024. All rights reserved.