Combinando conceitos/bibliotecas Tikz para desenhar uma imagem complexa com alinhamento/distâncias relativas

Combinando conceitos/bibliotecas Tikz para desenhar uma imagem complexa com alinhamento/distâncias relativas

Eu acho que todos osproblemasfoi perguntado por mim ou por outras pessoas no passado. Mas o meu problema geral é que não sou capaz de combinar todas estas soluções com a imagem real que quero desenhar. Normalmente é bom separar um problema complexo em outros mais simples e perguntar. Mas aqui tento fazer a pergunta complexa porque experimentei que as soluções influenciam-se (no meu caso negativamente) umas às outras.

insira a descrição da imagem aqui

Descrição das necessidades/problemas:

  1. Os nós esquerdos ( Phase) devem ser girados. Eu preferiria uma solução com \rotatebox( node contents={\rotatebox{90}{#1}}}).
  2. Os nós (melhor serialinhas) à direita estão centralizados na horizontal.
  3. Lógico que a imagem tem quatrolinhase os nós à esquerda e à direita precisam exibir isso. Isso significa que um nó (por exemplo right of B) está centralizado verticalmentecontraseu nó esquerdo. Por favor, veja que PhaseCpertence a C1e C2, long C3para que o alinhamento vertical represente isso. (discutido aqui)
  4. Conectar os nós com seta não deveria ser tão difícil, eu acho.
  5. Tudo tem que ser feito de forma relativa. Isso significa não cm, mmou ptalgo parecido.
  6. O número de nós não é fixo. Pode ser que na linha um haja menos nós do que na linha quatro.

Algumas soluções:

\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}

Produza isso

insira a descrição da imagem aqui

Os números 2 e 5 não foram cumpridos. E acho que o número 6 causaria problemas no futuro.

Responder1

Veja como eu provavelmente faria isso. Não sugiro que esta seja uma solução óbvia, mas o código é sucinto e pode ser facilmente ajustado para todo o diagrama.

diagrama rotulado

Se alguém quiser experimentar em casa, me avise e lhe darei uma cópia do pacote experimental que utiliza. (Espero levar sua irmã para o CTAN em breve, e talvez esta também, mas ainda não chegou.)

Isso usaflorestaversão 2. Não foi testado com a versão 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}

Responder2

Seu MWE compila sem erros, mas o resultado parece ser diferente do seu esboço ... Como você já obteve respostas para suas perguntas semelhantes, cuja resposta também resolve os problemas que você enfatizou na pergunta, fiz (com base nas minhas respostas anteriores) o seguinte fluxograma :

insira a descrição da imagem aqui

com o seguinte código:

\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}

O código para ele é projetado nas seguintes suposições:

  • a linha mais larga no galho direito é a linha superior, então o galho esquerdo está alinhado com seu lado esquerdo
  • nós na primeira linha nas cadeias da direita estão na cadeia indo para a direita
  • o ramo direito está abaixo do centro da primeira linha. Pode ser simplesmente determinado por $(MR-1.south west)!0.5!(MR-4.south east)$. Os nós nele estão em cadeia e vão abaixo
  • na última linha há apenas dois nós, portanto eles estão posicionados em relação ao nó acima dela
  • os nós azuis no ramo esquerdo são posicionados em relação ao lado esquerdo da primeira linha e o posicionamento dos nós pertencentes ao ramo direito, com exceção do nó, "Fase C", que se ajusta às coordenadas determinadas por (ML1 |- MB-2.north)e (ML1 |- MB-4.south)onde ML1 é a coordenada do topo nó azul e MB-2nomes MB-4dos nós pertencentes na ramificação direita
  • nós não estão na grade
  • nós na linha superior, ramo direito com estilo próprio, que diferem no nome da cadeia
  • nós azuis também têm estilo próprio. Como o texto nos nós, que se ajusta a algumas coordenadas, não está mais centralizado, para o texto é explorado o rótulo posicionado no centro do nó.

Caso o texto nos nós da ramificação direita tenha texto em mais linhas, do que você pode adicionar ao estilo do nó text widthe align=center(ou à esquerda, depende do que você gosta de alinhar).

informação relacionada