![绘制树形图](https://linux22.com/image/475029/%E7%BB%98%E5%88%B6%E6%A0%91%E5%BD%A2%E5%9B%BE.png)
我正在尝试学习绘制树形图。我对我所绘制的图表类型特别感兴趣。
以下是我目前编写的代码:
\documentclass{article}
\usepackage{tikz}
\usepackage[linguistics]{forest}
\begin{document}
\begin{figure}
\centering
\begin{tikzpicture}
\coordinate
child [level distance=30mm]
child [level distance=15mm]{
{child [level distance=30mm]
{child [level distance=15mm]
child [level distance=30mm]}
child [level distance=15mm]}
};
\begin{scope}[shift={(3,-3)}]
\node (y1) {\textit{}};
\node (y0)[right of=y1] {\textit{}};
\path [->,auto, thick](y1) edge [] node [above]{$\chi_0$} (y0);
\end{scope}
\begin{scope}[shift={(6,0)}]
\coordinate
child [level distance=30mm]
child [level distance=15mm]{
{child [level distance=30mm]
{child [level distance=15mm]
child [level distance=30mm]}
child [level distance=15mm]}
};
\end{scope}
\end{tikzpicture}
\caption{.}
\end{figure}
\end{document}
我遇到的问题有3个:
- 子边与父边不对齐。
2)无法向同一个图形添加第二棵树。
3)无法添加箭头并标记。
如果有人能帮助我解答问题我将非常感激。
谢谢
答案1
我会使用 Forest,尽管这很大程度上取决于个人喜好。但使用一些特定于树的包或其他包将使事情变得容易得多。以下nice tree
为基本样式定义了一种样式。对于您想要的两棵树的组合,我们定义了double nice trees
一个基本上是nice tree
根节点phantom
和两个子树之间的空间,供您放置箭头或其他东西。
nice tree/.style={%
我们单独定义它,以便它可以轻松应用于单棵树,而不仅限于我们想要一对的情况。
before typesetting nodes={%
我们延迟这一过程,以便在应用样式时节点就存在。
for tree={%
然后我们将以下内容应用于当前tree
,即当前节点及其后代。
circle,
fill,
inner sep=1.5pt,
做我们的点。
parent anchor=center,
child anchor=center,
将边缘对准点的中心,以避免出现上方和下方奇怪的扭曲。
calign=fixed edge angles,
我们希望父母和孩子的边缘保持恒定的角度。
},
},
},
double nice trees
设置一个具有phantom
根的树组(2+棵树)并应用于nice tree
的phantom
子项。
double nice trees/.style={%
phantom,
s sep'+=50pt,
for children={nice tree},
},
}
为了像草图中那样对齐点,我们使用tier=<name>
。我们使用四个命名层(A
、B
和)来确保两棵树内和两棵树之间的正确对齐C
。D
我们用来tikz+={}
在两者之间添加箭头。
完整代码:
\documentclass[border=5pt,tikz]{standalone}
% ateb: https://tex.stackexchange.com/a/713845/
\usepackage[linguistics]{forest}
\usetikzlibrary{arrows.meta}
\forestset{%
nice tree/.style={%
before typesetting nodes={%
for tree={%
circle,
fill,
inner sep=1.5pt,
parent anchor=center,
child anchor=center,
calign=fixed edge angles,
},
},
},
double nice trees/.style={%
phantom,
s sep'+=50pt,
for children={nice tree},
},
}
\begin{document}
\begin{forest}
double nice trees,
tikz+={\draw [-Latex,thick,shorten >=15pt,shorten <=15pt] (!r122 |- !r211) -- node [above,midway] {$\chi_0$} (!r211); },
[
[
[,tier=A]
[
[,tier=B
[, tier=C
[,phantom,tier=D]
]
[,tier=D]
]
[,tier=A
[,phantom,tier=B]
]
]
]
[
[
[,tier=B]
[,tier=A]
]
[,tier=A
[,tier=C]
[,tier=B
[,phantom,tier=C]
]
]
]
]
\end{forest}
\end{document}
Okular/KDE 中的一个错误意味着我的图像目前质量很差,所以即使输出正常,下面的内容看起来也会很模糊。
您可以命名节点,而不是使用坐标,例如(!r122)
如果愿意的话。!r122
只是表示如果您按照路径到达的节点根-第一个孩子-第二个孩子-第二个孩子,但name=fred
可能会更容易。
答案2
也许你使用forest
以下包提供服务:
\documentclass{article}
\usepackage{tikz}
\usepackage{forest}
\newcommand{\dotikz}{\tikz{\fill (0,0) circle (2pt);}}
\begin{document}
\begin{figure}
\centering
\begin{minipage}{0.45\textwidth}
\begin{forest}
for tree={s sep=20pt} % horizontal separation between nodes
[\dotikz%first
[,phantom] % phantom node to add space
[\dotikz,l=2cm]
[\dotikz
[,phantom]
[\dotikz,l=2cm
[\dotikz]
[,phantom]
[\dotikz,l=2cm]
]
[\dotikz]
]
]
\end{forest}
\end{minipage}
\begin{tikzpicture}[overlay, remember picture]
\draw[-latex] (-2.5,0) -- (-.5,0) node[midway,below] {};
\end{tikzpicture}%
\begin{minipage}{0.45\textwidth}
\begin{forest}
for tree={s sep=20pt}
[\dotikz
[\dotikz
[,phantom]
[\dotikz,l=2cm]
[\dotikz]
]
[,phantom]
[\dotikz,l=2cm
[,phantom]
[\dotikz,l=2cm]
[\dotikz]
]
]
\end{forest}
\end{minipage}
\caption{Forest}
\end{figure}
\end{document}