![Einen Entscheidungsbaum in Tikz replizieren](https://rvso.com/image/420052/Einen%20Entscheidungsbaum%20in%20Tikz%20replizieren.png)
Ich versuche, einige Änderungen an einem Entscheidungsbaummodell vorzunehmen, das tikz
ausHier. Der Code, den ich verwende, ist genau der gleiche wie in diesem Beitrag, mit der einzigen Änderung in\documentclass[]{article}
Code:
\documentclass[]{article}
\usepackage{forest}
\usetikzlibrary{fit,positioning}
\tikzset{
font=\Large\sffamily\bfseries,
red arrow/.style={
midway,red,sloped,fill, minimum height=3cm, single arrow, single arrow head extend=.5cm, single arrow head indent=.25cm,xscale=0.3,yscale=0.15,
allow upside down
},
black arrow/.style 2 args={-stealth, shorten >=#1, shorten <=#2},
black arrow/.default={1mm}{1mm},
tree box/.style={draw, rounded corners, inner sep=1em},
node box/.style={white, draw=black, text=black, rectangle, rounded corners},
}
\begin{document}
\begin{forest}
for tree={l sep=3em, s sep=3em, anchor=center, inner sep=0.7em, fill=blue!50, circle, where level=2{no edge}{}}
[
Training Data, node box
[sample and feature bagging, node box, alias=bagging, above=4em
[,red!70,alias=a1[[,alias=a2][]][,red!70,edge label={node[above=1ex,red arrow]{}}[[][]][,red!70,edge label={node[above=1ex,red arrow]{}}[,red!70,edge label={node[below=1ex,red arrow]{}}][,alias=a3]]]]
[,red!70,alias=b1[,red!70,edge label={node[below=1ex,red arrow]{}}[[,alias=b2][]][,red!70,edge label={node[above=1ex,red arrow]{}}]][[][[][,alias=b3]]]]
[~~$\dots$~,scale=2,no edge,fill=none,yshift=-4em]
[,red!70,alias=c1[[,alias=c2][]][,red!70,edge label={node[above=1ex,red arrow]{}}[,red!70,edge label={node[above=1ex,red arrow]{}}[,alias=c3][,red!70,edge label={node[above=1ex,red arrow]{}}]][,alias=c4]]]]
]
\node[tree box, fit=(a1)(a2)(a3)](t1){};
\node[tree box, fit=(b1)(b2)(b3)](t2){};
\node[tree box, fit=(c1)(c2)(c3)(c4)](tn){};
\node[below right=0.5em, inner sep=0pt] at (t1.north west) {Tree 1};
\node[below right=0.5em, inner sep=0pt] at (t2.north west) {Tree 2};
\node[below right=0.5em, inner sep=0pt] at (tn.north west) {Tree $n$};
\path (t1.south west)--(tn.south east) node[midway,below=4em, node box] (mean) {mean in regression or majority vote in classification};
\node[below=3em of mean, node box] (pred) {prediction};
\draw[black arrow={5mm}{4mm}] (bagging) -- (t1.north);
\draw[black arrow] (bagging) -- (t2.north);
\draw[black arrow={5mm}{4mm}] (bagging) -- (tn.north);
\draw[black arrow={5mm}{5mm}] (t1.south) -- (mean);
\draw[black arrow] (t2.south) -- (mean);
\draw[black arrow={5mm}{5mm}] (tn.south) -- (mean);
\draw[black arrow] (mean) -- (pred);
\end{forest}
\end{document}
Ich habe versucht, ein paar Dinge zu tun:
- Passen Sie das
tikz
Diagramm in ein\documentclass[]{article}
statt in ein\documentclass[tikz]{standalone}
- Ich habe versucht, die Farben so zu ändern, dass sie zum folgenden Baum passen
Dabei sind die Endknoten grün und rot gefärbt und alle anderen Knoten haben die gleiche Farbe, aber ich scheine diesen Teil nicht herauszufinden (derzeit sind die Bäume im Code rot, wenn die Pfeile rot sind. Ich würde die Pfeile gerne beibehalten, aber einfach alle Farben gleich machen – abgesehen von den Endknoten).
- Ich kann das
circle
„zu“ ändernrectangle
, indem ich die folgende Zeile modifizierefor tree={l sep=3em, s sep=3em, anchor=center, inner sep=0.7em, fill=blue!50, rectangle, where level=2{no edge}{}}
, aber es stellt sich als Quadrat heraus.
BEARBEITEN:
Antwort1
Nun, es ist zu breit, also müssen Sie es schmaler machen. Zum Beispiel indem Sie die reduzieren
s sep
.Die Farbe der Knoten und die Farbe der Pfeile sind nicht miteinander verbunden. Wenn ein Knoten rot ist, liegt das daran, dass Sie
,red!70
für diesen bestimmten Knoten etwas hinzugefügt haben. Sie müssen also einfach viele dieser,red!70
s entfernen.Breite und Höhe müssen Sie separat einstellen:
inner sep=0, minimum width=1em, minimum height=0.5em,
Nein inner sep
, es gibt also keine Auffüllung. Setzen Sie dann minimum width
/ height
auf geeignete Werte. Sie können diese ändern.
Ich habe auch s sep
den sample and feature bagging,
Knoten eingefügt, um die Teilbäume etwas weiter auseinander zu setzen, und ich habe zwei phantom
Knoten hinzugefügt, um mehr Platz zwischen dem zweiten und dritten zu schaffen. Und ich habe den letzteren hinzugefügt , indem ich einen Knoten in der Mitte zwischen und \dots
platziert habe .t2
tn
Ich würde den mean in regression..
Knoten wahrscheinlich direkt darunter setzen t2
, aber das überlasse ich Ihnen.
Der Rahmen in diesem Screenshot wird vom showframe
Paket erstellt und gibt die Breite des Textblocks an.
\documentclass[]{article}
\usepackage{
forest,
% showframe
}
\usetikzlibrary{fit,positioning}
\tikzset{
font=\large\sffamily\bfseries,
red arrow/.style={
midway,red,sloped,fill, minimum height=3cm, single arrow, single arrow head extend=.5cm, single arrow head indent=.25cm,xscale=0.3,yscale=0.15,
allow upside down
},
black arrow/.style 2 args={-stealth, shorten >=#1, shorten <=#2},
black arrow/.default={1mm}{1mm},
tree box/.style={draw, rounded corners, inner sep=1em},
node box/.style={white, draw=black, text=black, rectangle, rounded corners},
}
\begin{document}
\begin{center}
\begin{forest}
for tree={
l sep=2em,
s sep=2mm,
anchor=center,
inner sep=0,
minimum width=1em,
minimum height=0.5em,
fill=blue!50,
rectangle,
where level=2{no edge}{}}
[
Training Data, node box
[sample and feature bagging, node box, alias=bagging, above=4em,s sep=1.1cm
[,alias=a1[[,alias=a2][]][,edge label={node[above=1ex,red arrow]{}}[[][]]
[,edge label={node[above=1ex,red arrow]{}}[,red!70,edge label={node[below=1ex,red arrow]{}}][,alias=a3]]]]
[,alias=b1[,edge label={node[below=1ex,red arrow]{}}[[,alias=b2][]][,red!70,edge label={node[above=1ex,red arrow]{}}]][[][[][,alias=b3]]]]
[,phantom]
[,phantom]
[,alias=c1[[,alias=c2][]][,edge label={node[above=1ex,red arrow]{}}[,edge label={node[above=1ex,red arrow]{}}[,alias=c3][,red!70,edge label={node[above=1ex,red arrow]{}}]][,alias=c4]]]]
]
\node[tree box, fit=(a1)(a2)(a3)](t1){};
\node[tree box, fit=(b1)(b2)(b3)](t2){};
\node[tree box, fit=(c1)(c2)(c3)(c4)](tn){};
\begin{scope}[every node/.append style={below right=0.5em, inner sep=0pt, font=\normalsize\sffamily\bfseries}]
\node at (t1.north west) {Tree 1};
\node at (t2.north west) {Tree 2};
\node at (tn.north west) {Tree $n$};
\end{scope}
\path (t1.south west)--(tn.south east) node[midway,below=4em, node box] (mean) {mean in regression or majority vote in classification};
\node[below=3em of mean, node box] (pred) {prediction};
\draw[black arrow={5mm}{4mm}] (bagging) -- (t1.north);
\draw[black arrow] (bagging) -- (t2.north);
\draw[black arrow={5mm}{4mm}] (bagging) -- (tn.north);
\draw[black arrow={5mm}{5mm}] (t1.south) -- (mean);
\draw[black arrow] (t2.south) -- (mean);
\draw[black arrow={5mm}{5mm}] (tn.south) -- (mean);
\draw[black arrow] (mean) -- (pred);
\path (t2) -- node {\dots} (tn); % <-- new node
\end{forest}
\end{center}
\end{document}