Erstellen Sie ein Flussdiagramm in Latex

Erstellen Sie ein Flussdiagramm in Latex

Bildbeschreibung hier eingeben

Wie erstelle ich ein solches Flussdiagramm in Latex? Bisher ist es mir nicht gelungen, auch nur annähernd etwas Ähnliches zu erreichen. Mein Code lautet wie folgt.

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

ERGEBNIS

Antwort1

Hier ist eine forestLösung.

Bildbeschreibung hier eingeben

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

Antwort2

Es gibt viele Möglichkeiten, dies zu tun, z. B. die Verwendung des child-Ansatzes aus dem PGF-Handbuch, die Verwendung des Pakets forest, die Verwendung von matrixzum Platzieren von Knoten, die Verwendung von Tiklzlibrary positioningusw.

Wenn Sie Anfänger sind, empfehle ich, es eher Objekt für Objekt und mit einem hohen Maß an Kontrolle zu tun. Im Wesentlichen also Folgendes:

  • Platzieren Sie die Knoten auf sinnvolle Weise
  • zeichnet erforderliche Verbindungen

Ich habe die relevanten Schritte in den Kommentaren dokumentiert, mit Schwerpunkt auf dem interessanten Teil in der Mitte. Ichvorschlagenum diese zu Trainingszwecken von Grund auf zu wiederholen und zu sehen, wie sich der Code von einfach zu ausgefeilt entwickelt. Ichvorschlagenum diese Befehle parallel im pgfmanual nachzuschlagen.

Der erste Code zeigt das Ergebnis, wenn Sie mit Platzierung und Verbindungen fertig sind. Der zweite Code befasst sich mit der Verschönerung, d. h. dem Hinzufügen von Farbe usw.

Es stehen mehrere Parameter zur Anpassung zur Verfügung. Außer den Branches sind diese alle im Style-Bereich lokalisiert. Änderungen dort werden also fast immer richtig ausgeführt. Die Parameter für die Branches könnten und sollten in einen \newcommandfür weiteres Refactoring verschoben werden.

Knoten und Verbindungen fertigstellen

Beginnen Sie rückwärts und arbeiten Sie sich von den am weitesten rechts stehenden Kindern zur Wurzel vor.

Das Drehen des Wurzelknotens ist schwierig, deshalb habe ich es vorerst so gelassen, wie es ist.

Zu den Anschlüssen gibt es zwei Dinge:

  • ein auskommentierter Versuch, um auf guten Code zu prüfen, und Refactoring in eine Schleife unter Verwendung von Knotenpaaren (also deren Namen)
  • dasselbe gilt für die Zweige, wobei ein Zwischenpunkt als relative Koordinate eingeführt wird

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}

Verschönern

Das ist mittlerweile fast langweilig:

  • Definieren Sie Stile für die verschiedenen Ebenen
  • Fügen Sie die genannten Stile zu den entsprechenden Knoten hinzu

Es kann eine gute Idee sein, die Versuche tatsächlich zu löschen, wenn Sie dem Diagramm weitere hinzufügen. Folgen Sie dazu einfach den Mustern:

  • neuer Knoten, jetzt mit korrekten Stilkombinationen und neuen Knotennamen
  • Hinzufügen der erforderlichen Verbindungen zu beiden \draw-Loops
  • Machen Sie dabei kleine Schritte, um Probleme frühzeitig zu erkennen und zu beheben

ICHvorschlagenzu überdenken, OB es eine gute Idee ist, mehrzeiligen Text einzuführen. Obwohl es möglich ist, müssen Sie wahrscheinlich mehrere Stile neu anpassen, vielleicht sogar einige Ansätze ändern. Normalerweise gilt: weniger ist mehr – mehr oder weniger ...

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}

verwandte Informationen