아래와 같이 하위 그림 형식으로 의사 결정 트리를 만들려고 노력했지만 어떤 간격을 두든 상관없이 항상 어떤 지점 또는 다른 지점에서 겹치는 노드가 있습니다. 아래 예에는 동일한 트리의 복사본 두 개가 있습니다. tikz 패키지를 사용하여 이 문제를 어떻게 해결할 수 있나요? 또한 tikz 패키지를 사용하여 약간 더 큰 나무를 그리는 데 도움이 될 수 있는 조언이 있습니까? 작업을 수행하기 위해 레벨/형제 거리를 무작위로 변경하는 시점에 있는 것 같아서 매우 실망스럽습니다...
\documentclass{book}
\usepackage{tikz}
\usepackage{amsmath,amssymb,amstext,amsthm}
\usepackage{subcaption}
\begin{document}
\begin{figure}
\centering
\begin{subfigure}[h]{0.475\textwidth}
\centering
\begin{tikzpicture}[scale=0.6, level distance=25mm,
level 1/.style={sibling distance=80mm},
level 2/.style={sibling distance=50mm},
level 3/.style={sibling distance=30mm}]
\node[circle, draw]{$x\smash{_1}$}
child{node[circle, draw]{$x\smash{_2}$}
child{node[circle, draw]{$x\smash{_4}$}
child{node[rectangle, draw]{$x\smash{_1} \gets 1$}}
child{node[rectangle, draw]{$x\smash{_2} \gets 1$}}
}
child{node[circle, draw]{$x\smash{_4}$}
child{node[rectangle, draw]{$x\smash{_1} \gets 1$}}
child{node[rectangle, draw]{$x\smash{_4} \gets 0$}}
}
}
child{node[circle, draw]{$x\smash{_3}$}
child{node[circle, draw]{$x\smash{_2}$}
child{node[rectangle, draw]{$\begin{aligned} x\smash{_1} &\gets 0 \\ x\smash{_3} &\gets 1 \end{aligned}$}}
child{node[rectangle, draw]{$\begin{aligned} x\smash{_1} &\gets 0 \\ x\smash{_2} &\gets 0 \end{aligned}$}}
}
child{node[circle, draw]{$x\smash{_4}$}
child{node[rectangle, draw]{$x\smash{_4} \gets 1$}}
child{node[rectangle, draw]{$x\smash{_3} \gets 0$}}
}
}
;
\end{tikzpicture}
\caption{A Tree}
\end{subfigure}
\begin{subfigure}[h]{0.475\textwidth}
\centering
\begin{tikzpicture}[scale=0.6, level distance=25mm,
level 1/.style={sibling distance=80mm},
level 2/.style={sibling distance=50mm},
level 3/.style={sibling distance=30mm}]
\node[circle, draw]{$x\smash{_1}$}
child{node[circle, draw]{$x\smash{_2}$}
child{node[circle, draw]{$x\smash{_4}$}
child{node[rectangle, draw]{$x\smash{_1} \gets 1$}}
child{node[rectangle, draw]{$x\smash{_2} \gets 1$}}
}
child{node[circle, draw]{$x\smash{_4}$}
child{node[rectangle, draw]{$x\smash{_1} \gets 1$}}
child{node[rectangle, draw]{$x\smash{_4} \gets 0$}}
}
}
child{node[circle, draw]{$x\smash{_3}$}
child{node[circle, draw]{$x\smash{_2}$}
child{node[rectangle, draw]{$\begin{aligned} x\smash{_1} &\gets 0 \\ x\smash{_3} &\gets 1 \end{aligned}$}}
child{node[rectangle, draw]{$\begin{aligned} x\smash{_1} &\gets 0 \\ x\smash{_2} &\gets 0 \end{aligned}$}}
}
child{node[circle, draw]{$x\smash{_4}$}
child{node[rectangle, draw]{$x\smash{_4} \gets 1$}}
child{node[rectangle, draw]{$x\smash{_3} \gets 0$}}
}
}
;
\end{tikzpicture}
\caption{B Tree}
\end{subfigure}
\caption{Caption}
\label{datftt}
\end{figure}
\end{document}
답변1
궁극적으로 리프(끝) 노드 내부의 텍스트에서 발생하는 트리의 최소 너비가 있습니다. 두 트리 모두 x_n <- 1
종단 간 결과를 모두 배치하면 이미 텍스트 너비의 절반 이상을 차지한다는 것을 알 수 있습니다 . 해당 트리를 나란히 배치하려면 현재처럼 트리가 겹치거나 노드가 겹치게 됩니다. 어느 옵션도 우아하지 않습니다 ...
이 최소 너비는 낮은 수준의 글꼴 크기를 더 작게 하여 나란히 배치할 때 공간을 덜 차지하도록 약간 조정할 수 있습니다. 이는 level n/.style={font=\footnotesize}
.
또한 형제간 거리를 조정하면서 계속해서 시행착오를 거쳐야 한다고 언급하셨습니다. 그 이유는 Ti의 표준 트리 구성 알고리즘이케이Z는 통찰력이 거의 없습니다. 다음 레벨에 노드가 있는 것을 확인 n
하고 형제 거리에 따라 배치하지만, 이 노드 아래에 더 많은 노드가 있어서 노드의 유효 '너비'가 더 커지는지 여부는 알 수 없습니다.
graph drawing
이 문제는 Ti의 라이브러리를 사용하여 해결할 수 있습니다 .케이Z. 그림을 그리는 노드를 자동으로 배치하는 더 많은 알고리즘을 제공합니다.그래프
훨씬 더 간단합니다. 그래프 그리기 라이브러리를 사용하는 방법을 보여주는 예를 포함했습니다.
\documentclass{book}
\usepackage{tikz}
\usetikzlibrary{
graphs,
graphdrawing,
}
\usegdlibrary{trees}
\usepackage{amsmath,amssymb,amstext,amsthm}
\usepackage{subcaption}
\begin{document}
\begin{figure}
\centering
\begin{subfigure}[b]{\linewidth}
\centering
\tikz \graph [
tree layout,
nodes={
draw,
circle,
},
level 3/.style={
font=\small,
},
level 4/.style={
nodes={
rectangle,
font=\footnotesize,
}
}
] {
"\(x_{}\)"
-> {
"\(x_{1}\)"
-> {
"\(x_{11}\)"
-> {
"\(x_{111}\)",
"\(x_{112}\)"
},
"\(x_{12}\)"
-> {
"\(x_{121}\)",
"\(x_{122}\)"
}
},
"\(x_{2}\)"
-> {
"\(x_{21}\)"
-> {
"\(x_{211}\)",
"\(x_{212}\)"
},
"\(x_{22}\)"
-> {
"\(x_{221}\)",
"\(x_{222}\)"
}
}
}
};
\caption{Tree \(x\)}
\end{subfigure}
\begin{subfigure}[b]{\linewidth}
\centering
\tikz \graph [
tree layout,
nodes={
draw,
circle,
},
level 3/.style={
font=\small,
},
level 4/.style={
nodes={
rectangle,
font=\footnotesize,
}
}
] {
"\(y_{}\)"
-> {
"\(y_{1}\)"
-> {
"\(y_{11}\)"
-> {
"\(y_{111}\)",
"\(y_{112}\)"
},
"\(y_{12}\)"
-> {
"\(y_{121}\)",
"\(y_{122}\)"
}
},
"\(y_{2}\)"
-> {
"\(y_{21}\)"
-> {
"\(y_{211}\)",
"\(y_{212}\)"
},
"\(y_{22}\)"
-> {
"\(y_{221}\)",
"\(y_{222}\)"
}
}
}
};
\caption{Tree \(y\)}
\end{subfigure}
\caption{My awesome captions for trees!}
\label{fig:trees}
\end{figure}
\end{document}
출력은 다음과 같습니다.