하위 그림의 Tikz 트리 간격

하위 그림의 Tikz 트리 간격

아래와 같이 하위 그림 형식으로 의사 결정 트리를 만들려고 노력했지만 어떤 간격을 두든 상관없이 항상 어떤 지점 또는 다른 지점에서 겹치는 노드가 있습니다. 아래 예에는 동일한 트리의 복사본 두 개가 있습니다. 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}

출력은 다음과 같습니다.

산출

관련 정보