Crear un diagrama de flujo en látex.

Crear un diagrama de flujo en látex.

ingrese la descripción de la imagen aquí

¿Cómo crear un diagrama de flujo como este en látex? Hasta ahora no he podido lograr nada parecido a esto. Mi código es el siguiente.

    \documentclass{article}
    \usepackage{tikz}
    
    \begin{document}
    
    \begin{tikzpicture}[node distance=2cm, auto,
      level1/.style={rectangle, draw, fill=red!20, rounded corners, text width=4em, text centered, minimum height=2em},
      level2/.style={rectangle, draw, fill=blue!20, rounded corners, text width=4em, text centered, minimum height=2em},
      level3/.style={rectangle, draw, fill=green!20, rounded corners, text width=4em, text centered, minimum height=2em}]
    
      % Root node
      \node [level1] (root) {Root};
    
      % Level 2 nodes
      \node [level2, right of=root] (node1) {Node 1};
      \node [level2, right of=node1] (node2) {Node 2};
      \node [level2, right of=node2] (node3) {Node 3};
      \node [level2, right of=node3] (node4) {Node 4};
      \node [level2, right of=node4] (node5) {Node 5};
    
      % Level 3 nodes
      \node [level3, below of=node1, yshift=-1cm] (child1) {Child 1};
      \node [level3, below of=node2, yshift=-1cm] (child2) {Child 2};
      \node [level3, below of=node3, yshift=-1cm] (child3) {Child 3};
      \node [level3, below of=node4, yshift=-1cm] (child4) {Child 4};
      \node [level3, below of=node5, yshift=-1cm] (child5) {Child 5};
    
      % Arrows
      \foreach \from in {root}
        \foreach \to in {node1, node2, node3, node4, node5}
          \draw [->] (\from) -- (\to);
      \foreach \from in {node1, node2, node3, node4, node5}
        \foreach \to in {child1, child2, child3}
          \draw [->] (\from) -- (\to);
    
    \end{tikzpicture}
    
    \end{document}

RESULTADO

Respuesta1

Aquí hay una forestsolución.

ingrese la descripción de la imagen aquí

\documentclass{article}

\usepackage{forest}
\useforestlibrary{edges}

\begin{document}

\begin{forest}
forked edges,
for tree={
    grow'=0,
    align=center,
    minimum width=3cm,
    anchor=center,
    inner xsep=3mm,
    rounded corners,
    font=\small,
    if level=1{fill=orange, text=white}
        {if level=2{fill=brown, text=white}{draw=red}}
}
[Root node, rotate=90, fill=red, text=white
    [level 1 node
        [level 2 node
            [Some very long reference]
        ]
        [level 2 node
            [Some very long reference\\with two lines]
        ]
    ]
    [level 1 node
        [level 2 node
            [Another even longer reference\\with two lines]
        ]
        [level 2 node
            [Some very long reference\\with two lines]
        ]
        [level 2 node\\has two lines
            [Some reference[Another reference]]
            [Some reference\\with two lines[Another reference\\with two lines]]
        ]
    ]
    [level 1 node
        [level 2 node
            [A very very very long long long reference\\with two lines]
        ]
        [level 2 node
            [A very very very long long long reference]
        ]
    ]
    [level 1 node
        [level 2 node
            [A very very very long long long reference]
        ]
        [level 2 node
            [A long reference]
        ]
    ]
    [level 1 node
        [level 2 node
            [A very very very long long long reference]
        ]
        [level 2 node
            [A very very very long long long reference]
        ]
    ]
]
\end{forest}

\end{document}

Respuesta2

Hay muchas formas de hacerlo, por ejemplo, usando el childenfoque - del pgfmanual, usando package forest, usando a matrixpara colocar nodos, usando tiklzlibrary positioning, etc.

Cuando eres principiante te sugiero hacerlo más objeto por objeto, con un alto grado de control. Entonces básicamente lo siguiente:

  • poner los nodos de una manera razonable
  • dibuja las conexiones requeridas

Documenté los pasos relevantes en los comentarios, centrándome en la parte interesante del medio. Isugeririntentar repetirlos desde cero por motivos de capacitación y ver cómo el código evoluciona de simple a refinado. Isugerirpara buscar estos comandos en paralelo en el pgfmanual.

