3

This is the first time I use TikZ so please bear with me.

With the following code:

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{arrows,shapes,positioning,shadows,trees}

\tikzset{
  basic/.style  = {draw, text width=2cm, drop shadow, font=\sffamily, rectangle},
  root/.style   = {basic, rounded corners=2pt, thin, align=center,
                   fill=green!30},
  level 2/.style = {basic, rounded corners=6pt, thin,align=center, fill=green!60,
                   text width=8em},
  level 3/.style = {basic, thin, align=left, fill=pink!60, text width=6.5em}
}

\begin{document}
\begin{tikzpicture}[
  level 1/.style={sibling distance=40mm},
  edge from parent/.style={->,draw},
  >=latex]

% root of the the initial tree, level 1
\node[root] {Fuselage}
% The first level, as children of the initial tree
  child {node[level 2] (c1) {Functions}}
  child {node[level 2] (c2) {Requirements}};

% The second level, relatively positioned nodes
\begin{scope}[every node/.style={level 3}]
\node [below of = c1, xshift=15pt] (c11) {Shell containing payload};
\node [below of = c11] (c12) {Protection against climate};
\node [below of = c12] (c13) {Central structural member};
\node [below of = c13] (c14) {Houses aircraft systems};
\node [below of = c2, xshift=15pt] (c21) {Low drag};
\node [below of = c21] (c22) {Structural};
\node [below of = c22] (c23) {Costs};

\end{scope}

% lines from each level 1 node to every one of its "children"
\foreach \value in {1,...,4}
  \draw[->] (c1.195) |- (c1\value.west);

\foreach \value in {1,...,3}
  \draw[->] (c2.195) |- (c2\value.west);

\end{tikzpicture}
\end{document}

I get this:

enter image description here

How would I go about adding another set of children nodes to get something like this structure:

enter image description here

2
\documentclass[border=5pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{arrows,shapes,positioning,shadows,trees}

\tikzset{
  basic/.style  = {draw, text width=2cm, drop shadow, font=\sffamily, rectangle},
  root/.style   = {basic, rounded corners=2pt, thin, align=center,
                   fill=green!30},
  level 2/.style = {basic, rounded corners=6pt, thin,align=center, fill=green!60,
                   text width=8em},
  level 3/.style = {basic, thin, align=left, fill=pink!60, text width=6.5em}
}

\begin{document}
\begin{tikzpicture}[
  level 1/.style={sibling distance=130mm},
  level 2/.append style={sibling distance=40mm},
  edge from parent/.style={->,draw},
  >=latex]

% root of the the initial tree, level 1
\node[root] {Fuselage}
% The first level, as children of the initial tree
  child {node[level 2] (ch1) {Requirements}
    child {node[level 2] (c1) {Costs}}
    child {node[level 2] (c2) {Structural}}
    child {node[level 2] (c3) {Low Drag}}
  }
  child {node[level 2] (ch2) {Houses}
    child {node[level 2] (c4) {Central}}
    child {node[level 2] (c5) {Protection}}
    child {node[level 2] (c5) {Shell}}
  };

% The second level, relatively positioned nodes
\begin{scope}[every node/.style={level 3}]
\node [below = of  c1, xshift=15pt] (c11) {Shell containing payload};
\node [below = of  c11] (c12) {Protection against climate};
\node [below = of  c12] (c13) {Central structural member};
\node [below = of  c13] (c14) {Houses aircraft systems};

\node [below = of  c2, xshift=15pt] (c21) {Test text a};
\node [below = of  c21] (c22) {Test text b};
\node [below = of  c22] (c23) {Test text c};

\node [below = of  c3, xshift=15pt] (c31) {Test text a};
\node [below = of  c31] (c32) {Test text b};
\node [below = of  c32] (c33) {Test text c};
\node [below = of  c33] (c34) {Test text d};

\node [below = of  c4, xshift=15pt] (c41) {Test text a};
\node [below = of  c41] (c42) {Test text b};
\node [below = of  c42] (c43) {Test text c};
\node [below = of  c43] (c44) {Test text d};
\node [below = of  c44] (c45) {Test text e};

\end{scope}

% lines from each level 1 node to every one of its "children"
\foreach \value in {1,...,4}
  \draw[->] (c1.195) |- (c1\value.west);

\foreach \value in {1,...,3}
  \draw[->] (c2.195) |- (c2\value.west);

\foreach \value in {1,...,4}
  \draw[->] (c3.195) |- (c3\value.west);
\foreach \value in {1,...,5}
  \draw[->] (c4.195) |- (c4\value.west);
\end{tikzpicture}
\end{document}

enter image description here

As a side note, change from the not so good of= syntax to the =of syntax (from the positioning library), as I did in my example code.

  • Surprising how popular these particular colour are, isn't it ;)? – cfr Sep 4 '15 at 23:00
2

This is simply a forest rewrite of Gonzalo Medina's answer which demonstrates how concisely a tree of this kind can be specified in bracket syntax, and the way in which the overall layout and style of the tree can be determined programmatically using suitable settings in forest's preamble.

I've used the same \tikzset{} used in the original as these styles can then be applied within the forest tree. I've updated the syntax for the arrows to use the new arrows.meta library, as currently recommended.

\documentclass[border=5pt,tikz]{standalone}
\usepackage{forest}
\usetikzlibrary{arrows.meta,shadows}

\tikzset{
  basic/.style  = {draw, text width=2cm, drop shadow, font=\sffamily, rectangle},
  root/.style   = {basic, rounded corners=2pt, thin, align=center, fill=green!30},
  level 2/.style = {basic, rounded corners=6pt, thin, align=center, fill=green!60, text width=8em},
  level 3/.style = {basic, thin, align=left, fill=pink!60, text width=6.5em}
}

\begin{document}
\begin{forest}
  % forest preamble: determine layout and format of tree
  for tree={
    if level=0{root}{
      if={(level()<3)}{
        level 2,
        tier/.wrap pgfmath arg={tier #1}{level()},
        if level=2{
          before typesetting nodes={
            prepend={[, phantom]}
          },
        }{}
      }{
        level 3,
        child anchor=west,
        edge={->,>={Stealth[]}},
        edge path={
          \noexpand\path [\forestoption{edge}] (!to tier=tier 2.south west) +(20pt,0) |- (.child anchor)\forestoption{edge label};
        }
      },
    },
  },
  before packing={
    where level=3{
      if={n_children("!u")>1}{
        if n=1{
          grow=0,
        }{
          !u1.append=!n
        }
      }{red}
    }{}
  }
  % specification for the tree itself starts with the root here
  [Fuselage
    [Requirements
      [Costs
        [Shell containing payload
        ]
        [Protection against climate
        ]
        [Central structural member
        ]
        [Houses aircraft systems
        ]
      ]
      [Structural
        [Test text a
        ]
        [Test text b
        ]
        [Test text c
        ]
      ]
      [Low Drag
        [Test text a
        ]
        [Test text b
        ]
        [Test text c
        ]
        [Test text d
        ]
      ]
    ]
    [Houses
      [Central
        [Test text a
        ]
        [Test text b
        ]
        [Test text c
        ]
        [Test text d
        ]
        [Test text e
        ]
      ]
      [Protection
      ]
      [Shell
      ]
    ]
  ]
\end{forest}
\end{document}

tree

For help getting started with forest, especially the bracket syntax for trees, see the second part of my answer here.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.