Flussdiagramm/smartdiagram mit unterschiedlichen Node-Größen

Tabellen und Grafiken erstellen und anordnen


stefan_o
Forum-Newbie
Forum-Newbie
Beiträge: 2
Registriert: Sa 7. Mai 2016, 01:55

Flussdiagramm/smartdiagram mit unterschiedlichen Node-Größen

Beitrag von stefan_o »

Hallo,
ich versuche ein Fluss- / Ablaufdiagramm mit TikZ zu machen, leider bekomme ich es nicht hin. Was ich haben möchte:

Rechteckige Nodes, die je nach Kategorie (manuell zugewiesen) eine andere Farbe haben. Die Nodes sollen jeweils einfach mit einem Pfeil verbunden sein. Zusätzlich soll es weitere Nodes geben können, die mit gestrichelten Pfeilen mit einem dieser Nodes verbunden sind (können auch mehrere pro Node sein). Die Größe der Nodes soll variabel sein, die Abstände möglichst gleichmäßig. Ich habe ein smartdiagramm-Beispiel abgeändert (in Paint...) damit man sieht was ich meine.

Ich habe es manuell probiert, das ist unglaublich umständlich und sobald ich die Nodes unterschiedlich breit mache klappt das mit Abständen gar nicht mehr und mit smartdiagram bekomme ich nichts komplexeres als in den Beispielen hin.

Wie bekommt man sowas hin? Ich möchte nicht jedes Node manuell positionieren, da es am Ende sicher 50 oder so geben wird und wenn ich dann eins entferne möchte ich nicht 30 ändern müssen.

Meine aktuelle Lösung ist LibreOffice Impress, als PDF drucken und in das Dokument einbinden, aber das Ergebnis gefällt mir überhaupt nicht (Schriften passen nicht etc.)

Vielen Dank
Stefan
Dateianhänge
diagramm.png
diagramm.png (17.3 KiB) 1877 mal betrachtet

Beinschuss
Forum-Meister
Forum-Meister
Beiträge: 808
Registriert: Di 2. Okt 2012, 21:42
Wohnort: NRW

Beitrag von Beinschuss »

Das Beispiel aus Deiner Datei ist mit tikz recht leicht hinzubekommen. Ein Ausgangspunkt könnte http://www.texample.net/tikz/examples/s ... low-chart/ sein. Smartdiagram ist dann hilfreich, wenn man sich an die Vorlagen hält. Stefan hat letztens eine sinnvolle Vorgehensweise skizziert: http://golatex.de/viewtopic,p,79590.html#79590. Ansonsten: Erstelle bitte ein Minimalbeispiel, das Dein Problem zeigt.

stefan_o
Forum-Newbie
Forum-Newbie
Beiträge: 2
Registriert: Sa 7. Mai 2016, 01:55

Beitrag von stefan_o »

Hallo,
danke für die Antwort, hier ein Minimalbeispiel:
\documentclass[fontsize=12pt,paper=a4]{scrartcl}
\usepackage{tikz} 
\usetikzlibrary{calc}
\usetikzlibrary{shapes,arrows}
\usetikzlibrary{decorations.pathmorphing}
\usepackage[paper=a4paper,bottom=25mm, left=30mm, top=25mm, right=30mm]{geometry}
\begin{document}
\tikzstyle{line} = [draw, -latex']
\tikzstyle{anode} = [rectangle, draw, fill=red!20, node distance=3cm,
   text centered, rounded corners, minimum height=4em]
\tikzstyle{bnode} = [rectangle, draw, fill=green!20, node distance=3cm,
    text width=5em, text centered, rounded corners, minimum height=4em] 
\begin{tikzpicture}[node distance = 2cm, auto]
	\node[anode] (sehrlang) {Hier steht ein sehr langer Eintrag};
	\node[anode, right of=sehrlang] (kurz) {Kurz};
	\node[anode, right of=kurz] (lang) {Langer Eintrag};
	\node[bnode, below of=kurz] (kurz2) {Kurz2};
	\node[bnode, below left of=lang] (mittellang) {Mittellang};
	\node[bnode, below right of=lang] (irgendwas) {Irgendwas};
    \path [line] (sehrlang) -- (kurz);
    \path [line] (kurz) -- (lang);
    \path[line,dashed] (kurz2) -- (kurz);
    \path[line,dashed] (mittellang) -- (lang);
    \path[line,dashed] (irgendwas) -- (lang);
\end{tikzpicture}
\end{document}
Was ich erreichen möchte ohne absolute Positionen oder Einzelfalllösungen (am Ende gibt es ca. 50 Nodes), dass die Nodes immer einen Minimalabstand halten, aber dabei so dicht wie möglich kommen.

esdd
Forum-Meister
Forum-Meister
Beiträge: 2561
Registriert: So 7. Feb 2010, 16:36

Beitrag von esdd »

Mit TikZ gibt es sehr oft verschiedene Wege, die zum Ziel führen. Welchen man wählt, hängt vom ganz konkreten Einzelfall ab. Für Dich sind eventuell die TikZ Bibliotheken positioning und matrix von Interesse.

Hier ist mal ein Beispiel mit positioning, die die Angabe der Abstände zwischen den Nodes ermöglicht. Beachte die dabei zu right = of ... geänderte Syntax.
\documentclass[fontsize=12pt,paper=a4]{scrartcl}
\usepackage[ngerman]{babel} 
\usepackage[vmargin=25mm, hmargin=30mm]{geometry} 
\usepackage{tikz} 
\usetikzlibrary{calc} 
\usetikzlibrary{arrows.meta}

\usetikzlibrary{positioning}

\tikzset{
  >=Latex,
  line/.style={draw,->},
  anode/.style={rectangle,draw,fill=red!20,
    align=center,rounded corners,minimum height=4em,font=\strut},
  bnode/.style={anode,fill=green!20,text width=5em}
}


\begin{document} 
\begin{tikzpicture}
  \path[nodes=anode,node distance=2cm]
    node (sehrlang) {Hier steht ein\\sehr langer Eintrag}
    node [right=of sehrlang](kurz){Kurz}
    node [right=of kurz](lang){Langer Eintrag}
  ;
  \path[nodes=bnode,node distance=1cm and .5em]
    node[below= of kurz](kurz2) {Kurz}
    node[below left= of lang.south](mittellang){Mittellang}
    node[below right= of lang.south](irgendetwas){\hspace*{0pt}Irgend"-etwas}
  ;
  \path [every edge/.append style=line]
    (sehrlang) edge (kurz)
    (kurz) edge (lang)
  ;
  \path [every edge/.append style={line,dashed}]
    (kurz2) edge (kurz)
    (mittellang) edge (lang)
    (irgendetwas) edge (lang)
  ;
\end{tikzpicture} 
\end{document}
Bild
Dateianhänge
gl_nodesposition.png
gl_nodesposition.png (9.78 KiB) 1820 mal betrachtet

Antworten