【问题标题】:How to keep the graph form when adding new arrows?添加新箭头时如何保持图形形式?
【发布时间】:2021-07-06 22:12:59
【问题描述】:

我有一个这样的图表:

问题一:有没有办法让两列在顶部水平对齐?

如果我想要一个箭头a5 -> a1,那么图表将是:

问题 2:有没有办法让图表像以前一样干净?

代码如下:

digraph {
    rankdir="LR";
// overlap=false;
    nodesep="0.2";
    ranksep="0.4";
    fontsize = 25
    labelloc="t";
    fontname="Lato";
    node [ shape="plaintext" style="filled, rounded" fontname="Lato" margin=0.2 ]
    edge [ fontname="Lato" color="#2B303A" ]
    
    subgraph cluster_0 {
        style=filled;
        color=lightgrey;
        label = "Column 1";
        fontsize = 20
        node [style=filled,color=white];
        a1
        a2
        a3
        a4
        a5
        
    }

    subgraph cluster_1 {
        node [style=filled];
        color=blue
        label = "Column 2";
        fontsize = 20
        // labeljust=r
        // labelloc=b
        b1
        b2
        b3
        b4
    }

    a1 -> b1
    b1 -> a2
    a2 -> b2
    b2 -> a3
    a3 -> b3
    b3 -> a4
    a4 -> b4
    b4 -> a5
    a5 -> a1
}

【问题讨论】:

    标签: graphviz


    【解决方案1】:

    需要两个小步骤:​​

    (1) 将所有a 节点置于同一等级。如果您不这样做,graphviz 会在 a1a5 之间建立层级关系,这就是您的图表所显示的内容。

    (2) 在a1b1 之间的边缘添加一些额外的重量,使其保持笔直。

    digraph {
        rankdir="LR";
    // overlap=false;
        nodesep="0.2";
        ranksep="0.4";
        fontsize = 25
        labelloc="t";
        fontname="Lato";
        node [ shape="plaintext" style="filled, rounded" fontname="Lato" margin=0.2 ]
        edge [ fontname="Lato" color="#2B303A" ]
        
        subgraph cluster_0 {
            style=filled;
            color=lightgrey;
            label = "Column 1";
            fontsize = 20
            node [style=filled,color=white];
            {rank = same; a1 a2 a3 a4 a5 }        // !!!
        }
    
        subgraph cluster_1 {
            node [style=filled];
            color=blue
            label = "Column 2";
            fontsize = 20
            // labeljust=r
            // labelloc=b
            b1
            b2
            b3
            b4
        }
    
        a1 -> b1[ weight = 10 ];        // !!!
        b1 -> a2
        a2 -> b2
        b2 -> a3
        a3 -> b3
        b3 -> a4
        a4 -> b4
        b4 -> a5
        a5 -> a1
    }
    

    现在生产

    【讨论】:

    • 谢谢。有没有办法强制节点an 始终与节点bn 对齐?我尝试将[ weight = 10 ] 复制到a2 -> b2a3 -> b3 等等,但它不起作用。 (在我的真实案例中,节点中的文本因长度而异,因此节点的高度也不同)
    • 哦,没关系。对于最不对齐的节点,我尝试使用[ weight = 1000 ]。节点没有像我预期的那样在顶部水平对齐,但结果仍然很整齐
    • 您可以将节点an与节点bn对齐,使用空节点来填充差异。但这需要大量的手工工作,而且因情况而异。
    【解决方案2】:

    我将通过以下两个更改来解决这个问题:

    • 使用constraint=false 以避免从a5a1 的边缘弄乱图形

    • 使用group属性建议节点之间的直边(与边连接时应放置在直线上的节点的属性值相同)

      digraph {
        rankdir="LR";
      // overlap=false;
        nodesep="0.2";
        ranksep="0.4";
        fontsize = 25
        labelloc="t";
        fontname="Lato";
        node [ shape="plaintext" style="filled, rounded" fontname="Lato" margin=0.2 ]
        edge [ fontname="Lato" color="#2B303A" ]
      
        subgraph cluster_0 {
            style=filled;
            color=lightgrey;
            label = "Column 1";
            fontsize = 20
            node [style=filled,color=white];
            a1 [group=1]
            a2
            a3
            a4
            a5
      
        }
      
        subgraph cluster_1 {
            node [style=filled];
            color=blue
            label = "Column 2";
            fontsize = 20
            // labeljust=r
            // labelloc=b
            b1 [group=1]
            b2
            b3
            b4
        }
      
        a1 -> b1
        b1 -> a2
        a2 -> b2
        b2 -> a3
        a3 -> b3
        b3 -> a4
        a4 -> b4
        b4 -> a5
        a5 -> a1 [constraint=false]
      }
      

    【讨论】:

      猜你喜欢
      • 2022-10-05
      • 1970-01-01
      • 2018-09-10
      • 1970-01-01
      • 1970-01-01
      • 2016-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多