Tikz 强制节点位于分层图中的特定层中

Tikz 强制节点位于分层图中的特定层中

我正在尝试使用分层图布局来生成有向无环图,其中所有节点都划分为层。以下代码产生了近乎完美的结果。

\RequirePackage{luatex85}
\documentclass{article}

\usepackage{graphicx}
\usepackage{subcaption}
\usepackage{a4wide}

\usepackage{tikz}
\usetikzlibrary{graphs,graphdrawing,quotes}
\usegdlibrary{layered}

\begin{document}
\begin{figure}
\centering
\begin{subfigure}[]{0.3\textwidth}
\centering
\begin{tikzpicture}[rounded corners]
\graph [layered layout,
edge quotes={fill=white,inner sep=1pt,font=\scriptsize},
nodes={circle,draw,inner sep=.2,outer sep=0, minimum size=.45cm},
level sep=1.5cm, %vertical distance between layers
sibling distance=2cm, %distance between nodes of the same connected component in the same layer
component sep=0cm %distance between connected components
]
{
{
[nodes={draw=none,text opacity=0}, edge={draw=none}]
l0 ->["$v0$"] l1 ->["$v1$"] l2 ->["$v2$"] l3 ->["$v4$"] l4 ->["$v5$"] l5;
},
{[edge={pos=.45}]
r/"$r$";
t/"$t$";
2/"$u_{2}$";
3/"$u_{3}$";
4/"$u_{4}$";
5/"$u_{5}$";
6/"$u_{6}$";
7/"$u_{7}$";
8/"$u_{8}$";
9/"$u_{9}$";
10/"$u_{10}$";
11/"$u_{11}$";
12/"$u_{12}$";
r ->["$0$",bend left=0] 2,
r ->["$1$",bend left=0] 3,
2 ->["$0$",bend left=0] 4,
2 ->["$1$",bend left=0] 5,
3 ->["$0$",bend left=0] 6,
3 ->["$1$",bend left=0] 4,
4 ->["$0$",bend left=0] 7,
4 ->["$1$",bend left=0] 8,
5 ->["$0$",bend left=0] 9,
5 ->["$1$",bend left=0] 7,
6 ->["$0$",bend left=0] 8,
6 ->["$1$",bend left=0] 9,
7 ->["$0$",bend left=0] 10,
7 ->["$1$",bend left=0] 11,
8 ->["$0$",bend left=0] 12,
8 ->["$1$",bend left=0] 10,
9 ->["$0$",bend left=0] 11,
9 ->["$1$",bend left=0] 12,
10 ->["$1$",bend left=-80] t,
10 ->["$4$",bend left=-60] t,
10 ->["$7$",bend left=-40] t,
10 ->["$10$",bend left=-20] t,
10 ->["$13$",bend left=0] t,
10 ->["$16$",bend left=20] t,
10 ->["$19$",bend left=40] t,
10 ->["$22$",bend left=60] t,
10 ->["$25$",bend left=80] t,
11 ->["$0$",bend left=-80] t,
11 ->["$3$",bend left=-60] t,
11 ->["$6$",bend left=-40] t,
11 ->["$9$",bend left=-20] t,
11 ->["$12$",bend left=0] t,
11 ->["$15$",bend left=20] t,
11 ->["$18$",bend left=40] t,
11 ->["$21$",bend left=60] t,
11 ->["$24$",bend left=80] t,
12 ->["$2$",bend left=-80] t,
12 ->["$5$",bend left=-60] t,
12 ->["$8$",bend left=-40] t,
12 ->["$11$",bend left=-20] t,
12 ->["$14$",bend left=0] t,
12 ->["$17$",bend left=20] t,
12 ->["$20$",bend left=40] t,
12 ->["$23$",bend left=60] t,
}
};
\begin{scope}[node distance=.4cm,font=\scriptsize]
\node[right of=r]{$0$};
\node[right of=t]{$1$};
\node[right of=2]{$0$};
\node[right of=3]{$2$};
\node[right of=4]{$0$};
\node[right of=5]{$1$};
\node[right of=6]{$2$};
\node[right of=7]{$0$};
\node[right of=8]{$2$};
\node[right of=9]{$1$};
\node[right of=10]{$0$};
\node[right of=11]{$1$};
\node[right of=12]{$2$};
\end{scope}
\end{tikzpicture}
\caption{c0(mod5)}
\end{subfigure}
\caption{test 0}
\end{figure}
\end{document}

在此处输入图片描述

请注意,出于某种奇怪的原因,顶点 t 与 u7、u8、u9 位于同一层,导致大量边缘重叠。顶点 t 应该放置在新层中,位于包含顶点 u10、u11、u12 的层下方。有什么方法可以强制执行此操作吗?

根据 Tikz手动的第31章,分层布局算法执行以下步骤:

  1. 循环删除。
  2. 层分配(有时称为节点排名)。
  3. 交叉最小化(也称为节点排序)。
  4. 节点定位(或坐标分配)。
  5. 边缘路由。

从技术上讲,我不需要步骤 1、2、5,因为我已经知道每个节点的层,并且我的图保证不包含循环。但是,我确实需要步骤 3 来确定每层中节点的顺序以尽量减少交叉,以及步骤 4 来确定坐标。

相关内容