绘制更加连通的层次图

绘制更加连通的层次图

我正在尝试绘制层次图。我已经发现例子和对应问题。这很有帮助,但不幸的是我需要一个稍微复杂一点的图表,而且不知道如何实现我的目标。

我的代码如下:

% Hierarchical diagram
% Author: cfr
\documentclass[tikz,border=10pt]{standalone}
\usepackage{forest}
\usetikzlibrary{arrows.meta, shapes.geometric, calc, shadows}

\colorlet{mygreen}{green!75!black}
\colorlet{col1in}{red!30}
\colorlet{col1out}{red!40}
\colorlet{col2in}{mygreen!40}
\colorlet{col2out}{mygreen!50}
\colorlet{col3in}{blue!30}
\colorlet{col3out}{blue!40}
\colorlet{col4in}{mygreen!20}
\colorlet{col4out}{mygreen!30}
\colorlet{col5in}{blue!10}
\colorlet{col5out}{blue!20}
\colorlet{col6in}{blue!20}
\colorlet{col6out}{blue!30}
\colorlet{col7out}{orange}
\colorlet{col7in}{orange!50}
\colorlet{col8out}{orange!40}
\colorlet{col8in}{orange!20}
\colorlet{linecol}{blue!60}

\begin{document}
\pgfkeys{/forest,
  rect/.append style   = {rectangle, rounded corners = 2pt,
                         inner color = col6in, outer color = col6out},
  ellip/.append style  = {ellipse, inner color = col5in,
                          outer color = col5out},
  orect/.append style  = {rect, font = \sffamily\bfseries\LARGE,
                         text width = 325pt, text centered,
                         minimum height = 10pt, outer color = col7out,
                         inner color=col7in},
  oellip/.append style = {ellip, inner color = col8in, outer color = col8out,
                          font = \sffamily\bfseries\large, text centered}}
\begin{forest}
  for tree={
      font=\sffamily\bfseries,
      line width=1pt,
      draw=linecol,
      ellip,
      align=center,
      child anchor=north,
      parent anchor=south,
      drop shadow,
      l sep+=12.5pt,
      edge path={
        \noexpand\path[color=linecol, rounded corners=5pt,
          >={Stealth[length=10pt]}, line width=1pt, ->, \forestoption{edge}]
          (!u.parent anchor) -- +(0,-5pt) -|
          (.child anchor)\forestoption{edge label};
        },
      where level={3}{tier=tier3}{},
      where level={0}{l sep-=15pt}{},
      where level={1}{
        if n={1}{
          edge path={
            \noexpand\path[color=linecol, rounded corners=5pt,
              >={Stealth[length=10pt]}, line width=1pt, ->,
              \forestoption{edge}]
              (!u.west) -| (.child anchor)\forestoption{edge label};
            },
        }{
          edge path={
            \noexpand\path[color=linecol, rounded corners=5pt,
              >={Stealth[length=10pt]}, line width=1pt, ->,
              \forestoption{edge}]
              (!u.east) -| (.child anchor)\forestoption{edge label};
            },
        }
      }{},
  }
  [Title, inner color=col1in, outer color=col1out
    [X, inner color=col2in, outer color=col2out
      [X1, inner color=col4in, outer color=col4out
          [X11, rect, name=X11
          ]
          [X12, rect, name=X12
          ]
          [X13, rect, name=X13
          ]
          [X14, rect, name=X14
          ]
          [X15, rect, name=X15
          ]
          [X16, rect, name=X16
          ]
          [X17, rect, name=X17
          ]
          [X18, rect, name=X18
          ]
      ]
      [X2, inner color=col4in, outer color=col4out
      ]
      [X3, inner color=col4in, outer color=col4out
      ]
    ]
    [Y, inner color=col3in, outer color=col3out
      [Convex Relaxation
        [Sparse Signal\\Estimate, rect, name=sse1
        ]
      ]
      [Greedy Pursuits
        [Sparse Signal\\Estimate, rect, name=sse2
        ]
      ]
      [, phantom, calign with current
        [A\\B, phantom
          [Our Work, orect, name=us
            [{Improved Sparse Signal Estimate!}, oellip
            ]
          ]
        ]
      ]
      [Non-Convex\\Minimisation Methods
        [Sparse Signal\\Estimate, rect, name=sse3
        ]
      ]
      [Combinatorial\\Algorithms
        [Sparse Signal\\Estimate, rect, name=sse4
        ]
      ]
    ]
  ]
  \begin{scope}[color = linecol, rounded corners = 5pt,
    >={Stealth[length=10pt]}, line width=1pt, ->]
    \draw (sse2.south) -- (us.north -| sse2.south);
    \draw (sse3.south) -- (us.north -| sse3.south);
    \coordinate (c1) at ($(sse1.south)!2/5!(sse2.south)$);
    \coordinate (c2) at ($(sse3.south)!2/5!(sse4.south)$);
    \draw (sse1.south) -- +(0,-10pt) -| (us.north -| c1);
    \draw (sse4.south) -- +(0,-10pt) -| (us.north -| c2);
  \end{scope}
\end{forest}
\end{document}

结果如下所示: 结果图

