使用 tikz 画一棵树

使用 tikz 画一棵树

我在 TikZ 中遇到了一些无法修复此树的问题:

  1. 我怎样才能避免根部附近的空白区域?
  2. 我如何在分支上写文本?我使用了来自父级的边 但没有按我期望的方式工作。

这是我正在使用的代码:

 \begin{tikzpicture}
 [ level 1/.style={sibling distance=6em},
   level 2/.style={sibling distance=4em}, level distance=1cm,
   level 3/.style={sibling distance=2em}, level distance=1cm] 
\node (root) {}  [fill]  circle (1.5pt)
   child {  [fill]  circle (1.5pt) 
    child {  [fill]  circle (1.5pt)
        child {}
        child {}
    }
    child {
    }
}
child {  [fill]  circle (1.5pt) 
        child {}
        child {}
}
;
\node at (root)[right]{I};
\node at (root-1)[left] {II};
\node at (root-2)[right] {II};

\end{tikzpicture}    

这就是我得到的: 修复这棵树

答案1

为了避免根处出现空白,您需要将根设为 a coordinate,而不是 a node,因为nodes 具有某个最小维度,而 acoordinate没有。

至于分支上的文本,实际上,您可以使用 来完成edge from parent。很难说出你哪里做错了,因为你的 MWE 中没有示例,但下面的 MWE 包含了一个可以正常工作的示例。

你可能想看看第 326 页TikZ 和 PGF 文档

\documentclass{article}
\usepackage{tikz}

\begin{document}
\begin{tikzpicture}[
    level 1/.style={sibling distance=6em},
    level 2/.style={sibling distance=4em}, level distance=1cm,
    level 3/.style={sibling distance=2em}, level distance=1cm
    ] 
\coordinate (root) {}  [fill]  circle (1.5pt)
    child {  [fill]  circle (1.5pt)
        child {  [fill]  circle (1.5pt)
            child {}
            child {}
            edge from parent
                node[left] {a}
        }
        child {
        }
    }
    child {  [fill]  circle (1.5pt) 
        child {}
        child {}
    }
    ;
\node at (root)[right]{I};
\node at (root-1)[left] {II};
\node at (root-2)[right] {II};
\end{tikzpicture} 
\end{document}

在此处输入图片描述

答案2

因为树木需要森林……

...我喜欢自动化解决方案...

\documentclass[tikz, border=5pt, mult, varwidth]{standalone}
\usepackage{forest}
\begin{document}
  \forestset{
    filled circle/.style={
      circle,
      text width=3pt,
      fill,
    },
    phantom/.append style={label={}},
    my label/.style n args=2{
      edge label={node [midway, #1, font=\scriptsize] {#2}}
    },
  }
  \begin{forest}
    for tree={
      inner sep=0pt,
      outer sep=0pt,
      tier/.wrap pgfmath arg={tier #1}{int(level)},
      where n=0{
        s sep=4em,
        label={right:\csname @Roman\endcsname{1}},
        for descendants={
          s sep=2em,
          l sep=10mm,
          where n=1{
            label/.wrap pgfmath arg={left:\csname @Roman\endcsname{#1}}{int(level()+1)}
          }{
            where n'=1{
              label/.wrap pgfmath arg={right:\csname @Roman\endcsname{#1}}{int(level()+1)}
            }{},
          },
        },
      }{},
    }
    [, filled circle
    [, filled circle, my label={left}{some text}
        [, filled circle
          []
          [, phantom]
        ]
        []
      ]
      [, filled circle, my label={right}{some text}
        []
        []
      ]
    ]
  \end{forest}
\end{document}

自动标记的森林树

相关内容