Tikz Forest - 如何自定义子节点的位置?

Tikz Forest - 如何自定义子节点的位置?

我想使用该forest包更改图表中特定子节点的位置。

我想要一个按如下方式组织的图表,其中子节点位于根节点的左侧/右侧:

在此处输入图片描述

到目前为止,我得到了以下信息。我似乎无法将子节点直接移动到根节点的左侧/右侧:

在此处输入图片描述

如何得到想要的结果?

以下是 MWE:

\documentclass[border=2mm]{standalone}
\usepackage[edges]{forest}

\begin{document}
    \begin{forest}
    for tree = {
        text width=30mm,
        if level=0{fill=gray!70}{fill=gray!20},
        if level=1{fill=gray!50}{},
        forked edge,
    }
    [Blah Blah Blah
        [Should be left of the root node, grow'=west
            [Blah Blah Blah
            ]
        ]
        [Blah Blah Blah
            [Blah Blah Blah
                [Blah Blah Blah 
                    [Blah Blah Blah
        ]]]]
        [Blah Blah Blah
            [Blah Blah Blah 
                [Blah Blah Blah
        ]]]
        [Blah Blah Blah
            [Blah Blah Blah
                [Blah Blah Blah
                    [Blah Blah Blah
         ]]]]
    ]
\end{forest}
\end{document}

答案1

更新

不需要手动放置节点的更通用的解决方案是现已推出

旧解决方案:

森林不是为这种建筑设计的,所以你必须进行一些手动放置:

在此处输入图片描述

对于两个特殊节点(left of rootright of root),使用手动调整坐标。如果您更改树中的其他间距因子,before computing xy={l=0,s=±3.75cm}请更改。s

然后使用no edge来防止以您不想要的方式绘制边,而是name您想要连接的节点。最后,使用\draw命令添加额外的边。

我还调整了开头的s sepl sep,使绘制的两条水平边与垂直自动边的长度相同。最后,我添加了fork sep分叉发生在l sep长度的一半处。

\documentclass[border=2mm]{standalone}
\usepackage[edges]{forest}

\begin{document}
    \begin{forest}
    for tree = {
        text width=30mm,
        if level=0{fill=gray!70}{fill=gray!20},
        if level=1{fill=gray!50}{},
        forked edge,
        s sep=5mm, l sep=5mm,
        fork sep=2.5mm
    }
    [Root,name=n1
        [West of root,before computing xy={l=0,s=-3.75cm},no edge,grow=west,name=n2
            [Far west
            ]
        ]
        [Blah Blah Blah
            [Blah Blah Blah
        ]]
        [Blah Blah Blah
            [Blah Blah Blah 
                [Blah Blah Blah
        ]]]
        [Blah Blah Blah
            [Blah Blah Blah
        ]]
        [East of root,before computing xy={l=0,s=3.75cm},no edge,grow=east,name=n3
            [Far east
         ]]
    ]
    \draw(n1)--(n2) (n1)--(n3);
\end{forest}
\end{document}

答案2

我建议采用以下方法。让Should be left of the root node节点成为“根”的父节点,而Blah Blah Blah其左侧的节点又成为其父节点(因此是树的实际根)。然后可以通过设置grow=east这些特殊的“子节点”来实现所需的树几何形状;而且无论如何,很容易将它们的样式设置为我们想要的样式。

relative level在新的层次结构下,最简单的方法是通过( )设置旧根的“普通子项”的样式>。另请注意,forked edge现在应仅为旧根的实际后代设置。

\documentclass[border=2mm]{standalone}
\usepackage[edges]{forest}

\begin{document}
\begin{forest}
  level0/.style={fill=gray!70},
  level1/.style={fill=gray!50},
  level2/.style={fill=gray!20},
  for tree={
    text width=30mm, anchor=center,
  },
  [Blah Blah Blah, grow=east, level2,
    [Should be left of the root node, grow=east, level1,
      [Blah Blah Blah,
        level0,
        for relative level={1}{level1},
        for relative level>={2}{level2},
        for descendants={forked edge},
        [Blah Blah Blah
          [Blah Blah Blah
            [Blah Blah Blah 
              [Blah Blah Blah
              ]]]]
        [Blah Blah Blah
          [Blah Blah Blah 
            [Blah Blah Blah
            ]]]
        [Blah Blah Blah
          [Blah Blah Blah
            [Blah Blah Blah
              [Blah Blah Blah
              ]]]]
      ]]]
\end{forest}
\end{document}

相关内容