我无法将树的第三级标签向下移动以防止重叠。有人能帮我吗?我尝试更改 yshift,但没有成功。
\begin{tikzpicture}[font=\footnotesize,edge from parent/.style={draw,thick}]
% Two node styles: solid and hollow
\tikzstyle{solid node}=[circle,draw,inner sep=1.2,fill=black];
\tikzstyle{hollow node}=[circle,draw,inner sep=1.2];
% Specify spacing for each level of the tree
\tikzstyle{level 1}=[level distance=15mm,sibling distance=40mm]
\tikzstyle{level 2}=[level distance=15mm,sibling distance=20mm]
\tikzstyle{level 3}=[level distance=15mm,sibling distance=15mm]
% The Tree
\node(0)[hollow node]{}
child{node[solid node]{}
child{node[solid node]{}
child{node[below, rotate=90]{$(6,6,6)$} edge from
parent node[left]{$A$}}
child{node[below, rotate=90]{$(-7,-6,-5)$} edge from parent node[right]{$R$}}
edge from parent node[above left]{$A$}
}
child{node[solid node]{}
child{node[below, rotate=90]{$(-7,-5,-6)$} edge from parent node(s)[left]{$A$}}
child{node[below, rotate=90]{$(-7,-6,-6)$} edge from parent node(t)[right]{$R$}}
edge from parent node[above right]{$R$}
}
edge from parent node[above left]{$G$}
}
child{node[solid node]{}
child{node[solid node]{}
child{node[below, rotate=90]{$(-7,-5,-5)$} edge from parent node(m)[left]{$A$}}
child{node[below, rotate=90]{$(-1,2,-1)$} edge from parent node(n)[right]{$R$}}
edge from parent node[above left]{$A$}
}
child{node[solid node]{}
child{node[below, rotate=90]{$(-1,-1,2)$} edge from parent node[left]{$A$}}
child{node[below, rotate=90]{$(-1,2,2)$} edge from parent node[right]{$R$}}
edge from parent node[above right]{$R$}
}
edge from parent node[above right]{$B$}
};
% movers
\draw[dashed,rounded corners=10]($(1) + (0,1)$)rectangle($(2) +(0,.5
)$);
\draw[dashed,rounded corners=10,minimum size=60mm]($(1) + (0,-1)$)rectangle($(2) +(0,-1
)$);
\node[above,yshift=2]at(0){{$Investor\;1$}};
\node[above,xshift=23mm, yshift=5mm]at(1){{$Investor\;3$}};
\node[above,xshift=23mm, yshift=-10mm]at(1){{$Investor\;2$}};
\end{tikzpicture}
答案1
这源于Torbjørn T. 的森林解决方案,经过修改以利用该包提供的一些特定功能。
定义几种样式并控制树的前言(树\begin{forest}
规范本身之后和之前的位)中树的外观,使我们能够非常简洁地指定树本身:
[
[
[
[{(6,6,6)}]
[{(-7,-6,-5)}]
]
[
[{(-7,-5,-6)}]
[{(-7,-6,-6)}]
]
]
[
[
[{(-7,-5,-5)}]
[{(-1,2,-1)}]
]
[
[{(-1,-1,2)}]
[{(-1,2,2)}]
]
]
]
math content
请注意,尽管丢失了 ,但由于 ,终端节点仍设置为数学模式。$...$
其余部分将根据节点的级别以及分支是左手还是右手自动处理。虚线部分使用fit
,就像 Torbjørn T. 的解决方案一样,但使用的是相对节点名称而不是名称,这样可以避免树的混乱。例如,!r11
表示根的第一个子节点的第一个子节点,而!rll
表示根的最后一个子节点的最后一个子节点。l sep
用于稍微增加级别之间的距离并s sep
增加兄弟节点之间的距离,终端节点除外。
% addaswyd o ateb Torbjørn T.: https://tex.stackexchange.com/a/344835/
\documentclass[border=10pt,tikz]{standalone}
\usepackage{forest}
\usetikzlibrary{fit}
\forestset{
/tikz/my branch label/.style={midway, font=\footnotesize, anchor=mid west},
/tikz/my investor label/.style={densely dashed, draw, rounded corners},
branch labels/.style n args=2{% position the edge labels for the children of the current node
!1.edge label={coordinate [label={[my branch label, anchor=mid east]{135+\forestoption{level}*15}:#1}] (a)},
!l.edge label={coordinate [label={[my branch label, anchor=mid west]{45-\forestoption{level}*15}:#2}] (a)},
}
}
\begin{document}
\begin{forest}
for tree={
l sep'+=20pt,
font=\footnotesize,
},
where n children=0{% for the terminal nodes i.e. no children
rotate=90,
math content,
anchor=parent,
child anchor=parent,
}{
circle,
draw,
inner sep=1.5pt,
s sep'+=5pt,
if level=0{% the root note
branch labels={G}{B},
label={[font=\footnotesize]above:Investor 1},
tikz+={
\node [my investor label] (i3) [fit=(!11) (!ll)] {};
\node [font=\footnotesize] at (i3) {Investor 3};
\node [my investor label] (i2) [fit=(!1) (!l)] {};
\node [font=\footnotesize] at (i2) {Investor 2};
},
}{
fill,
branch labels={A}{R},
}
},
[
[
[
[{(6,6,6)}]
[{(-7,-6,-5)}]
]
[
[{(-7,-5,-6)}]
[{(-7,-6,-6)}]
]
]
[
[
[{(-7,-5,-5)}]
[{(-1,2,-1)}]
]
[
[{(-1,-1,2)}]
[{(-1,2,2)}]
]
]
]
\end{forest}
\end{document}
答案2
您的代码似乎无法生成您发布的图像,但这里有一些东西可能会满足您的要求。如果我误解了什么,请发表评论。
首先要注意的是,末尾的元组是使用label
s 来设置节点的,而不是直接使用节点文本。这样做是为了让文本直接位于行尾下方。
注意我定义了一个新样式,endnode
用于这些节点。它定义为
endnode/.style={coordinate,label={[rotate=90,left]below:#1}},
这#1
意味着样式必须与单个参数一起使用,即endnode={text}
,其中text
是实际标签。使用left
而不是的原因below
是left
设置anchor=east
,并且我认为旋转也会旋转锚点,因此east
锚点将位于旋转节点的顶部。coordinate
样式意味着节点本身将具有零宽度/高度。
为了绘制虚线形状,我使用了库的功能fit
。请注意,树中分支上的节点将按层和分支编号。因此,如果调用了基节点root
(不必这样称呼,您可以0
在代码中保留),则第一个子节点称为root-1
,第二个子节点称为root-2
。的第一个子节点root-1
称为root-1-1
,依此类推。
线路
\node [fit=(root-1)(root-2),draw,dashed,rounded corners=5pt,label=above:Investor 2]{};
创建一个包含root-1
和root-2
节点的节点。边框用虚线和圆角绘制,并在上方添加标签。
进一步注意 被\tikzstyle
认为是弃用的。对于其他图表中也应可用的样式,请\tikzset{stylename/.style={...}}
在序言中使用 ,而不是\tikzstyle{stylename}=[...]
。在这里,我在环境的可选参数中定义了样式tikzpicture
,因为它们似乎无论如何都是本地的tikzpicture
。
\documentclass[12pt,border=5mm,tikz]{standalone}
\usepackage{tikz}
\usetikzlibrary{fit}
\begin{document}
\begin{tikzpicture}[
font=\footnotesize,
edge from parent/.style={draw,thick},
% Two node styles: solid and hollow
solid node/.style={circle,draw,inner sep=1.2,fill=black},
hollow node/.style={circle,draw,inner sep=1.2},
endnode/.style={coordinate,label={[rotate=90,left]below:#1}},
% Specify spacing for each level of the tree
level 1/.style={level distance=15mm,sibling distance=40mm},
level 2/.style={level distance=15mm,sibling distance=20mm},
level 3/.style={level distance=15mm,sibling distance=15mm}
]
% The Tree
\node(root)[hollow node,label=above:{Investor 1}]{}
child{node[solid node]{}
child{node[solid node]{}
child{node[endnode={$(6,6,6)$}]{}
edge from parent
node[left]{$A$}}
child{node[endnode={$(-7,-6,-5)$}]{}
edge from parent
node[right]{$R$}}
edge from parent
node[above left]{$A$}
}
child{node[solid node]{}
child{node[endnode={$(-7,-5,-6)$}]{}
edge from parent
node(s)[left]{$A$}}
child{node[endnode={$(-7,-6,-6)$}]{}
edge from parent
node(t)[right]{$R$}}
edge from parent
node[above right]{$R$}
}
edge from parent
node[above left]{$G$}
}
child{node[solid node] {}
child{node[solid node]{}
child{node[endnode={$(-7,-5,-5)$}]{}
edge from parent
node(m)[left]{$A$}}
child{node[endnode={$(-1,2,-1)$}]{}
edge from parent
node(n)[right]{$R$}}
edge from parent
node[above left]{$A$}
}
child{node[solid node] {}
child{node[endnode={$(-1,-1,2)$}]{}
edge from parent
node[left]{$A$}}
child{node[endnode={$(-1,2,2)$}]{}
edge from parent
node[right]{$R$}}
edge from parent
node[above right]{$R$}
}
edge from parent
node[above right]{$B$}
};
% movers
\node [fit=(root-1)(root-2),draw,dashed,rounded corners=5pt,label=above:Investor 2]{};
\node [fit=(root-1-1)(root-2-2),draw,dashed,rounded corners=5pt,label=above:Investor 3]{};
\end{tikzpicture}
\end{document}
一条forest
建议
好吧,这是一棵树,用于绘制树的最受欢迎的软件包之一是forest
。虽然我自己并不真正使用它,所以下面的代码是在手册中滚动后拼凑起来的。因此,很有可能可以做得更好。
(附录:正如我所说,请参阅cfr 的答案以获得更优雅的解决方案使用forest
。)
\documentclass[border=5mm,tikz]{standalone}
\usepackage{forest}
\usetikzlibrary{fit}
\tikzset{
solid node/.style={circle,draw,inner sep=1.2,fill=black},
hollow node/.style={circle,draw,inner sep=1.2},
edgelabel/.style={auto,pos=0.6,font=\footnotesize}
}
\begin{document}
\begin{forest}
[, name=root, hollow node, for tree={rotate=90,left,font=\footnotesize}
[ , name=a1, solid node, edge label={node[edgelabel,swap]{$G$}}
[ , name=b1, solid node, edge label={node[edgelabel,swap]{$A$}}
[ {$(6,6,6)$}, edge label={node[edgelabel,swap]{$A$}}]
[ {$(-7,-6,-5)$}, edge label={node[edgelabel]{$R$}} ] ]
[ , solid node, edge label={node[edgelabel]{$R$}}
[ {$(-7,-5,-6)$}, edge label={node[edgelabel,swap]{$A$}} ]
[ {$(-7,-6,-6)$}, edge label={node[edgelabel]{$R$}} ]
]
]
[ , name=a2, solid node, edge label={node[edgelabel]{$B$}}
[ ,solid node, edge label={node[edgelabel,swap]{$A$}}
[ {$(-7,-5,-5)$}, edge label={node[edgelabel,swap]{$A$}} ]
[ {$(-1,2,-1)$}, edge label={node[edgelabel]{$R$}} ]
]
[, name=b2, solid node, edge label={node[edgelabel]{$R$}}
[ {$(-1,-1,2)$}, edge label={node[edgelabel,swap]{$A$}} ]
[ {$(-1,2,2)$}, edge label={node[edgelabel]{$R$}} ]
]
]
{
\node [above,font=\footnotesize] at (root.north) {Investor 1};
\node [fit=(a1)(a2),dashed,draw,rounded corners=5pt,label=above:\footnotesize Investor 2]{};
\node [fit=(b1)(b2),dashed,draw,rounded corners=5pt,label=above:\footnotesize Investor 3]{};
}
]
\end{forest}
\end{document}