Cluster im Szenariobaum darstellen

Tabellen und Grafiken erstellen und anordnen


Broki2

Cluster im Szenariobaum darstellen

Beitrag von Broki2 »

Hallo,

ich würde gerne einen Szenariobaum in mein Latex Dokument einfügen, der einen Clusteralgorithmus darstellt, also erst einfach nur eine Aneinanderreihung von Scenarios darstellt, die dann im Anschluss zusammengefasst werden. Das soll ungefähr so aussehen, wie Figure 3 in http://www.scs-europe.net/conf/ecms2007 ... s_0078.pdf. Ich nutze für Szenariobäume bis jetzt immer das Paket tikzpicture, aber ich bekomme es nicht hin, Kanten einzufügen, die nicht vom parent node kommen und außerdem würde ich gerne Kästchen machen, die über mehrere Knoten einer Stufe gehen.

Vielen Dank.

Broki

Benutzeravatar
Stefan Kottwitz
Admin
Admin
Beiträge: 2759
Registriert: Di 8. Jul 2008, 00:39
Kontaktdaten:

Beitrag von Stefan Kottwitz »

Hallo Broki,

da Du schon mit TikZ solche Bäume erstellt hast, poste doch mal so ein Beispiel. Anhand dessen kann man das ja vielleicht lösen. Sonst ist es ja eher theoretisch.

Stefan

Broki2

Antwort

Beitrag von Broki2 »

Hey Stefan,

danke für deine schnelle Antwort, hier ein Minimalbeispiel:
\documentclass{article}
\usepackage[latin1]{inputenc}
\usepackage{tikz}
\usetikzlibrary{trees, arrows}
\begin{document}

\begin{figure}
\center
% Set the overall layout of the tree
\tikzstyle{level 1}=[level distance=3.5cm, sibling distance=3.5cm]
\tikzstyle{level 2}=[level distance=3.5cm, sibling distance=1.0cm]

% Define styles for bags and leafs
\tikzstyle{bag} = [circle,draw,solid]
\tikzstyle{end} = [circle,draw,solid]

% The sloped option gives rotated edge labels. Personally
% I find sloped labels a bit difficult to read. Remove the sloped options
% to get horizontal labels.
\begin{tikzpicture}[grow=right, sloped]
\node[bag] {$0$}
    child {
        node[bag] {$6$}        
            child {
                node[bag]{$12$}
                edge from parent
                node[above] {}
                node[below]  {}
            }
            edge from parent[dashed]  
            node[above] {}
            node[below]  {}
    }
    child {
        node[bag] {$5$}        
        child {
                node[bag]{$11$}
                edge from parent[dashed]
                node[above] {}
                node[below]  {}
            }
            edge from parent  
            node[above] {}
            node[below]  {}
    }
    child {
        node[bag] {$4$}        
        child {
                node[bag]{$10$}
                edge from parent
                node[above] {}
                node[below]  {}
            }
            edge from parent[dashed]  
            node[above] {}
            node[below]  {}
    }
    child {
        node[bag] {$3$}        
        child {
                node[bag]{$9$}
                edge from parent
                node[above] {}
                node[below]  {}
            }
            edge from parent[dashed]  
            node[above] {}
            node[below]  {}
    }
    child {
        node[bag] {$2$}        
        child {
                node[bag]{$8$}
                edge from parent[dashed]
                node[above] {}
                node[below]  {}
            }
            edge from parent  
            node[above] {}
            node[below]  {}
    }
    child {
        node[bag] {$1$}        
        child {
                node[bag]{$7$}
                edge from parent
                node[above] {}
                node[below]  {}
            }
            edge from parent[dashed] 
            node[above] {}
            node[below]  {}
    };
\end{tikzpicture}
\end{figure}

\end{document}
Jetzt hätte ich gerne Folgendes:

- Jeweils ein Kästchen um die Knoten (1,2,3), (4,5,6), (7,8), (9), (10), (11,12)
- Jeweils eine nicht gestrichelte Line, die folgende Kästchen verbindet, am besten mittig ins jeweilige Kästchen:
(1,2,3) mit (7,8)
(1,2,3) mit (9)
(4,5,6) mit (10)
(4,5,6) mit (11,12)

Klingt kompliziert, oder? :D Glaubst du, das ist möglich?

Danke für deine Hilfe

Broki

Benutzeravatar
Stefan Kottwitz
Admin
Admin
Beiträge: 2759
Registriert: Di 8. Jul 2008, 00:39
Kontaktdaten:

Beitrag von Stefan Kottwitz »

Sobald man den Nodes Namen gibt, oder wenigstens teilweise bzw. der Wurzel und die implizite Benennung verwendet, sollte man frei Linien zeichnen können. Kästchen kann man dann mit der fit-Bibliothek hinzufügen.

