我正在尝试画一棵这样的树:
根有三个子节点,这两个节点中的每一个...前两层中的节点具有附加信息..
我搜索了类似的例子,但只能找到那些子代总是有相同数量子的树(例如这里:http://www.texample.net/tikz/examples/feature/trees/)。
我感谢你的帮助!
答案1
您可以使用positioning
库将节点彼此相对放置。例如\node[left=<dimen/factor> of <another node>] {}
。只需为树中的节点命名。要获取任意数量的子节点,只需添加或删除child{ ... }
。有关更多信息,请查看tikz 手册(尤其是“18 让树木生长”和“16.5.3 高级安置选项”)
更新谢谢奎伯比尔贝尔注意到基线对齐不正确。因此我按照建议使用了base left
和。base right
现在需要使用像(wAB.east |- AB)
获取水平线的坐标(使用X的坐标wAB.east
和是的坐标AB
)。
举个例子,你可以看看这棵树(我试图重新创建你的树)
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{trees}
\usetikzlibrary{positioning}
\usepackage[normalem]{ulem}
\begin{document}
\begin{tikzpicture}[level distance=1.5cm,
level 1/.style={sibling distance=4cm},
level 2/.style={sibling distance=2cm}]
\node (abc) {$ABC$} child { %node abc
node (AB) {AB} %node AB
child { node {$A\rightarrow BC$} }
child { node {$B\rightarrow AC$} }
} child {
node (AC) {AC} %node AC
child { node {$A\rightarrow BC$} }
child { node {$C\rightarrow AB$} }
} child {
node (A) {A} %node A
child { node {$B\rightarrow AC$} }
child { node {$C\rightarrow AB$} }
};
%relative to node AB
\node[base left=.5 of AB] (wAB) {\uwave{$A,b$}};
\draw (wAB.east |- AB) edge[<-] (AB);
\draw node[base right=.5 of AB] {$C$} edge[<-] (AB);
%relative to node AC
\node[base left=.5 of AC] (wAC) {\uwave{$A,C$}} ;
\draw (wAC.east |- AC) edge[<-] (AC);
\draw node[right=.5 of AC] {$B$} edge[<-] (AC);
%relative to node A
\draw node[base left=.5 of A] {$BC$} edge[<-] (A);
\node[base right=.5 of A] (wBC) {\uwave{$B,C$}};
\draw (wBC.west |- A) edge[<-] (A);
%relative to node abc
\node[base left=of abc] {$\uwave{\hspace{3ex}}=(k-1)-\mathrm{Itemsets}$} ;
\node[base right=.5 of abc] (wABACBC) {\uwave{$AB,AC,BC$}};
\draw (wABACBC.west |- abc) edge[<-] (abc);
\end{tikzpicture}
\end{document}
答案2
这也可以使用 来完成tikz-qtree
,这是一个采用编写树的包的语法qtree
并将其与 TikZ 相结合的包。使用此包及其语法,您可以为每个根设置任意数量的子项。
与 @someonr 的解决方案类似,此解决方案也使用positioning
库将附加信息放置在顶层,但第二层中的附加信息只是作为第二层根的一部分添加的。positioning
如果您愿意,也可以使用库和语法来执行此操作。您只需将树的第二层中的每个根声明为\node
,然后就可以将附加信息放置在该节点的相对位置。
\documentclass{article}
\usepackage{amsmath} % needed for \text command in math mode
\usepackage{tikz-qtree} % needed for the tree syntax
\usetikzlibrary{positioning} % needed for placing nodes relative to one another
\usepackage[normalem]{ulem} % needed for wavy underline; the `normalem` option preserves the usual treatment of \emph as italic; without it, `ulem` causes \emph to be rendered as underlined material
\begin{document}
\begin{tikzpicture}
\Tree
[.\node(ABC){ABC};
[.\uwave{A,B}$\leftarrow$AB$\rightarrow$C
[.A$\rightarrow$BC ]
[.B$\rightarrow$AC ]
]
[.\uwave{A,C}$\leftarrow$AC$\rightarrow$B
[.A$\rightarrow$BC ]
[.C$\rightarrow$AB ]
]
[.\uwave{B,C}$\leftarrow$BC$\rightarrow$A
[.B$\rightarrow$AC ]
[.C$\rightarrow$AB ]
]
]
\node [base right = of ABC] {\uwave{AB, AC, BC}};
\node [base left = of ABC] {$=(k-1) - \text{Itemsets}$};
\end{tikzpicture}
\end{document}