带有点/graphviz 的框图布局

Posted

技术标签:

【中文标题】带有点/graphviz 的框图布局【英文标题】:Block diagram layout with dot/graphviz 【发布时间】:2011-12-16 21:38:24 【问题描述】:

我想用点实现以下模型:

到目前为止,我有这么多:

digraph G 
graph [rankdir = LR, splines=ortho]

  unit [shape=box, width = 2, height = 10];

  more_different_unit [shape=box, height=4];
  other_unit [shape=box, height=4];


  unit -> other_unit [label = "foo"];
  unit -> other_unit [label = "bar"];
  unit -> other_unit [label = "bar"];
  unit -> other_unit [label = "bar"];
  unit -> other_unit [label = "bar"];
  unit -> other_unit [label = "bar"];
  unit -> more_different_unit [label = "bar"];
  unit -> more_different_unit [label = "bar"];
  unit -> more_different_unit [label = "bar"];
  unit -> more_different_unit [label = "bar"];
  unit -> more_different_unit [label = "bar"];
  unit -> more_different_unit [label = "bar"];

我是这样编译的:

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

这让我很接近,但有几件事我想知道。

    如何在 Foo 的左侧和右侧获取块,而不仅仅是在右侧?我还没弄明白。

    是否可以将边缘标签始终放在边缘上方或下方?

    如何将右侧节点向左对齐,左侧节点向右对齐?一种可能是使它们具有相同的宽度,这没关系。

谢谢!!

更新:

根据接受的答案,我现在正在执行以下操作,这正是我所需要的,再次通过点管道生成到neato,如上所述:

digraph G 
    graph [rankdir = LR, splines=ortho];

    node[shape=record];
    Bar[label="Bar", height=2];
    Foo[label="Foo", height=4];

    Bew[label="Bew", height=2];
    Gate[label="Gate", height=2];

    Bar -> Foo [label="Bar2Foo"];
    Bar -> Foo [label="Bar2Foo"];
    Bar -> Foo [label="Bar2Foo"];

    Foo -> Bew [label="Foo2Bew"];
    Foo -> Bew [label="Foo2Bew"];
    Bew -> Foo [label="Bew2Foo"];


    Foo -> Gate [label="Foo2Gate"];
    Foo -> Gate [label="Foo2Gate"];

【问题讨论】:

您知道有专门的软件可以做到这一点,不是吗?在 Ubuntu 软件中心搜索“电路”会产生 13 个结果,其中大约 4 个似乎适合该工作。然后是inkscape,dia,Skencil,Xara Xtreme,在更一般的矢量图部门;如果您需要动态生成东西,请考虑使用带有pySVG 和类似功能的python 我必须动态地做,所以我只知道点。不过,我会检查一下 pySVG 看看是否能解决问题!谢谢! 好的,我们很乐意处理可能出现的任何其他问题。如果我的信息最终对您有所帮助,我将不胜感激。 因为 pySVG,我支持了你的。不要认为我需要使用它,但很好的提示。另一个是 Tikz,它看起来很强大。 它报告警告:正交边缘当前不处理边缘标签。尝试使用 xlabels,这是什么问题?谢谢! 【参考方案1】:

这能让你开始吗?

digraph G 
    graph [rankdir = LR];

    node[shape=record];
    Bar[label=" \"Bar\"|<p1>pin 1|<p2>     2|<p3>     3|<p4>     4|<p5>     5 "];
    Foo[label=" <data0>data0|<data1>data1|<data2>data2|<data3>data3|<data4>data4|\"Foo\" |<out0>out0|<out1>out1|<out2>out2|<GND>gnd|<ex0>ex0|<hi>hi|<lo>lo "];

    Bew[label=" <clk>clk|<syn>syn|<mux0>mux0|<mux1>mux1|<signal>signal|\"Bew\" |<out0>out0|<out1>out1|<out2>out2 "];
    Bar:p1 -> Foo:data0;
    Bar:p2 -> Foo:data1;
    Bar:p3 -> Foo:data2;
    Bar:p4 -> Foo:data3;
    Bar:p5 -> Foo:data4;

    Foo:out0 -> Bew:mux0;
    Foo:out1 -> Bew:mux1;
    Bew:clk -> Foo:ex0;

    Gate[label=" <a>a|<b>b|OR|<ab>a\|b "];

    Foo:hi -> Gate:a;
    Foo:lo -> Gate:b;
    Gate:ab -> Bew:signal;

请注意,我使用不间断空格作为一种厚颜无耻的方式来获得对齐(我想,我做了 CkSpaceSpace 在 vi​​m 中,导致 Hex 00a0 char)

您还可以在标签定义中使用 html,这样您就可以使用字体、颜色并创建“间隔”:http://www.graphviz.org/doc/info/shapes.html#html

我认为使用 HTML 节点对齐标签会更容易。

【讨论】:

嗯,我会玩的,谢谢!它确实比我需要的复杂得多,但可以作为替代方案。我想在 Foo 的右侧添加另一个单元没什么大不了的? 没什么大不了的,为演示添加了更多“IC” 接受了你的回答,因为它让我得到了我想要的,尽管我的最终结果略有不同。我用代码更新了我的问题。谢谢!

以上是关于带有点/graphviz 的框图布局的主要内容,如果未能解决你的问题,请参考以下文章

如何垂直而不是水平地制作点(graphviz)布局未连接的节点?

如何使用graphviz在2点之间绘制带有控制点的样条曲线?

Graphviz点算法

使用 nx.draw_graphviz 在 python 中的 graphviz 布局中绘制图形给出错误

如何从graphviz的布局中获取坐标?

带有 graphviz_layout 的水平树