我希望节点 X1、X2 和 X3 与节点 X11-X18 之间有箭头,以避免必须连接节点 X11-X18 三次(每个更高级别的节点连接一次)。简而言之,我正在寻找一种方法来绘制下图中的红色箭头: 通缉图

答案1

\draw如果要命名这两个节点,只需在末尾添加命令即可。下面也会对代码进行一些更新,但只是一点点。

\documentclass[tikz,border=10pt]{standalone}
\usepackage{forest}
\usetikzlibrary{arrows.meta, shapes.geometric, calc, shadows}

\colorlet{mygreen}{green!75!black}
\colorlet{col1in}{red!30}
\colorlet{col1out}{red!40}
\colorlet{col2in}{mygreen!40}
\colorlet{col2out}{mygreen!50}
\colorlet{col3in}{blue!30}
\colorlet{col3out}{blue!40}
\colorlet{col4in}{mygreen!20}
\colorlet{col4out}{mygreen!30}
\colorlet{col5in}{blue!10}
\colorlet{col5out}{blue!20}
\colorlet{col6in}{blue!20}
\colorlet{col6out}{blue!30}
\colorlet{col7out}{orange}
\colorlet{col7in}{orange!50}
\colorlet{col8out}{orange!40}
\colorlet{col8in}{orange!20}
\colorlet{linecol}{blue!60}

\begin{document}
\pgfkeys{/forest,
  rect/.append style   = {rectangle, rounded corners = 2pt,
                         inner color = col6in, outer color = col6out},
  ellip/.append style  = {ellipse, inner color = col5in,
                          outer color = col5out},
  orect/.append style  = {rect, font = \sffamily\bfseries\LARGE,
                         text width = 325pt, text centered,
                         minimum height = 10pt, outer color = col7out,
                         inner color=col7in},
  oellip/.append style = {ellip, inner color = col8in, outer color = col8out,
                          font = \sffamily\bfseries\large, text centered}}
\begin{forest}
  for tree={
      font=\sffamily\bfseries,
      line width=1pt,
      draw=linecol,
      ellip,
      align=center,
      child anchor=north,
      parent anchor=south,
      drop shadow,
      l sep'+=12.5pt,
      edge+={color=linecol, rounded corners=5pt, >={Stealth[length=10pt]}, line width=1pt, ->},
      edge path'={(!u.parent anchor) -- +(0,-5pt) -| (.child anchor)},
      where level={3}{tier=tier3}{},
      where level={0}{l sep'-=15pt}{},
      where level={1}{
        if n={1}{
          edge path'={(!u.west) -| (.child anchor)},
        }{
          edge path'={(!u.east) -| (.child anchor)},
        }
      }{},
  }
  [Title, inner color=col1in, outer color=col1out
    [X, inner color=col2in, outer color=col2out
      [X1, inner color=col4in, outer color=col4out
          [X11, rect, name=X11
          ]
          [X12, rect, name=X12
          ]
          [X13, rect, name=X13
          ]
          [X14, rect, name=X14
          ]
          [X15, rect, name=X15
          ]
          [X16, rect, name=X16
          ]
          [X17, rect, name=X17
          ]
          [X18, rect, name=X18
          ]
      ]
      [X2, inner color=col4in, outer color=col4out, name=x2
      ]
      [X3, inner color=col4in, outer color=col4out, name=x3
      ]
    ]
    [Y, inner color=col3in, outer color=col3out
      [Convex Relaxation
        [Sparse Signal\\Estimate, rect, name=sse1
        ]
      ]
      [Greedy Pursuits
        [Sparse Signal\\Estimate, rect, name=sse2
        ]
      ]
      [, phantom, calign with current
        [A\\B, phantom
          [Our Work, orect, name=us
            [{Improved Sparse Signal Estimate!}, oellip
            ]
          ]
        ]
      ]
      [Non-Convex\\Minimisation Methods
        [Sparse Signal\\Estimate, rect, name=sse3
        ]
      ]
      [Combinatorial\\Algorithms
        [Sparse Signal\\Estimate, rect, name=sse4
        ]
      ]
    ]
  ]
  \begin{scope}[color = linecol, rounded corners = 5pt, >={Stealth[length=10pt]}, line width=1pt, ->]
    \draw (sse2.south) -- (us.north -| sse2.south);
    \draw (sse3.south) -- (us.north -| sse3.south);
    \coordinate (c1) at ($(sse1.south)!2/5!(sse2.south)$);
    \coordinate (c2) at ($(sse3.south)!2/5!(sse4.south)$);
    \draw (sse1.south) -- +(0,-10pt) -| (us.north -| c1);
    \draw (sse4.south) -- +(0,-10pt) -| (us.north -| c2);
    \draw (x2.parent anchor) -- +(0,-5pt) -| (X11.child anchor);
    \draw (x2.parent anchor) -- +(0,-5pt) -| (X18.child anchor);
    \draw (x3.parent anchor) -- +(0,-5pt) -| (X11.child anchor);
    \draw (x3.parent anchor) -- +(0,-5pt) -| (X18.child anchor);
  \end{scope}
\end{forest}
\end{document}

附加边

相关内容