我有一个脚本,它接受一些输入数据并输出 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}