我试图用 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
,我向下移动了g
和f
。我还必须向上调整m
和并向下l
弯曲边缘h--o
。
如果没有这些修改,图表看起来如下
尤其是边缘,h--o
完全具有误导性。
是否有人知道如何重新创建 graphviz 结果,即将分层图水平定位(与默认值相反)并避免进行大量手动调整?
更新
放置a
在已经固定的轻推的自己的层上a
,f
并且g
:
{ [same layer] a };
剩下的问题显然是交叉最小化算法,它不知道向上移动并将扭结添加到另一个方向的“简单”解决m
方案l
:
注意:marmot 的回答建议手动添加连接两个不同层的节点的边,这些节点之间至少有一个附加层。这也许也可以作为其他图表的经验法则。
答案1
我不知道这是否有帮助,但如果我
- 删除所有
nudge
s, - 创建一个图层
a
, - 更改
grow=right
为grow'=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}
这可以说更接近预期结果。