![Replicando un árbol de decisión en tikz](https://rvso.com/image/420052/Replicando%20un%20%C3%A1rbol%20de%20decisi%C3%B3n%20en%20tikz.png)
Estoy intentando hacer algunas modificaciones a un modelo de árbol de decisión tikz
tomado deaquí. El código que estoy usando es exactamente el mismo que el de esa publicación con el único cambio en\documentclass[]{article}
Código:
\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}
He estado intentando hacer algunas cosas:
- Haga que el
tikz
diagrama encaje dentro de a\documentclass[]{article}
en lugar de a\documentclass[tikz]{standalone}
- He estado intentando cambiar los colores para que coincidan con el siguiente árbol.
Donde los nodos terminales están coloreados en verde y rojo y todos los demás nodos son del mismo color pero parece que no puedo entender esta parte (actualmente los árboles en el código son rojos cuando las flechas son rojas. Me gustaría mantener las flechas pero simplemente haga que todos los colores sean iguales, excepto los nodos terminales).
- Puedo cambiar el
circle
arectangle
modificando la siguiente líneafor tree={l sep=3em, s sep=3em, anchor=center, inner sep=0.7em, fill=blue!50, rectangle, where level=2{no edge}{}}
pero resulta ser un cuadrado.
EDITAR:
Respuesta1
Bueno, es demasiado ancho, así que necesitas hacerlo más estrecho. Por ejemplo, reduciendo el
s sep
.El color de los nodos y el color de las flechas no están conectados, si un nodo es rojo es porque lo has agregado
,red!70
para ese nodo específico. Así que sólo necesitas eliminar muchos de esos,red!70
correos electrónicos.Debe establecer el ancho y el alto por separado:
inner sep=0, minimum width=1em, minimum height=0.5em,
No inner sep
, por lo que no hay relleno, luego establezca minimum width
/ height
en valores adecuados. Es posible que desee modificarlos.
También configuré s sep
el sample and feature bagging,
nodo para espaciar un poco más los subárboles y agregué dos phantom
nodos para obtener espacio adicional entre el segundo y el tercero. Y agregué lo \dots
último, colocando un nodo a medio camino entre t2
y tn
.
Probablemente configuraría el mean in regression..
nodo directamente debajo t2
, pero dejaré que tú decidas.
El marco en esta captura de pantalla está creado por el showframe
paquete e indica el ancho del bloque de texto.
\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}