Ich möchte solch einen Graphen malen: Seite 8 von diesem PDF

Graph

Gibt es da so eine Funktion à la: Die und die Knoten in die erste Reihe, diejenigen in die zweite etc. Und dann alle verbinden und zentrieren, damit dann das Resultat entsprechend dem angegebenen PDF ist?

gefragt 24 Okt '13, 20:51

mrbela's gravatar image

mrbela
41223
Akzeptiert-Rate: 0%

konvertiert 24 Okt '13, 21:39

stefan's gravatar image

stefan ♦♦
18.1k143048

Das sieht genauso aus wie die Graphen in dieser Frage auf TeX.sx, statt Einsen und Nullen werden halt Buchstaben verwendet (oder nicht).

Wie automatisch sollte es denn sein? Soll TikZ selbst die Nodes erstellen (wie in meiner Antwort der verlinkten Frage) oder wärst du damit zufrieden, wenn du TikZ einfach die Sets fütterst (wie in Mark Wibrows Antwort), das wäre dann auch einfacher anzuordnen.

Um das perfekt zu zentrieren, bräuchte man eben schon bei der ersten Node die Breite der Nodes sowie die Anzahl (und selbstvertändlich deren Abstand).

(24 Okt '13, 22:05) Qrrbrbirlbel
2

Ich wuerde erwarten, dass die die "Graph Drawing library" von der aktuellen PGF unstable (die demnaechst voraussichtlich veroeffentlich wird) sowas automatisch kann - mit lediglich einer adjazenzliste/matrix als input und einer angabe, wie das zu plazieren ist. Falls das fuer Dich was ist, koenntest Du vielleicht die unstable lokal installieren und es ausprobieren.

(03 Nov '13, 20:32) cfeuersaenger

Gibt es denn eine solche Built-In Funktion?! Ich konnte nichts finden, bin aber auch n völliger Newbe auf dem Gebiet..!

Ich danke für Eure Hilfe!

(19 Nov '13, 16:57) mrbela

So ein Graph lässt sich in der Tat bequem mit der neuen Graph Drawing Library zeichnen, wie Christian in einem Kommentar angemerkt hat. Es folgt mein erster Graph mit dieser Library. Es ist mir nicht gelungen, die Schichten ebenso vertikal anzuordnen wie im Bild der Frage... :( Dennoch zeigt das Beispiel das Potential der Library meines Erachtens recht gut:

Open in writeLaTeX
% arara: lualatex
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{graphs,graphdrawing,shapes.geometric}
\usegdlibrary{force,layered}

\begin{document}

\begin{center}
\begin{tikzpicture}
\graph[
  layered layout,
  level distance = 1.2cm,
  nodes={
    draw, ellipse,
    minimum width = 1cm, minimum height = 5mm,
    inner sep = 0pt,
    font = \footnotesize
  } ,
  ]{
  null -- {
    a -- {
      ab -- {
        abc -- {
          abcd -- { abcde } , abce -- { abcde }
        } ,
        abd -- { abcd , abde -- { abcde } } ,
        abe -- { abce , abde }
      } ,
      ac -- {
        abc ,
        acd -- { abcd , acde -- { abcde } } ,
        ace -- { abce , acde }
      } ,
      ad -- { abd , acd , ade -- { abde , acde } } ,
      ae -- { abe , ace , ade } ,
    } ,
    b -- {
      ab ,
      bc -- {
        abc ,
        bcd -- { abcd , bcde -- { abcde } } ,
        bce -- { abce , bcde }
      } ,
      bd -- { abd , bcd , bde -- { abde , bcde } } ,
      be -- { abe , bce , bde }
    } ,
    c -- {
      ac ,
      bc ,
      cd -- { acd , bcd , cde -- { acde , bcde } } ,
      ce -- { ace , bce , cde }
    },
    d -- { ad , bd , cd , de -- { ade , bde , cde } } ,
    e -- { ae , be , ce , de }
  }
} ;
\end{tikzpicture}
\end{center}

\end{document}

alt text

Permanenter link

beantwortet 09 Mär '14, 19:55

cgnieder's gravatar image

cgnieder
22.1k243463
Akzeptiert-Rate: 60%

Bisher habe ich keinen Weg gefunden, die Verbindung der Noden schon beim Setzen von diesen anzugeben, wenn ich die vorgegebene Anordnung erhalten will.

Da aber ohnehin LuaLaTeX verwendet wird, lässt sich mit luacode das Verbinden der Noden vereinfachen.

Open in writeLaTeX
% arara: lualatex
\documentclass[tikz,margin=5mm]{standalone}
\usetikzlibrary{graphs,graphdrawing,shapes.geometric}
\usepackage{ifthen}
\usepackage{luacode}

\begin{luacode}
  function enthalten(s,z)
    zeichnen="true"
    for i=1,#s do
      local t=string.find(z,s:sub(i,i))
      if t==nil then zeichnen="false" break end
    end
    return(zeichnen)
  end
\end{luacode}

\newcommand\verbinden[2]{%
  \foreach \i in {#1}\foreach \j in {#2}
    {\ifthenelse{\equal
      {\directlua{tex.print(
        enthalten("\luatexluaescapestring{\i}","\luatexluaescapestring{\j}")
        )}}
      {true}}
      {\graph[left anchor=south,right anchor=north]{(\i)--(\j)};}{}
    }
}

\begin{document}
\begin{tikzpicture}[
    graphs/nodes={
        draw, ellipse,
        minimum width = 2em, minimum height = 2.5ex,
        inner sep = 0pt,
        font = \footnotesize
      },
    graphs/horizontal/.style={no layout,component direction=right},
    graphs/vertikal/.style={no layout,component sep=#1}
  ]
  \graph[no layout,componentwise,components go down center aligned,component sep=3em]
  {
    //[vertikal=2em]{null,//[horizontal]{a,b,c,d,e},};
    //[horizontal,component sep=1em]{ab,ac,ad,ae,bc,bd,be,cd,ce,de};
    //[horizontal,component sep=1em]{abc,abd,abe,acd,ace,ade,bcd,bce,bde,cde};
    //[vertikal=2em]{//[horizontal]{abcd,abce,abde,acde,bcde},abcde};
  };
  \graph[left anchor=south,right anchor=north]{(null)--{(a),(b),(c),(d),(e)}};
  \verbinden{a,b,c,d,e}{ab,ac,ad,ae,bc,bd,be,cd,ce,de}
  \verbinden{ab,ac,ad,ae,bc,bd,be,cd,ce,de}{abc,abd,abe,acd,ace,ade,bcd,bce,bde,cde}
  \verbinden{abc,abd,abe,acd,ace,ade,bcd,bce,bde,cde}{abcd,abce,abde,acde,bcde}
  \verbinden{abcd,abce,abde,acde,bcde}{abcde}
\end{tikzpicture}
\end{document}

alt text


Ursprüngliche Antwort

Auch für mich ist das der erste Versuch mit der Graph Drawing Library. Um die vorgegebene Anordnung der Noden einzuhalten, platziere ich sie erst und verbinde sie dann. Damit der Code übersichtlich bleibt, erfolgt die Verbindung von null bis zu der Ebene mit drei Buchstaben von oben während die restlichen Verbindungen von unten, also von abcde aus, gezeichnet werden.

Open in writeLaTeX
% arara: lualatex
\documentclass[tikz,margin=5mm]{standalone}
\usetikzlibrary{graphs,graphdrawing,shapes.geometric}
\usegdlibrary{layered}

\begin{document}

\begin{tikzpicture}[
    graphs/knoten/.style={
      layered layout,
      grow right,
      nodes={
        draw, ellipse,
        minimum width = 8mm, minimum height = 5mm,
        inner sep = 0pt,
        font = \footnotesize
      }
    }
  ]
  \graph[knoten]{null};
  \graph[knoten]{a,b,c[y=-1],d,e};
  \graph[knoten]{ab,ac,ad,ae,bc[x=-0.5,y=-3],bd,be,cd,ce,de};
  \graph[knoten]{abc,abd,abe,acd,ace[x=-0.5,y=-5],ade,bcd,bce,bde,cde};
  \graph[knoten]{abcd,abce,abde[y=-7],acde,bcde};
  \graph[knoten]{abcde[y=-8]};
  %
  \graph[left anchor=south,right anchor=north]{
    (null)--{
      (a)--{
        (ab)--{(abc),(abd),(abe)},
        (ac)--{(abc),(acd),(ace)},
        (ad)--{(abd),(acd),(ade)},
        (ae)--{(abe),(ace),(ade)}
      },
      (b)--{(ab),
        (bc)--{(abc),(bcd),(bce)},
        (bd)--{(abd),(bcd),(bde)},
        (be)--{(abe),(bce),(cde)}
      },
      (c)--{(ac),(bc),
        (cd)--{(acd),(bcd),(cde)},
        (ce)--{(ace),(bce),(cde)}
      },
      (d)--{(ad),(bd),(cd),
        (de)--{(ade),(bde),(cde)}
      },
      (e)--{(ae),(be),(ce),(de)}
    };
  };
  \graph[left anchor=north,right anchor=south]{
    (abcde)--{
        (abcd)--{(abc),(abd),(acd),(bcd)},
        (abce)--{(abc),(abe),(ace),(bce)},
        (abde)--{(abd),(abe),(ade),(bde)},
        (acde)--{(acd),(ace),(ade),(cde)},
        (bcde)--{(bcd),(bce),(bde),(cde)},
    };
  };
\end{tikzpicture}
\end{document}

alt text

Permanenter link

beantwortet 10 Mär '14, 16:30

esdd's gravatar image

esdd
17.7k254256
Akzeptiert-Rate: 62%

bearbeitet 12 Mär '14, 13:31

Die Idee hatte ich auch... Ich hab das deshalb verworfen, weil mir schien, dass man dann auch mit vergleichbarem Aufwand herkömmliches TikZ verwenden könnte und nicht auf LuaTeX beschränkt wäre. Oder denkst Du (Du bist TikZ-erfahrener als ich), dass sich die graphdrawing library hier trotzdem lohnt?

(10 Mär '14, 17:23) cgnieder

@Clemens: Ich denk schon, dass sich das lohnt. Unter anderem wird der Code übersichtlicher und Lua kann auch beim Verbinden der Knoten helfen. Allerdings ist das momentan für mich alles noch sehr neu ;-)

(12 Mär '14, 13:40) esdd
Deine Antwort
Vorschau umschalten

Folgen dieser Frage

Per E-Mail:

Wenn sie sich anmelden, kommen Sie für alle Updates hier in Frage

Per RSS:

Antworten

Antworten und Kommentare

Markdown-Grundlagen

  • *kursiv* oder _kursiv_
  • **Fett** oder __Fett__
  • Link:[Text](http://url.com/ "Titel")
  • Bild?![alt Text](/path/img.jpg "Titel")
  • nummerierte Liste: 1. Foo 2. Bar
  • zum Hinzufügen ein Zeilenumbruchs fügen Sie einfach zwei Leerzeichen an die Stelle an der die neue Linie sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Frage-Themen:

×728
×14

gestellte Frage: 24 Okt '13, 20:51

Frage wurde gesehen: 15,876 Mal

zuletzt geändert: 12 Mär '14, 13:40