Tikz-Baumabstand in einer Unterfigur

Tikz-Baumabstand in einer Unterfigur

Ich habe versucht, Entscheidungsbäume in einem Subfigure-Format wie unten zu erstellen, aber egal, welche Art von Abstand ich versuche, es gibt immer an der einen oder anderen Stelle überlappende Knoten. Im folgenden Beispiel habe ich zwei Kopien desselben Baums als Beispiel. Wie kann ich dies mit dem Tikz-Paket beheben? Gibt es außerdem einen Ratschlag, den ich bekommen kann, um mit dem Tikz-Paket auch etwas größere Bäume zu zeichnen? Es ist sehr frustrierend, weil ich das Gefühl habe, dass ich an dem Punkt bin, an dem ich die Ebenen-/Geschwisterabstände einfach zufällig ändern muss, um zu versuchen, die Dinge zum Laufen zu bringen ...

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

Antwort1

Letztendlich gibt es eine Mindestbreite der Bäume, die sich aus dem Text innerhalb der Blattknoten (Endknoten) ergibt. Bei beiden Bäumen können Sie sehen, dass das Platzieren aller x_n <- 1End-to-End-Ergebnisse bereits mehr als die Hälfte der Textbreite einnimmt. Wenn Sie diese Bäume nebeneinander platzieren möchten, haben Sie entweder überlappende Bäume (wie derzeit) oder überlappende Knoten. Keine dieser Optionen ist elegant ...

Diese Mindestbreite kann leicht angepasst werden, indem für niedrigere Ebenen eine kleinere Schriftgröße gewählt wird, sodass sie weniger Platz einnehmen, wenn sie nebeneinander platziert werden. Dies kann mit dem erreicht werden level n/.style={font=\footnotesize}.

Sie erwähnen auch, dass Sie die Geschwisterabstände immer wieder durch Ausprobieren anpassen müssen. Der Grund dafür ist, dass der Standardalgorithmus für die Baumkonstruktion in TikZ hat sehr wenig Voraussicht. Es erkennt, dass die nächste Ebene nKnoten hat und platziert sie entsprechend der Geschwisterdistanz, hat aber keine Ahnung, ob diese Knoten viele weitere Knoten darunter haben, wodurch die effektive „Breite“ des Knotens größer wird.

Dies kann durch die Verwendung der graph drawingBibliothek von Ti behoben werdenkZ. Es bietet viele weitere Algorithmen zum automatischen Platzieren von Knoten, was das Zeichnen erleichtertGrafiken viel viel einfacher. Ich habe ein Beispiel beigefügt, das zeigt, wie man die Graphenzeichnungsbibliothek verwendet:

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

und die Ausgabe:

Ausgabe

verwandte Informationen