【问题标题】:Make a node not affect graph layout使节点不影响图形布局
【发布时间】:2019-09-09 22:47:54
【问题描述】:

我正在尝试制作一个节点而不影响连接节点的定位。当我绘制图表时,它将父节点居中于子节点之间;这导致了交错效应。如何使故障节点不影响其他节点的布局?我已经把线条画得笔直,就像它们在所需的照片中一样,但它仍然是交错的布局。

当前风格:

想要的风格:

编辑: 点码

strict graph "" {
graph [bb="0,0,562,490",
    bgcolor="#666666",
    fontcolor=white,
    fontname=monospace,
    label="ACI MSC - Create Bridge Domain - L3",
    labelfontsize=40,
    labelloc=t,
    lheight=0.19,
    lp="281,479",
    lwidth=3.30,
    newrank=yes,
    nodesep=0.2,
    outputorder=edgesfirst,
    overlap=compress,
    ranksep=0.5,
    splines=spline
];
node [fillcolor=white,
    fixedsize=True,
    fontcolor=black,
    fontname=monospace,
    label="\N",
    shape=rectangle,
    style=filled,
    width=5.125
];
edge [fontname=monospace,
    fontsize=15,
    penwidth=2
];
Start    [color=white,
    fillcolor=blue,
    fixedsize=false,
    fontcolor=white,
    height=0.5,
    pos="377.5,450",
    shape=oval,
    width=1];
"ACIMSC-CreateSchemaandAddTemplate-Sub"  [height=0.5,
    pos="377.5,378"];
Start -- "ACIMSC-CreateSchemaandAddTemplate-Sub"     [color=green,
    pos="377.5,431.83 377.5,421 377.5,407.29 377.5,396.41"];
"ACIMSC-AddBridgeDomaintoTemplate"   [height=0.5,
    pos="274.5,306"];
"ACIMSC-CreateSchemaandAddTemplate-Sub" -- "ACIMSC- 
AddBridgeDomaintoTemplate"   [color=green,
    pos="351.51,359.83 335.89,348.92 316.1,335.08 300.48,324.16"];
Fail     [color=white,
    fillcolor=red,
    fixedsize=false,
    fontcolor=white,
    height=0.5,
    pos="421.5,18",
    shape=oval,
    weight=0,
    width=1];
"ACIMSC-CreateSchemaandAddTemplate-Sub" -- Fail  [color=red,
    pos="423.22,359.95 439.3,351.39 455.96,339.56 466.5,324 
    489.24,290.42 481.5,274.55 481.5,234 481.5,234 481.5,234 
    481.5,162 
    481.5,120.71 \
    475.54,109.6 458.5,72 452.5,58.75 443.25,45.25 435.5,35.063"];
"ACIMSC-AddBridgeDomaintoTemplate" -- Fail   [color=red,
    pos="356.37,288 391.19,278.55 426.17,266.02 436.5,252 
    485.39,185.63 447.55,77.845 429.6,35.692"];
VscaleACIMultisiteAddSubnettoBridgeDomain    [height=0.5,
    pos="244.5,234"];
"ACIMSC-AddBridgeDomaintoTemplate" -- 
VscaleACIMultisiteAddSubnettoBridgeDomain    [color=green,
    pos="266.93,287.83 262.42,277 256.7,263.29 252.17,252.41"];
VscaleACIMultisiteAddSubnettoBridgeDomain -- Fail    [color=red,
    pos="325.05,215.91 360.06,206.35 395.58,193.76 406.5,180 
    439.94,137.85 431.92,68.723 425.62,36.11"];
"ACIMSC-AddL3OuttoSiteBridgeDomain-Sub"  [height=0.5,
    pos="214.5,162"];
VscaleACIMultisiteAddSubnettoBridgeDomain -- "ACIMSC- 
AddL3OuttoSiteBridgeDomain-Sub"  [color=green,
    pos="236.93,215.83 232.42,205 226.7,191.29 222.17,180.41"];
"ACIMSC-AddL3OuttoSiteBridgeDomain-Sub" -- Fail  [color=red,
    pos="309.72,143.87 333.49,135.88 357.57,124.41 376.5,108 
    398.54,88.885 410.97,56.41 416.96,36.139"];
"ACIMSC-DeployTemplatetoSites"   [height=0.5,
    pos="184.5,90"];
"ACIMSC-AddL3OuttoSiteBridgeDomain-Sub" -- "ACIMSC- 
DeployTemplatetoSites"   [color=green,
    pos="206.93,143.83 202.42,133 196.7,119.29 192.17,108.41"];
"ACIMSC-DeployTemplatetoSites" -- Fail   [color=red,
    pos="244,71.924 290.62,57.761 353.6,38.629 390.65,27.373"];
Complete     [color=white,
    fillcolor="#129112",
    fixedsize=false,
    fontcolor=white,
    height=0.5,
    pos="184.5,18",
    shape=oval,
    width=1.3321];
"ACIMSC-DeployTemplatetoSites" -- Complete   [color=green,
    pos="184.5,71.831 184.5,61 184.5,47.288 184.5,36.413"];
}

【问题讨论】:

  • 请发布您目前尝试过的点代码,以便可以从那里开始。
  • 嘿阿尔伯特。我发布了点代码。此代码是使用 pygraphviz 生成的。

标签: python python-3.x graphviz pygraphviz


【解决方案1】:

我无法渲染您的代码来实现您的图片,但我将建议的技术无论如何都应该有效。

我编写了一个类似的基本示例代码:

digraph {
    node [shape=rect]

    a -> b -> c -> d -> e -> f
    success [shape=oval]
    f -> success
    {
        rank=max
        failure [shape=oval]
    }
    {a b c d e f} -> failure
}

这给出了以下图片,并复制了您的问题:

第一个可能的解决方案可能是将constraint=false 属性添加到通向falure 节点的边。这个属性就是这样做的——防止边缘影响布局。

digraph {
    node [shape=rect]

    a -> b -> c -> d -> e -> f
    success [shape=oval]
    f -> success
    {
        rank=max
        failure [shape=oval]
    }
    {a b c d e f} -> failure [constraint=false]
}

结果:

第二种可能的解决方案是增加您需要保持笔直的边缘的weight 属性。权重较高的边缘往往比其他边缘更短更直:

digraph {
    node [shape=rect]

    a -> b -> c -> d -> e -> f [weight=10]
    success [shape=oval]
    f -> success
    {
        rank=max
        failure [shape=oval]
    }
    {a b c d e f} -> failure
}

结果:

【讨论】:

  • 嘿,丹妮。感谢您的回复!我最终使用了重量。当使用 constraint=False 时,我得到以下结果:imgur.com/a/CAzGvXs 权重将失败节点保持在底部。
  • 但是,如果您知道如何让故障从顶部保持到顶部,请告诉我 :) 该版本中的线条更清晰。
  • 嗨,@DavidPryor!您可以将Failure 节点包含在具有rank=max 属性的子图中,就像我在所有示例中所做的那样。无论如何,这都会迫使节点保持在底部。您也可以将successfailure 定义包含在具有rank=same 属性的子图中。这将迫使他们保持在同一水平。 graphviz.gitlab.io/_pages/doc/info/attrs.html#d:rank
  • 再次感谢您的帮助。我最终使用了 weights 和 constraint=false 的组合来获得一个不错的布局!我还最终在完成和失败之间使用了一种无形的联系,以确保它们保持彼此的相对方向; constraint= false 有时会翻转完成并失败。
猜你喜欢
  • 2018-08-16
  • 2012-07-20
  • 2014-01-15
  • 2015-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-18
  • 1970-01-01
相关资源
最近更新 更多