Espaciado de árboles Tikz en una subfigura

Espaciado de árboles Tikz en una subfigura

He estado intentando crear árboles de decisión en un formato de subfigura como se muestra a continuación, pero no importa qué tipo de espaciado intente, siempre hay nodos superpuestos en algún momento u otro. En el siguiente ejemplo, tengo dos copias del mismo árbol como ejemplo. ¿Cómo puedo solucionar este problema usando el paquete tikz? Además, ¿hay algún consejo que pueda darme para dibujar árboles un poco más grandes usando el paquete tikz? Es muy frustrante, porque siento que estoy a punto de cambiar el nivel/las distancias entre hermanos al azar para intentar que las cosas funcionen...

\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}

Respuesta1

En última instancia, hay un ancho mínimo de los árboles que surge del texto dentro de los nodos de hoja (finales). Para ambos árboles, puede ver que colocar todos los x_n <- 1resultados de principio a fin ya ocupa más de la mitad del ancho del texto. Si desea forzar que esos árboles estén uno al lado del otro, tendrá árboles superpuestos (como los tiene actualmente) o nodos superpuestos. Ninguna de las opciones es elegante...

Este ancho mínimo se puede ajustar ligeramente teniendo un tamaño de fuente más pequeño para los niveles inferiores, de modo que ocupen menos espacio cuando se coloquen uno al lado del otro. Esto se puede lograr con el level n/.style={font=\footnotesize}.

También mencionas que sigues teniendo que usar prueba y error para ajustar las distancias entre hermanos. La razón es que el algoritmo de construcción de árboles estándar en TikZ tiene muy poca previsión. Ve que el siguiente nivel tiene nnodos y los coloca de acuerdo con la distancia entre hermanos, pero no tiene idea de si estos nodos tienen muchos más nodos debajo de ellos, lo que hace que el "ancho" efectivo del nodo sea mayor.

Esto se puede solucionar usando la graph drawingbiblioteca de TikZ. Ofrece muchos más algoritmos para colocar nodos automáticamente, lo que facilita el dibujo.graficos mucho mucho más simple. He incluido un ejemplo que muestra cómo usar la biblioteca de dibujo de gráficos:

\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}

y la salida:

producción

información relacionada