![tikz에서 의사결정 트리 복제](https://rvso.com/image/420052/tikz%EC%97%90%EC%84%9C%20%EC%9D%98%EC%82%AC%EA%B2%B0%EC%A0%95%20%ED%8A%B8%EB%A6%AC%20%EB%B3%B5%EC%A0%9C.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}
나는 몇 가지 일을 하려고 노력해 왔습니다:
- 다이어그램을 a 대신
tikz
a 안에 맞추 세요 .\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
했습니다 . 그리고 와 사이 중간에 노드를 배치하여 나중에 추가했습니다 .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}