绘制树形图

绘制树形图

我正在尝试学习绘制树形图。我对我所绘制的图表类型特别感兴趣。在此处输入图片描述

以下是我目前编写的代码:

\documentclass{article}
\usepackage{tikz}
\usepackage[linguistics]{forest}

\begin{document}



\begin{figure}
\centering
\begin{tikzpicture} 
  \coordinate
    child [level distance=30mm]
    child [level distance=15mm]{
       {child [level distance=30mm] 
            {child [level distance=15mm] 
            child [level distance=30mm]}
       child [level distance=15mm]}
     };

     
     \begin{scope}[shift={(3,-3)}]
     \node (y1) {\textit{}};  
     \node  (y0)[right of=y1] {\textit{}};
     \path [->,auto, thick](y1) edge [] node [above]{$\chi_0$} (y0);
     \end{scope}
     
   \begin{scope}[shift={(6,0)}]
 \coordinate
    child [level distance=30mm]
    child [level distance=15mm]{
       {child [level distance=30mm] 
            {child [level distance=15mm] 
            child [level distance=30mm]}
       child [level distance=15mm]}
     };
\end{scope}
\end{tikzpicture}
\caption{.}
\end{figure}
\end{document}

我遇到的问题有3个:

  1. 子边与父边不对齐。

2)无法向同一个图形添加第二棵树。

3)无法添加箭头并标记。

如果有人能帮助我解答问题我将非常感激。

谢谢

答案1

我会使用 Forest,尽管这很大程度上取决于个人喜好。但使用一些特定于树的包或其他包将使事情变得容易得多。以下nice tree为基本样式定义了一种样式。对于您想要的两棵树的组合,我们定义了double nice trees一个基本上是nice tree根节点phantom和两个子树之间的空间,供您放置箭头或其他东西。

  nice tree/.style={%

我们单独定义它,以便它可以轻松应用于单棵树,而不仅限于我们想要一对的情况。

    before typesetting nodes={%

我们延迟这一过程,以便在应用样式时节点就存在。

      for tree={%

然后我们将以下内容应用于当前tree,即当前节点及其后代。

        circle,
        fill,
        inner sep=1.5pt,

做我们的点。

        parent anchor=center,
        child anchor=center,

将边缘对准点的中心,以避免出现上方和下方奇怪的扭曲。

        calign=fixed edge angles,

我们希望父母和孩子的边缘保持恒定的角度。

      },
    },
  },

double nice trees设置一个具有phantom根的树组(2+棵树)并应用于nice treephantom子项。

  double nice trees/.style={%
    phantom,
    s sep'+=50pt,
    for children={nice tree},
  },
}

为了像草图中那样对齐点,我们使用tier=<name>。我们使用四个命名层(AB和)来确保两棵树内和两棵树之间的正确对齐CD

我们用来tikz+={}在两者之间添加箭头。

完整代码:

\documentclass[border=5pt,tikz]{standalone}
% ateb: https://tex.stackexchange.com/a/713845/
\usepackage[linguistics]{forest}
\usetikzlibrary{arrows.meta}
\forestset{%
  nice tree/.style={%
    before typesetting nodes={%
      for tree={%
        circle,
        fill,
        inner sep=1.5pt,
        parent anchor=center,
        child anchor=center,
        calign=fixed edge angles,
      },
    },
  },
  double nice trees/.style={%
    phantom,
    s sep'+=50pt,
    for children={nice tree},
  },
}
\begin{document}
\begin{forest}
  double nice trees,
  tikz+={\draw [-Latex,thick,shorten >=15pt,shorten <=15pt] (!r122 |- !r211) -- node [above,midway] {$\chi_0$} (!r211); },
  [
    [
      [,tier=A]
      [
        [,tier=B
          [, tier=C
            [,phantom,tier=D]
          ]
          [,tier=D]
        ]
        [,tier=A
          [,phantom,tier=B]      
        ]
      ]
    ]
    [
      [
        [,tier=B]
        [,tier=A]
      ]
      [,tier=A
        [,tier=C]
        [,tier=B
          [,phantom,tier=C]
        ]
      ]
    ]
  ]
\end{forest}

\end{document}

Okular/KDE 中的一个错误意味着我的图像目前质量很差,所以即使输出正常,下面的内容看起来也会很模糊。

带箭头的双漂亮树

您可以命名节点,而不是使用坐标,例如(!r122)如果愿意的话。!r122只是表示如果您按照路径到达的节点-第一个孩子-第二个孩子-第二个孩子,但name=fred可能会更容易。

答案2

也许你使用forest以下包提供服务:

\documentclass{article}
\usepackage{tikz}
\usepackage{forest}

\newcommand{\dotikz}{\tikz{\fill (0,0) circle (2pt);}}

\begin{document}
\begin{figure}
\centering
\begin{minipage}{0.45\textwidth}
    \begin{forest}
    for tree={s sep=20pt} % horizontal separation between nodes
    [\dotikz%first
        [,phantom] % phantom node to add space
        [\dotikz,l=2cm]
        [\dotikz
            [,phantom]
            [\dotikz,l=2cm
                [\dotikz]
                [,phantom]
                [\dotikz,l=2cm]
            ]
        [\dotikz]
        ]
    ]
    \end{forest}
\end{minipage}
\begin{tikzpicture}[overlay, remember picture]
    \draw[-latex] (-2.5,0) -- (-.5,0) node[midway,below] {};
\end{tikzpicture}%
\begin{minipage}{0.45\textwidth}
    \begin{forest}
        for tree={s sep=20pt}
        [\dotikz
            [\dotikz
                    [,phantom]
                    [\dotikz,l=2cm]
                    [\dotikz]
            ]
            [,phantom]
            [\dotikz,l=2cm
                [,phantom]
                [\dotikz,l=2cm]
                [\dotikz]
            ]
        ]
    \end{forest}
\end{minipage}
\caption{Forest}
\end{figure}
\end{document}

在此处输入图片描述

相关内容