一条forest建议

一条forest建议

我无法将树的第三级标签向下移动以防止重叠。有人能帮我吗?我尝试更改 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}

不太冗长的 Forest 解决方案

答案2

您的代码似乎无法生成您发布的图像,但这里有一些东西可能会满足您的要求。如果我误解了什么,请发表评论。

首先要注意的是,末尾的元组是使用labels 来设置节点的,而不是直接使用节点文本。这样做是为了让文本直接位于行尾下方。

注意我定义了一个新样式,endnode用于这些节点。它定义为

endnode/.style={coordinate,label={[rotate=90,left]below:#1}},

#1意味着样式必须与单个参数一起使用,即endnode={text},其中text是实际标签。使用left而不是的原因belowleft设置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-1root-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}

相关内容