Ich möchte solch einen Graphen malen: Seite 8 von diesem PDF 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? |
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 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} 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 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} beantwortet 10 Mär '14, 16:30 esdd 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
|
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} beantwortet 09 Mär '14, 19:55 cgnieder |
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).
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.
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!