使用 tikzstyle 的节点问题

使用 tikzstyle 的节点问题

我在构建游戏树时遇到了一些问题。我的第三层似乎想要连接到上一层的标签,而不是终端节点。

这是一张图片

在此处输入图片描述

产生这种情况的原因如下:

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{amsmath}
\usepackage{tikz}
\usepackage{sgame}
\usepackage{pstricks}
\usepackage{egameps}
\usetikzlibrary{arrows}
\usetikzlibrary{calc}
\begin{document}
\begin{figure}[!htb]
    \begin{center}
    %\newcommand{\payoff}[4][below]{\node[#1]at(#2){$(#1,#2)$};}
    \begin{tikzpicture}[scale=1.5,font=\footnotesize][!htb]
        \tikzstyle{solid node}=[circle,draw,inner sep=1.5,fill=black]
        \tikzstyle{hollow node}=[circle,draw,inner sep=1.5]
        \tikzstyle{level 1}=[level distance=15mm,sibling distance=2.5cm]
        \tikzstyle{level 2}=[level distance=15mm,sibling distance=1.5cm]
        \tikzstyle{level 3}=[level distance=15mm,sibling distance=1.5cm]

        \node[solid node,label=above:{$1$}]{}
            child{node[solid node,label=above left:{}]{}
                child{node[solid node,label=above left:{}]{} edge from parent node[left]{$L$}
                    child{node[solid node,label=above left:{}]{} edge from parent node[left]{$l$}}
                    child{node[solid node,label=above left:{}]{} edge from parent node[right]{$r$}}
                }
                child{node[solid node,label=above right:{}]{} edge from parent node[right]{$R$}
                    child{node[solid node,label=above left:{}]{} edge from parent node[left]{$l$}}
                    child{node[solid node,label=above left:{}]{} edge from parent node[right]{$r$}}
                }
            edge from parent node[left,xshift=-5]{$Left$}
            }
            child{node[solid node,label=above right:{}]{}
                child[missing]
            edge from parent node[right,xshift=5]{$Right$}
            };
    \end{tikzpicture}
    \end{center}
    \end{figure}

答案1

欢迎使用 TeX SE!就我个人而言,我会使用它forest来处理任何树。代码更紧凑,包功能更强大。

这是一个相当简单的用法:

\documentclass[tikz,border=5pt]{standalone}
\usepackage{forest}

\begin{document}
  \tikzset{
    solid node/.style={circle,draw,inner sep=1.5,fill=black},
    hollow node/.style={circle,draw,inner sep=1.5},
  }
  \forestset{
    my left/.style = {
      edge label={node[midway, left, inner sep=5pt, font=\footnotesize] {$#1$}},
    },
    my right/.style = {
      edge label={node[midway, right, inner sep=5pt, font=\footnotesize] {$#1$}},
    },
    payoff/.style = {
      label={below:{[$#1$]}},
    }
  }
    \begin{forest}
      for tree={
        parent anchor=center,
        child anchor=center,
        l sep=15mm,
        if level=0{s=25mm}{s sep=15mm},
        font=\footnotesize,
      }
      [, solid node, label={above:1}
        [, solid node, my left=Left
          [, solid node, my left=L
            [, solid node, my left=l, payoff=8
            ]
            [, solid node, my right=r, payoff=9
            ]
          ]
          [, solid node, my right=R
            [, solid node, my left=l, payoff=3
            ]
            [, solid node, my right=r, payoff=6
            ]
          ]
        ]
        [, solid node, my right=Right
        ]
      ]
    \end{forest}
\end{document}

您可以进一步减少这一点。例如,如果大多数节点都是实心的,则将其放入for tree并仅在需要时进行覆盖。phantom这可能是您想要的,missing尽管您的树中没有此示例,因此很难确定。

森林树木

答案2

和相似edge from parent node[left]{$L$}被放在了错误的位置。 指示的新位置<--是正确的位置。 并且sibling distance对第 3 级的 进行了一点修改以显示空间。

不可否认,@cfr 的解决方案是值得推荐的。

在此处输入图片描述

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{amsmath}
\usepackage{tikz}
\usepackage{sgame}
\usepackage{pstricks}
\usepackage{egameps}
\usetikzlibrary{arrows}
\usetikzlibrary{calc}
\begin{document}
\begin{figure}[!htb]
    \begin{center}
    %\newcommand{\payoff}[4][below]{\node[#1]at(#2){$(#1,#2)$};}
    \begin{tikzpicture}[scale=1.5,font=\footnotesize][!htb]
        \tikzstyle{solid node}=[circle,draw,inner sep=1.5,fill=black]
        \tikzstyle{hollow node}=[circle,draw,inner sep=1.5]
        \tikzstyle{level 1}=[level distance=15mm,sibling distance=2.5cm]
        \tikzstyle{level 2}=[level distance=15mm,sibling distance=1.5cm]
        \tikzstyle{level 3}=[level distance=15mm,sibling distance=1cm]

        \node[solid node,label=above:{$1$}]{}
            child{node[solid node,label=above left:{}]{}
                child{node[solid node,label=above left:{}](){} 
                    child{node[solid node,label=above left:{}]{} edge from parent node[left]{$l$}}
                    child{node[solid node,label=above left:{}]{} edge from parent node[right]{$r$}}
                edge from parent node[left]{$L$}  % <--
                }
                child{node[solid node,label=above right:{}]{}
                    child{node[solid node,label=above left:{}]{} edge from parent node[left]{$l$}}
                    child{node[solid node,label=above left:{}]{} edge from parent node[right]{$r$}}
               edge from parent node[right]{$R$} %<--
                }
            edge from parent node[left,xshift=-5]{$Left$}
            } 
            child{node[solid node,label=above right:{}]{}
                child[missing]
            edge from parent node[right,xshift=5]{$Right$}
            };
    \end{tikzpicture}
    \end{center}
    \end{figure}
\end{document}

答案3

使用istgame包,您可以绘制游戏树。这是一个Tikz基于 latex 的包,用于绘制游戏树。您可以像使用istgame环境一样使用该tikzpicture环境,这意味着您可以在环境Tikz options and macros内使用istgame

在此处输入图片描述

\documentclass{standalone}

\usepackage{istgame}

\begin{document}    
\begin{istgame}[scale=1.5,font=\footnotesize]
\xtShowEndPoints
\xtdistance{15mm}{30mm}
\istroot(0){1}
  \istb{Left}[l]
  \istb{Right}[r]{0,0}
  \endist
\istroot(1)(0-1){2}
  \istb{L}[l]
  \istb{R}[r]
  \endist
\xtdistance{15mm}{15mm}
\istroot(2)(1-1){1}
  \istb{\ell}[l]{1,2}
  \istb{r}[r]{3,4}
  \endist
\istroot(3)(1-2){1}
  \istb{\ell}[l]{5,6}
  \istb{r}[r]{7,8}
  \endist
\end{istgame}

\end{document}

相关内容