点中框图的节点布局更好

Posted

技术标签:

【中文标题】点中框图的节点布局更好【英文标题】:Better layout of nodes for block diagrams in dot 【发布时间】:2011-12-23 23:24:53 【问题描述】:

在上一个问题 (Block diagram layout with dot/Graphviz) 之后,我还有其他问题。下面是这样编译的:

dot -Gsplines=none test.gv |整洁 -n -Gsplines=ortho -Tpng -otest.png

digraph G 
    graph [rankdir = LR];

    node[shape=record, style=filled];

bar[label="Bar", height=1.3636363636363635];
tea[label="Tea", height=1.3636363636363635];
brew[label="Brew", height=3.6363636363636362];
bar1[label="Bar1", height=2.2727272727272725];
baz[label="Baz", height=1];
foo[label="Foo", height=5.0];
darjeeling[label="Darjeeling", height=3.1818181818181817];
example[label="Example", height=17.727272727272727];

bar -> example [label="bar_clk"];
bar -> example [label="bar_bar"];
example -> tea [label="bli1"];
example -> tea [label="blo2"];
example -> tea [label="blo3"];
example -> brew [label="bli"];
example -> brew [label="blo"];
example -> brew [label="blo"];
example -> brew [label="blo"];
example -> brew [label="blo"];
example -> brew [label="blo"];
example -> brew [label="blo"];
example -> brew [label="blo"];
bar1 -> example [label="bar1_foo"];
bar1 -> example [label="bar1_bar"];
bar1 -> example [label="bar1_baz"];
bar1 -> example [label="bar1_baz1"];
bar1 -> example [label="bar1_bar2"];
baz -> example [label="baz_foo"];
example -> foo [label="bla"];
example -> foo [label="bla"];
example -> foo [label="bla"];
example -> foo [label="bla"];
example -> foo [label="bla"];
example -> foo [label="bla"];
example -> foo [label="bla"];
example -> foo [label="bla"];
example -> foo [label="bla"];
example -> foo [label="bla"];
example -> foo [label="bla"];
example -> bar [label="blu"];
example -> baz [label="ble"];
darjeeling -> example [label="darjeeling_bli1"];
darjeeling -> example [label="darjeeling_blo2"];
darjeeling -> example [label="darjeeling_blo3"];
darjeeling -> example [label="darjeeling_bli1"];
darjeeling -> example [label="darjeeling_blo2"];
example -> darjeeling [label="bla"];
darjeeling -> example [label="darjeeling_blo3"];

我的问题是如何获取 Baz 和 Darjeeling 节点并将它们移动到左侧以降低中间节点的高度。我不知道是什么决定了这一点。我知道这是一个有向图,所以图表的一般“流程”是从左到右的,我只是想要更多的控制。

这些图表将自动生成,因此最好解释一下如何按我的意愿布置它以及为什么,而不是让它适用于这个特定示例的代码 sn-p。

【问题讨论】:

【参考方案1】:

几点:

我如何将 Baz 和 Darjeeling 节点移到左侧

通过为从 ExampleBazDarjeeling 的边设置 constraint=false,或者通过将所有节点分组以显示在示例在带有rank=min 的子图中。

您可能会说这不是一个合适的解决方案(至少不是带有constraint=false 的解决方案),因为

这些图表会自动生成

我完全理解(去过很多次)-但同时,你希望

降低中间节点的高度

这是手动设置的,所以图表还没有完全自动生成(你如何计算示例所需的高度?)。

我不知道是什么决定的

我也不完全确定 - Baz 还不如在左边。

令人惊讶的是,节点的出现顺序在某些情况下会改变布局。例如,如果您将大吉岭节点的定义向上移动,它将出现在左侧(而 Bar 将出现在右侧)。


编辑:代码 sn-p...

第三种可能性是按顺序(自上而下/从左至右)定义所有边,并用dir=back装饰返回的边。

如果你改变这 3 行

example -> bar [label="blu"];
example -> baz [label="ble"];
example -> darjeeling [label="bla"];

进入

bar -> example [label="blu", dir=back];
baz -> example [label="ble", dir=back];
darjeeling -> example [label="bla", dir=back];

进入

example -> bar [label="blu", constraint=false];
example -> baz [label="ble", constraint=false];
example -> darjeeling [label="bla", constraint=false];

(并改变example的高度)

你会得到

【讨论】:

感谢您的回答。子图可能会起作用。我也可以在那里放一些约束=假的东西,只需要玩一些。现在根据它的边数计算高度;不过这很容易改变。我知道改变顺序,但没有让双方更加平衡。将使用子图和报告,谢谢! 抱歉,回答迟了。这看起来很有希望,所以这是公认的答案!

以上是关于点中框图的节点布局更好的主要内容,如果未能解决你的问题,请参考以下文章

公共技术点之 View 绘制流程

主流原型设计工具

arcmap布局视图下,怎么只放大数据而不放大页面?

android 拦截事件

scss 更好的响应式列表布局

带有固定节点的 Javascript cytoscape.js 自动布局