tikz lib graphdrawing 的分层图:旋转和最小化手动调整

tikz lib graphdrawing 的分层图:旋转和最小化手动调整

我试图用 tikz 重新创建以下 graphviz 图(来自https://graphs.grevian.org/example

graph {
    rankdir=LR;
    a -- { b c d }; b -- { c e }; c -- { e f }; d -- { f g }; e -- h;
    f -- { h i j g }; g -- k; h -- { o l }; i -- { l m j }; j -- { m n k };
    k -- { n r }; l -- { o m }; m -- { o p n }; n -- { q r };
    o -- { s p }; p -- { s t q }; q -- { t r }; r -- t; s -- z; t -- z;
    { rank=same; b, c, d }
    { rank=same; e, f, g }
    { rank=same; h, i, j, k }
    { rank=same; l, m, n }
    { rank=same; o, p, q, r }
    { rank=same; s, t }
}

在此处输入图片描述

为了复制设置,rankdir=LR;我遵循了旋转 tikz“分层布局”并补充道grow=right, components go down left aligned

%! TEX program = lualatex
\documentclass[tikz]{standalone}
\usetikzlibrary{graphs,graphdrawing,shapes}
\usegdlibrary{layered}
\begin{document}
\tikz \graph [layered layout,
    nodes={ellipse, minimum width=25pt, draw},
    % https://tex.stackexchange.com/q/390417/rotate-tikz-layered-layout
    grow=right, components go down left aligned
    ] {
    { [same layer] b, c, d };
    { [same layer] e, f, g };
    { [same layer] h, i, j, k };
    { [same layer] l, m, n };
    { [same layer] o, p, q, r };
    { [same layer] s, t };

    a[nudge left=25mm] -- { b, c, d }; b -- { c, e };c -- { e, f };
    d -- { f, g }; e -- h; f[nudge down=10mm] -- { h, i, j, g };
    g[nudge down=10mm] -- k; h --[bend left=-30] o; h -- l;
    i -- { l, m, j }; j -- { m, n, k }; k -- { n, r }; l[nudge up=10mm] -- { o, m };
    m[nudge up=10mm] -- { o, p, n }; n -- { q, r }; o -- { s, p }; p -- { s, t, q };
    q -- { t, r }; r -- t; s -- z; t -- z;
};
\end{document}

在此处输入图片描述

a我通过将节点向左“轻推”来移除不必要的边缘交叉。为了填补移动节点留下的空白a,我向下移动了gf。我还必须向上调整m和并向下l弯曲边缘h--o

如果没有这些修改,图表看起来如下

在此处输入图片描述

尤其是边缘,h--o完全具有误导性。

是否有人知道如何重新创建 graphviz 结果,即将分层图水平定位(与默认值相反)并避免进行大量手动调整?

更新

放置a在已经固定的轻推的自己的层上af并且g

{ [same layer] a };

剩下的问题显然是交叉最小化算法,它不知道向上移动并将扭结添加到另一个方向的“简单”解决m方案l

在此处输入图片描述

注意:marmot 的回答建议手动添加连接两个不同层的节点的边,这些节点之间至少有一个附加层。这也许也可以作为其他图表的经验法则。

答案1

我不知道这是否有帮助,但如果我

  • 删除所有nudges,
  • 创建一个图层a
  • 更改grow=rightgrow'=right,并且
  • 将单个命令“移出图表”:\draw (h) to[bend left=40] (o);

我明白了

\documentclass[tikz]{standalone}
\usetikzlibrary{graphs,graphdrawing}
\usetikzlibrary{shapes}
\usegdlibrary{layered}
\begin{document}
\begin{tikzpicture}
\graph [layered layout,
    nodes={ellipse, minimum width=25pt, draw},
    % https://tex.stackexchange.com/q/390417/rotate-tikz-layered-layout
    grow'=right, components go down left aligned
    ] {
    { [same layer] a }; %<- added
    { [same layer] b, c, d };
    { [same layer] e, f, g };
    { [same layer] h, i, j, k };
    { [same layer] l, m, n };
    { [same layer] o, p, q, r };
    { [same layer] s, t };
    a -- { b, c, d }; 
    b -- { c, e };
    c -- { e, f };
    d -- { f, g }; 
    e -- h; 
    f -- { h, i, j, g };
    g -- k; 
    h -- l;
    i -- { l, m, j }; 
    j -- { m, n, k }; 
    k -- { n, r }; 
    l -- { o, m };
    m -- { o, p, n }; 
    n -- { q, r }; 
    o -- { s, p }; 
    p -- { s, t, q };
    q -- { t, r }; 
    r -- t; 
    s -- z; 
    t -- z;
};
\draw (h) to[bend left=40] (o);
\end{tikzpicture}
\end{document}

在此处输入图片描述

在普通土拨鼠眼中,这已经接近预期的结果了。

此外,如果我将另一个连接“移出图表”,\draw (k) -- (r);这将使我

\documentclass[tikz]{standalone}
\usetikzlibrary{graphs,graphdrawing}
\usetikzlibrary{shapes}
\usegdlibrary{layered}
\begin{document}
\begin{tikzpicture}
\graph [layered layout,
    nodes={ellipse, minimum width=25pt, draw},
    % https://tex.stackexchange.com/q/390417/rotate-tikz-layered-layout
    grow'=right, components go down left aligned
    ] {
    { [same layer] a }; %<- added
    { [same layer] b, c, d };
    { [same layer] e, f, g };
    { [same layer] h, i, j, k };
    { [same layer] l, m, n };
    { [same layer] o, p, q, r };
    { [same layer] s, t };
    a -- { b, c, d }; 
    b -- { c, e };
    c -- { e, f };
    d -- { f, g }; 
    e -- h; 
    f -- { h, i, j, g };
    g -- k; 
    h -- l;
    i -- { l, m, j }; 
    j -- { m, n, k }; 
    k -- { n }; 
    l -- { o, m };
    m -- { o, p, n }; 
    n -- { q, r }; 
    o -- { s, p }; 
    p -- { s, t, q };
    q -- { t, r }; 
    r -- t; 
    s -- z; 
    t -- z;
};
\draw (h) to[bend left=40] (o);
\draw (k) -- (r);
\end{tikzpicture}
\end{document}

在此处输入图片描述

这可以说更接近预期结果。

相关内容