El primer código muestra el resultado, una vez que haya terminado con la ubicación y las conexiones. El segundo es un combate de embellecimiento, es decir, introducir color, etc.

Hay varios parámetros para realizar ajustes. Además de las ramas, todas están localizadas en la sección de estilo. Así que los cambios casi siempre salen bien. El de las ramas podría y debería trasladarse a un \newcommandpara una mayor refactorización.

Realizar nodos y conexiones

Comenzando hacia atrás, trabaje desde los elementos secundarios más a la derecha hasta la raíz.

Rotar el nodo de raíces es complicado, así que lo dejé como está por ahora.

Para las conexiones hay dos cosas:

  • Pruebas comentadas, para comprobar si hay un buen código y refactorización en un bucle, utilizando pares de nodos (bueno, sus nombres).
  • Lo mismo para las ramas, introduciendo un punto intermedio como coordenada relativa.

res1

% ~~~ makes development much easier ~~~~~~~~~~~~~~~~~~
\documentclass[10pt,border=3mm,tikz]{standalone}

% ~~~ PROCESS ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
%       care for positioning text, first
% 1)    start with node at (0,0), ignoring all colors etc.
% 2)    put next node above it, introduce style up
% 3)    continue, introduce style and nodes for dn
% 4)    introduce brown child level as nodes + style lft
% 4b)   making nodes width the same, i.e. adjust style lft
% 5)    introducing orange children, style lftb reuses lft
% 6)    introducing ROOT and extra
% 7)    adding simple and branched connections


\begin{document}
 \begin{tikzpicture}[% ~~~ introducing styles as suitable
        up/.style={draw,anchor=south west,yshift=2mm},
        dn/.style={draw,anchor=north west,yshift=-2mm},
        lft/.style={draw,anchor=east,xshift=-4mm,minimum width=2cm},
        lftb/.style={lft,minimum width=32mm,yshift=-4mm},
        rt/.style={draw,anchor=west,xshift=4mm},
        root/.style={draw,xshift=-10mm,yshift=-9mm,
                     rotate=0,anchor=east},
    ]
 
    % ~~~ starting backwards with "rightmost" child level ~~~
    % ~~~ upwards
    \node[draw] (D0) at (0,0)           {Denoisung};
    \node[up]   (D1) at (D0.north west) {HDR};
    \node[up]   (D2) at (D1.north west) {Semantic NeRF};

    % ~~~ downwards
    \node[dn]   (D-1) at (D0.south west) {GIRAFFE};
    \node[dn]   (D-2) at (D-1.south west){Dream Fusion};
    
    % ~~~ brown children ~~~~~
    \node[lft]  (C-1) at (D-2.west)      {Diffusion};
    \node[lft]  (C1)  at (D1.west)       {Semantics};
    \node[lft]  (C2)  at (D2.west)       {Editing};
    % ~~~ this one is special ~~~~~~~~~
    \node[lft,yshift=-4mm] (C0)  at (D0.west) {Functional};
    
    % ~~~ orange children ~~~~~~~~~~    
    \node[lftb] (B0) at (C0.west)        {Generative Models};
    \node[lftb] (B1) at (C2.west)        {Image Processing};
    
    % ~~~ ROOT ~~~~~~~~~~
    \node[root] (RT) at (B1.west) {Applications};
    
    % ~~~ extra ~~~~~~~~~
    \node[rt] (X0) at (D0.east) {RawNeRF};
    
    % ~~~ SIMPLE connections ~~~~~~~~~
%   \draw (C2) -- (D2); 
%   \draw (C1) -- (D1); 
%   now refactored, i.e. as loop
    \foreach \a/\b in {C2/D2, C1/D1, D0/X0, C-1/D-2}
        \draw (\a) -- (\b);
    
    % ~~~ branched connections ~~~~~~~~
%   \draw (C0.east) -- +(.2,0) |-  (D0.west);
%   \draw (C0.east) -- +(.2,0) |-  (D-1.west);
%   now refactored, i.e. as loop
    \foreach \a/\b in  {C0/D0, C0/D-1,
                        B1/C2, B1/C1, B0/C0, B0/C-1,
                        RT/B1, RT/B0}
        \draw (\a.east) -- +(.2,0) |- (\b.west);    
    
 \end{tikzpicture}
\end{document}

embellecer

