![tikz で決定木を複製する](https://rvso.com/image/420052/tikz%20%E3%81%A7%E6%B1%BA%E5%AE%9A%E6%9C%A8%E3%82%92%E8%A4%87%E8%A3%BD%E3%81%99%E3%82%8B.png)
tikz
私は、以下の決定木モデルにいくつかの変更を加えようとしています。ここ私が使用しているコードは、その投稿とまったく同じですが、\documentclass[]{article}
コード:
\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}
私はいくつかのことをやろうとしています:
- 図を ではなく
tikz
の中に収める\documentclass[]{article}
\documentclass[tikz]{standalone}
- 私は次の木に合わせて色を変えようとしています
ターミナル ノードは緑と赤に色付けされ、他のすべてのノードは同じ色になっていますが、この部分が理解できないようです (現在、矢印が赤い場合、コード内のツリーは赤になります。矢印はそのままにして、ターミナル ノードを除いてすべての色を同じにしたいと思います)。
- 次の行を変更することで
circle
を に変更できますが、正方形になります。rectangle
for tree={l sep=3em, s sep=3em, anchor=center, inner sep=0.7em, fill=blue!50, rectangle, where level=2{no edge}{}}
編集:
答え1
そうですね、広すぎるので、狭くする必要があります。たとえば、 を減らすなどです
s sep
。ノードの色と矢印の色は関連していません。ノードが赤の場合は、
,red!70
その特定のノードに追加されたためです。したがって、それらの多くを削除するだけで済みます,red!70
。幅と高さを別々に設定する必要があります。
inner sep=0, minimum width=1em, minimum height=0.5em,
いいえinner sep
、パディングがないので、minimum width
/ をheight
適切な値に設定します。 変更する必要がある場合があります。
また、サブツリーの間隔をもう少し広くするために ノードs sep
を設定し、2 番目と 3 番目の間に追加のスペースを確保するために 2 つのノードを追加しました。そして、との中間にノードを配置して、後者を追加しました。sample and feature bagging,
phantom
\dots
t2
tn
mean in regression..
おそらくノードを のすぐ下に設定すると思いますt2
が、それは皆さんの判断にお任せします。
このスクリーンショットのフレームはshowframe
パッケージによって作成され、テキスト ブロックの幅を示しています。
\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}