我想绘制一个由圆形节点组成的树形图,其中三个子部分由一条 t 线分隔(见下面的示例)。我不想手动分离每个树节点,而是只指定节点的样式,并附带至少三个参数(圆形节点图内的字段)。我已经通过将以下内容放入来实现以下效果:此 stackexchange 圆圈节点与 t 线示例变成一种风格:
\tikzset{%
sectors/.style n args={5}{%
circle,
draw,
minimum width=#4,
append after command={
\pgfextra{
\draw (\tikzlastnode.center) -- (\tikzlastnode.south) ;
\draw (\tikzlastnode.west) -- (\tikzlastnode.east) ;
\path (\tikzlastnode.center) -- node[#5] {#1} (\tikzlastnode.north);
\path (\tikzlastnode.center) -- node[#5] {#2} (\tikzlastnode.south west);
\path (\tikzlastnode.center) -- node[#5] {#3} (\tikzlastnode.south east);
}
}
}
}
只要只有一个根节点,这种方法就很好。但是,每当我想绘制子节点时,tikz 就会编译失败,提示“错误:没有已知的形状名称。[...]”。因此,以下方法不起作用。
\begin{tikzpicture}[]
\node[sectors={0}{1}{1}{1.5cm}{}]{}%
child{
node [sectors={1}{2}{3}{1.5cm}{font=\bfseries}]{}
};%
\end{tikzpicture}
我已经注意到了在树结构中使用 tex 宏但我无法通过那里给出的答案找到解决方案。我没有指定简单的 tex-macro,而是指定了参数化样式。也许在底层这类似,但我不是 tikz 方面的专业人士,因此无法将解决方案应用于这种情况。
任何帮助,将不胜感激。
这里您可以看到我想要实现的树结构的轮廓:
答案1
append after command
使用与树用于连接节点的类似方法来保存节点的名称。为此,我借用了 alabel
或 a中的大部分代码pin
并将其应用于您的示例中。我在这里使用edge
s,因为对于您的\pgfextra
示例,您还需要额外的\pgfinterruptpath
。
不幸的是,这两种实现都没有从节点继承样式。path picture
如果我没记错的话,它确实继承了样式,但与变换结合使用时非常不切实际,而且您无法使用节点的锚点。
为了获得最佳体验,最好将其作为单独的形状来实现(至少是圆圈内的线条)。
代码
\documentclass[tikz]{standalone}
\makeatletter
\tikzset{
sectors/.style n args={5}{
shape=circle, draw, minimum width={#4},
append after command={%
\bgroup
[current point is local = true]
\pgfextra{\let\tikz@save@last@fig@name=\tikz@last@fig@name}
{[-,shorten >=+.5\pgflinewidth, shorten <=+.5\pgflinewidth]
(\tikzlastnode.west) edge (\tikzlastnode.east)
(\tikzlastnode.center) edge (\tikzlastnode.south)
[every edge/.style=] edge node[#5] {#1} (\tikzlastnode.north)
edge node[#5] {#2} (\tikzlastnode.south west)
edge node[#5] {#3} (\tikzlastnode.south east)
}
\pgfextra{\global\let\tikz@last@fig@name=\tikz@save@last@fig@name}
\egroup}}}
\makeatother
\begin{document}
\begin{tikzpicture}
\node[sectors={0}{1}{1}{1.0cm}{}] {}%
child{
node [sectors={1}{2}{3}{1.0cm}{font=\bfseries}] {}
};
\end{tikzpicture}
\end{document}