Esto es casi aburrido ahora:

  • definir estilos para los distintos niveles
  • agregue dichos estilos a los nodos relevantes

Puede ser una buena idea eliminar las pruebas cuando agregue más al diagrama. Para hacerlo, simplemente siga los patrones:

  • Nuevo nodo, ahora con combinaciones de estilos correctas y nuevos nombres de nodos.
  • agregando las conexiones requeridas a ambos \drawbucles
  • Tome pequeños pasos al hacerlo, para reconocer y solucionar problemas temprano.

Isugerirpara repensar, SI es una buena idea introducir texto de varias líneas. Aunque es posible, es probable que tengas que reajustar varios estilos, tal vez incluso cambiar algunos enfoques. Generalmente: menos es más, más o menos...

res2

% ~~~ makes development much easier ~~~~~~~~~~~~~~~~~~
\documentclass[10pt,border=3mm,tikz]{standalone}

% ~~~ PROCESS ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
%       now let's take care of colors and shapes
% 8)    define styles nd etc. AND add to the relevant nodes


\begin{document}
 \begin{tikzpicture}[% ~~~ introducing styles as suitable
        up/.style={draw,anchor=south west,yshift=2mm},
        dn/.style={draw,anchor=north west,yshift=-2mm},
        lft/.style={draw,anchor=east,xshift=-4mm,
                    minimum width=2cm},
        lftb/.style={lft,minimum width=32mm,yshift=-4mm},
        rt/.style={draw,anchor=west,xshift=4mm},
        root/.style={draw,xshift=-10mm,yshift=-9mm,
                     rotate=0,anchor=east},
        % ~~~ now the colors etc. ~~~~~~~~~~
        nd/.style={draw=red,rounded corners},
        nc/.style={draw=none,rounded corners,fill=brown!30},
        nb/.style={draw=none,rounded corners,fill=orange!30},
        nr/.style={draw=none,rounded corners,fill=red,
                   text=white,},% not recommended !
    ]
 
    % ~~~ starting backwards with "rightmost" child level ~~~
    % ~~~ upwards
    \node[draw,nd] (D0) at (0,0)           {Denoisung};
    \node[up,nd]   (D1) at (D0.north west) {HDR};
    \node[up,nd]   (D2) at (D1.north west) {Semantic NeRF};

    % ~~~ downwards
    \node[dn,nd]   (D-1) at (D0.south west) {GIRAFFE};
    \node[dn,nd]   (D-2) at (D-1.south west){Dream Fusion};
    
    % ~~~ brown children ~~~~~
    \node[lft,nc]  (C-1) at (D-2.west)      {Diffusion};
    \node[lft,nc]  (C1)  at (D1.west)       {Semantics};
    \node[lft,nc]  (C2)  at (D2.west)       {Editing};
    % ~~~ this one is special ~~~~~~~~~
    \node[lft,yshift=-4mm,nc] (C0)  at (D0.west) {Functional};
    
    % ~~~ orange children ~~~~~~~~~~    
    \node[lftb,nb] (B0) at (C0.west)         {Generative Models};
    \node[lftb,nb] (B1) at (C2.west)         {Image Processing};
    
    % ~~~ ROOT ~~~~~~~~~~
    \node[root,nr] (RT) at (B1.west) {Applications};
    
    % ~~~ extra ~~~~~~~~~
    \node[rt,nd] (X0) at (D0.east) {RawNeRF};
    
    % ~~~ SIMPLE connections ~~~~~~~~~
%   \draw (C2) -- (D2); 
%   \draw (C1) -- (D1); 
%   now refactored, i.e. as loop
    \foreach \a/\b in {C2/D2, C1/D1, D0/X0, C-1/D-2}
        \draw (\a) -- (\b);
    
    % ~~~ branched connections ~~~~~~~~
%   \draw (C0.east) -- +(.2,0) |-  (D0.west);
%   \draw (C0.east) -- +(.2,0) |-  (D-1.west);
%   now refactored, i.e. as loop
    \foreach \a/\b in  {C0/D0, C0/D-1,
                        B1/C2, B1/C1, B0/C0, B0/C-1,
                        RT/B1, RT/B0}
        \draw (\a.east) -- +(.2,0) |- (\b.west);    
    
 \end{tikzpicture}
\end{document}

información relacionada