结合 Tikz 概念/库来绘制具有相对对齐/距离的复杂图片

结合 Tikz 概念/库来绘制具有相对对齐/距离的复杂图片

我认为所有的问题过去我或其他人都问过这个问题。但我的总体问题是我无法将所有这些解决方案组合成我想要绘制的真实画面。通常,将复杂问题分解成更简单的问题并提出问题是很好的。但在这里我尝试提出复杂的问题,因为我体验到解决方案会相互影响(在我的情况下是负面的)。

在此处输入图片描述

需求/问题描述:

  1. 左侧节点 ( Phase) 应旋转。我更喜欢\rotatebox( node contents={\rotatebox{90}{#1}}}) 的解决方案。
  2. 节点(更好的是) 位于右侧,水平居中。
  3. 逻辑图片有四个并且左侧和右侧的节点需要显示该内容。这意味着一个节点(例如right of B)垂直居中反对其左节点。请注意PhaseC属于C1C2long C3,因此垂直对齐应该表示这一点。(这里讨论
  4. 我认为用箭头连接节点不应该那么难。
  5. 一切都必须相对进行。这意味着没有cmmmpt类似的东西。
  6. 节点数不固定。第一行的节点数可能比第四行的节点数少。

一些解决方案:

\documentclass[tikz]{standalone}
\usepackage{xltxtra}
\usepackage{polyglossia}
\setdefaultlanguage[spelling=new]{german}
\usepackage{tikz}
\usetikzlibrary{scopes,matrix,positioning,chains}

\begin{document}
\begin{tikzpicture}
    [
        items/.style = {
            draw,
            align=center},
        phase/.style = {
            items,
            fill=red!20,
            node contents={\rotatebox{90}{#1}}}
    ]
    {[
        start chain=P going below
    ]
        \node [on chain,phase=PhaseA];
        {[
            start branch=A going right,
            every on chain/.append style=items,
            every node/.style=on chain
        ]
            \node {One};
            \node {Two};
            \node {Three};
            \node {Four};
        }
        \node [on chain,phase=PhaseB];
        \node [on chain,phase=PhaseC];
        \node [on chain,phase=PhaseD];
        {[
            start branch=D going right,
            every on chain/.append style=items,
            every node/.style=on chain
        ]
            \node {D1};
            \node {D2};
        }
    }

    % B
    \node [right=of P-2,items] {right of B};

    % C
    \matrix (C) [
        matrix of nodes,
        row sep=5pt, %2\textheight doesn't work here, maybe a \nodeheight exists?
        every node/.append style=items,
        right=of P-3]
    {
        C1 \\
        C2 \\
        long C3\\
    };
\end{tikzpicture}
\end{document}

生产这个

在此处输入图片描述

2 和 5 还没有实现。我认为 6 将来会造成问题。

答案1

以下是我可能实际执行此操作的方法。我并不认为这是一个显而易见的解决方案,但代码简洁,并且可以轻松针对整个图表进行调整。

標籤圖

如果有人想在家尝试一下,请告诉我,我会给你一份它使用的实验包。(我希望很快能让它的姐妹版进入 CTAN,也许这个也可以,但目前还没有。)

这使用森林版本 2。尚未使用版本 1 进行测试。

\documentclass[tikz, border=10pt, multi]{standalone}
\usepackage{justtrees}% version 0.07; forest version 2
\begin{document}
\forestset{%
  grouped/.style={
    !u.l sep=2.5pt,
    l=2.5pt,
    no edge
  }
}
\begin{justtree}
{
    for tree={
      draw,
      text height=1.5ex,
      l+=10mm,
      edge={->, thick},
      thick,
      font=\sffamily
    },
    just format={fill=red!20, rotate=90, anchor=south, yshift=2.5mm, xshift=.75ex, font=\sffamily}
}
  [one, left just=PhaseA]
  [two]
  [
    [right of B, left just=PhaseB, no edge, tikz+={\foreach \i in {1,2,4,5} \draw [<-, thick] (.child anchor) -- (!uu\i.parent anchor); }
      [C1
        [C2, left just=PhaseC, grouped
          [long C3, grouped
            [D1, left just=PhaseD]
            [D2]
          ]
        ]
      ]
    ]
  ]
  [three]
  [four]
\end{justtree}
\end{document}

答案2

您的 MWE 编译时没有错误,但结果似乎与您的草图不同...由于您已经得到了类似问题的答案,该答案也解决了您在问题中强调的问题,我(根据我以前的答案)制作了以下流程图:

在此处输入图片描述

使用以下代码:

\documentclass{article}
    \usepackage{tikz}
    \usetikzlibrary{arrows.meta,calc,chains,fit,positioning,scopes}
%%%% for show flowchart only
    \usepackage[active,tightpage]{preview}
    \PreviewEnvironment{tikzpicture}
    \setlength\PreviewBorder{3mm}

    \begin{document}
%---------------------------------------------------------------%
%   forth example                                               %
%---------------------------------------------------------------%
    \begin{tikzpicture}
%---------------------------------------------------------------%
suspend join/.code={\def\tikz@after@path{}},
    node distance = 7mm and 5mm,
      start chain = MR going right,
      start chain = MB going below,
      base/.style = {% common parameters
            draw, minimum size=4ex, inner sep=1mm},
        MR/.style = {% My Row nodes
            base, on chain=MR},
        MB/.style = {% My right Branch nodes
            base, on chain=MB},
        ML/.style = {% My Left branch nodes
            draw=cyan!60!black, rounded corners, fill=cyan!30,
            minimum size=4ex,
            label=center:\rotatebox{90}{#1},
            node contents={\rotatebox{90}{\phantom{#1}}}},
     arrow/.style = {thick,-{Triangle[]}},
       }
%---------------------------------------------------------------%
% FIRST ROW, names MR-1 ... MR-4
\node [MR] {one};
\node [MR] {two};
\node [MR] {tree};
\node [MR] {four};
% RIGHT BRANCH, names MB-1 ... MB-4
%   start point is below of middle of the first row
    \begin{scope}[every node/.style={MB,join=by arrow}]
\node[below=15mm of $(MR-1.south west)!0.5!(MR-4.south east)$] 
        {belong to Phase B}; % name=MB-1,
\node   {belong to Phase C};
\node   {belong to Phase C};
\node   {also belong to Phase C};% name=MB-4,
    \end{scope}
% LAST ROW, names MR-5 ... MR-6
\node[MR,below  left=of MB-4.south]   {D1};% name=MR-5,
\node[MR,below right=of MB-4.south]   {D2};
% LEFT BRANCH, 
\node (ML1) [ML=Phase A,left=of MR-1.west];
\node (ML2) [ML=Phase B,left=of MR-1.west |- MB-1];
\node (ML3) [ML=Phase C, inner ysep=0pt,
             fit=(ML1 |- MB-2.north) (ML1 |- MB-4.south)];
\node (ML4) [ML=Phase D,left=of MR-1.west |- MR-5];
% ARROWS NOT DETERMINED BY "JOIN" MACRO
\foreach \i in {1,2,3,4}
\draw[arrow]    (MR-\i) -- (MB-1);
\draw[arrow]    (MB-4) -- (MR-5);
\draw[arrow]    (MB-4) -- (MR-6);
    \end{tikzpicture}
\end{document}

其代码是根据以下假设设计的:

  • 右分支中最宽的行是顶行,因此左分支与其左侧对齐
  • 右链中第一行的节点位于向右的链中
  • 右分支位于第一行中心下方。可以简单地通过 确定$(MR-1.south west)!0.5!(MR-4.south east)$。其中的节点在链中并位于下方
  • 最后一行只有两个节点,因此它们相对于其上方的节点定位
  • 左分支中的蓝色节点相对于第一行的左侧定位,并定位右分支中属于节点,但节点“阶段 C”除外,该节点位于由和确定的坐标上,(ML1 |- MB-2.north)其中 (ML1 |- MB-4.south)ML1 是顶部蓝色节点的坐标,以及MB-2MB-4分支中属于节点的名称
  • 节点不在网格中
  • 右分支顶行中的节点有自己的样式,链名称不同
  • 蓝色节点也有自己的样式。由于适合某些坐标的节点中的文本不再居中,因此利用位于节点中心的标签来定位文本。

如果右侧分支中的节点中的文本包含多行文本,则可以将其添加到节点样式中text widthalign=center或左侧,取决于您想要的对齐方式)。

相关内容