将 Tikz 节点图划分为行

将 Tikz 节点图划分为行

我有一个脚本,它接受一些输入数据并输出 tikz-code,该代码以节点图的形式创建此数据的可视化表示。使用示例数据的当前脚本的输出目前如下所示:

\documentclass{article}

\usepackage{tikz}

\begin{document}

    \begin{tikzpicture}[every node/.style={{inner sep=0.7em}}]
        \node at (6em, 0em) (L1N1) [anchor=north, text width=4em]{\begin{center}N1\end{center}};
        \node at (0em, -9em) (L2N1) [anchor=north, text width=4em]{\begin{center}N1\end{center}};
        \node at (6em, -9em) (L2N2) [anchor=north, text width=4em]{\begin{center}N2\end{center}};
        \node at (12em, -9em) (L2N3) [anchor=north, text width=4em]{\begin{center}N3\\L1\\L2\\L3\\L4\\L5\\L6 \end{center}};
        \node at (0em, -18em) (L3N1) [anchor=north, text width=4em]{\begin{center}N1\end{center}};
        \node at (12em, -18em) (L3N2) [anchor=north, text width=4em]{\begin{center}N2\end{center}};
        \node at (6em, -27em) (L4N1) [anchor=north, text width=4em]{\begin{center}N1\end{center}};
        \path [-] (L1N1) edge (6em, -7.0em);
        \path [-] (6em, -7.0em) edge (6em, -7.0em);
        \path [->] (6em, -7.0em) edge (L2N2);
        \path [-] (L2N1) edge (0em, -16.0em);
        \path [-] (0em, -16.0em) edge (0em, -16.0em);
        \path [-] (L2N2) edge (6em, -16.0em);
        \path [-] (6em, -16.0em) edge (12em, -16.0em);
        \path [-] (L2N3) edge (12em, -16.0em);
        \path [-] (12em, -16.0em) edge (12em, -16.0em);
        \path [->] (0em, -16.0em) edge (L3N1);
        \path [->] (12em, -16.0em) edge (L3N2);
        \path [->] (12em, -16.0em) edge (L3N2);
        \path [-] (L3N1) edge (0em, -25.0em);
        \path [-] (0em, -25.0em) edge (6em, -25.0em);
        \path [-] (L3N2) edge (12em, -25.0em);
        \path [-] (12em, -25.0em) edge (6em, -25.0em);
        \path [->] (6em, -25.0em) edge (L4N1);
        \path [->] (6em, -25.0em) edge (L4N1);
    \end{tikzpicture}

\end{document}

生成的图表如下所示:

图表示例

该图说明了我遇到的问题。从图中可以看出,我将其可视化为几行节点,不同行中的节点之间有连接。目前我的节点位置完全在脚本中计算,但我确实认为我需要放弃这种方式,因为我遇到一个问题,不知道节点的大小,第二行最右边的节点对于给定的坐标来说太高了,导致结果一团糟。

是否可以在 tikz 中自动计算每行的 Y 坐标(作为与前一行底部的偏移量)?我相信我可以使用“calc”tikzlibrary 来获取给定节点的最底部 Y 坐标,但我无法找到获取多个节点的最底部 Y 坐标的方法。有没有办法做到这一点,或者我应该采取其他方法来解决这个问题?

下面是我希望最终结果的粗略草图,其中第三条线根据第二条线节点的最低点进行偏移:

期望结果草图

我无法在外部生成图形的最终表示,因为我需要在某些节点的内容中放置页面引用。

感谢您的任何帮助!

答案1

编辑: 一些评论:

  • 在我的提议中,我遵循你的 MWE,这与期望的结果非常接近
  • 它们之间的主要区别在于使用节点的相对定位(通过使用positioning库)并添加了两个辅助坐标,用于节点连接和位置
  • 对于节点使用通用样式定义为every node
  • 箭头命令数量减少到仅显示在图像上(五)
\documentclass[tikz, margin=3mm]{standalone}
\usetikzlibrary{positioning}

\begin{document}
    \begin{tikzpicture}[
    node distance = 4mm and 12mm,
every node/.style = {minimum size=1.2em, align=center, outer sep=0pt},
                        ]
\node (L1N1)    {N1};
\node (L2N1)    [below  left=of L1N1]   {N1};
\node (L2N2)    [below=of L1N1]         {N2};
\node (L2N3)    [below right=of L1N1]   {N3\\L1\\L2\\L3\\L4\\L5\\L6 };
%
\coordinate[below=of L2N3] (aux1);
%
\node (L3N1)    [below=of L2N1 |- aux1] {N1};
\node (L3N2)    [below=of aux1]         {N2};
%
\coordinate[below=of L1N1 |- L3N1.south]    (aux2);
%
\node (L4N1)    [below=of aux2]   {N1};
%
\draw[->]   (L1N1) -- (L2N2);
\draw[->]   (L2N1) -- (L3N1);
\draw[->]   (L2N3) -- (L3N2);
%
\draw[->]   (aux2) -- (L4N1);
\draw       (L2N2) |- (aux1);
%
\draw       (L3N1) |- (aux2) -| (L3N2);
    \end{tikzpicture}
\end{document}

在此处输入图片描述

相关内容