【问题标题】:how to define a graph with graphviz without overlapping labels如何使用 graphviz 定义图形而不重叠标签
【发布时间】:2020-06-16 11:14:40
【问题描述】:

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

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"];
}

生成如下图:

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

可以做些什么来改善此图表的外观?

我会定义 改进 说(1)标签不相互重叠,(2)标签不重叠边缘,以及(3)可选地/理想地标签沿边缘绘制。 #3 可能是不可能的,但 #1 和 #2 应该就足够了。使用正交样条总是会提供一条边,可以沿着该边绘制标签并且仍然可以正常读取,但我知道目前 graphviz 不支持这一点。

【问题讨论】:

    标签: graphviz dot


    【解决方案1】:

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

    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"];
    }
    

    【讨论】:

    • 谢谢。这比我的尝试要好得多。你是对的。我应该更具体。考虑一下,我会这样定义“改进”:(1)标签不相互重叠,(2)标签不重叠边缘,(3)可选/理想标签沿着边缘。 #3 可能是不可能的,但 #1 和 #2 应该就足够了。使用正交样条总是会提供一条边,可以沿着该边绘制标签并且仍然可以正常读取,但我知道目前 graphviz 不支持这一点。
    • 有没有机会让标签与箭头平行?
    • Graphviz 不支持有角度的标签
    【解决方案2】:

    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
    }
    

    产生这个

    【讨论】:

      猜你喜欢
      • 2015-08-20
      • 2017-06-17
      • 1970-01-01
      • 1970-01-01
      • 2022-01-08
      • 1970-01-01
      • 2021-07-27
      • 2021-02-18
      • 1970-01-01
      相关资源
      最近更新 更多