Ich hänge hier schonmal das Bild zu Deinem obigem Code rein, als Komfort für die Leser. Bin noch etwas beschäftigt.

Bild

Stefan
Dateianhänge
baum.png
baum.png (16.94 KiB) 2135 mal betrachtet

Benutzeravatar
Stefan Kottwitz
Admin
Admin
Beiträge: 2759
Registriert: Di 8. Jul 2008, 00:39
Kontaktdaten:

Beitrag von Stefan Kottwitz »

Hier mal ein Vorschlag.
  • Alle Knoten benannt wie ihren Inhalt zur leichteren Referenzierung
  • Mit fit = ... (fit library) die Kästen drum gezeichnet, als neue nodes (Stil box), und mit x-y-z benannt je nach verbundenen Nodes
  • Stile mal als lokale Optionen für das Bild angegeben, da sie eh in der figure-Umgebung standen; sollten sie global sein, würde ich das mit \tikzset{...} machen
  • Kästen-Knoten wie normale Nodes durch Linien verbunden
  • minimum width für bag und end sorgen für gleiche Größe, egal ob 1 oder 10 drin steht
  • \centering statt center
  • aus Spaß mal mit Farbe gefüllt
  • den background layer verwendet mit library backgrounds, damit unterhalb der Knoten der später erzeugte Kasten gefüllt wird, also ohne den Knoten zu überschreiben
\documentclass{article} 
\usepackage[latin1]{inputenc} 
\usepackage{tikz} 
\usetikzlibrary{trees, arrows, fit, backgrounds} 
\begin{document} 

\begin{figure} 
\centering
\begin{tikzpicture}[grow=right, sloped,
    level 1/.style = { level distance=3.5cm,
                       sibling distance=3.5cm },
    level 2/.style = { level distance=3.5cm,
                       sibling distance=1.0cm },
    bag/.style     = { circle, draw, solid,
                       minimum width=5ex, fill=blue!20 },
    end/.style     = { circle, draw, solid,
                       minimum width=5ex },
    box/.style     = { draw, rectangle, rounded corners,
                       inner sep=1.5ex, fill=red!10} ] 
\node[bag] (0) {$0$} 
    child { 
        node[bag] (6) {$6$}         
            child { 
                node[bag] (12) {$12$} 
                edge from parent 
                node[above] {} 
                node[below]  {} 
            } 
            edge from parent[dashed]   
            node[above] {} 
            node[below]  {} 
    } 
    child { 
        node[bag] (5) {$5$}         
        child { 
                node[bag] (11) {$11$} 
                edge from parent[dashed] 
                node[above] {} 
                node[below]  {} 
            } 
            edge from parent   
            node[above] {} 
            node[below]  {} 
    } 
    child { 
        node[bag] (4) {$4$}         
        child { 
                node[bag] (10) {$10$} 
                edge from parent 
                node[above] {} 
                node[below]  {} 
            } 
            edge from parent[dashed]   
            node[above] {} 
            node[below]  {} 
    } 
    child { 
        node[bag] (3) {$3$}         
        child { 
                node[bag] (9) {$9$} 
                edge from parent 
                node[above] {} 
                node[below]  {} 
            } 
            edge from parent[dashed]   
            node[above] {} 
            node[below]  {} 
    } 
    child { 
        node[bag] (2) {$2$}         
        child { 
                node[bag] (8) {$8$} 
                edge from parent[dashed] 
                node[above] {} 
                node[below]  {} 
            } 
            edge from parent   
            node[above] {} 
            node[below]  {} 
    } 
    child { 
        node[bag] (1) {$1$}         
        child { 
                node[bag] (7) {$7$} 
                edge from parent 
                node[above] {} 
                node[below]  {} 
            } 
            edge from parent[dashed] 
            node[above] {} 
            node[below]  {} 
    }; 
\begin{scope}[on background layer]
  \node (1-2-3) [box, fit = (1) (2) (3)] {};
  \node (4-5-6) [box, fit = (4) (5) (6)] {};
  \node (7-8)   [box, fit = (7) (8) ]    {};
  \node (9-9)   [box, fit = (9)]         {};
  \node (10-10) [box, fit = (10)]        {};
  \node (11-12) [box, fit = (11) (12)]   {};
\end{scope}
  \draw (7-8) -- (1-2-3) -- (9-9)
        (11-12) -- (4-5-6) -- (10-10);
\end{tikzpicture} 
\end{figure} 

\end{document} 
 
Bild

Stefan
Dateianhänge
tikz-baum.png
tikz-baum.png (23.1 KiB) 2151 mal betrachtet

Broki2

Danke

Beitrag von Broki2 »

Hey Stefan,

das ging schnell und ist perfekt. Hab vielen Dank für die Hilfe!

Viele Grüße

Jelto

Antworten