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 <- 1
End-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 n
Knoten 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 drawing
Bibliothek 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: