Hallo,

ich habe ein Problem bei der Erstellung eines Baumdiagramms mit tikz. Der Baum ist soweit in Ordnung, aber wenn ich die Pfeile darin beschriften will zB mit: edge from parent node[left,draw=none] {$p_n$}, dann verschiebt es mir alles. Wie kann ich das vermeiden?

Hier mal der Baum (er soll später insgesamt zehn Level bekommen):

Open in writeLaTeX
\documentclass{report}
\usepackage[ngerman]{babel}
\usepackage[latin1]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{pgf}
\usepackage{tikz}
\usetikzlibrary{arrows,automata,snakes}
\begin{document}
\begin{figure}
\begin{tikzpicture}[->,>=stealth',shorten >=1pt,auto,node distance=2.8cm,
               semithick]
\tikzstyle{every node}=[fill=white,draw=black,rectangle,text=black]
\node {0:0}
    child{ node{1:0}
        child{node{2:0}}
        child{node{1:1}}}
    child{ node{0:1} 
       child{node {1:1}}
       child {node{0:2}}}
        ;
\end{tikzpicture}
\end{figure}
\end{document}

Viele Grüße

gefragt 16 Aug '14, 19:58

lhop's gravatar image

lhop
31112
Akzeptiert-Rate: 0%

bearbeitet 16 Aug '14, 21:39

cgnieder's gravatar image

cgnieder
22.1k243463


Vorschlag mit edge from parent node

Zu beachten ist dabei eigentlich nur, dass diese Pfadoperation immer am Ende des child Pfades stehen muss, also direkt vor dessen schließender Klammer und damit nach dessen untergeordneten childs

Open in writeLaTeX
child{ 
  node{<text>}
  child{...}
  ...
  edge from parent node{<edge node text>}
}

alt text

Code:

Open in writeLaTeX
\documentclass{report}
\usepackage[ngerman]{babel}
\usepackage[latin1]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{tikz}
\usetikzlibrary{arrows}
\begin{document}
\begin{figure}
\begin{tikzpicture}[
    ->,>=stealth',shorten >=1pt,
    node distance=2.8cm,
    every node/.style={fill=white,draw},% alle zeichnen und weiß füllen
    edge from parent/.append style={ % außer edge nodes
      every node/.append style={draw=none,fill=none}
    }
  ]
  \node[draw] {0:0}
    child{ 
      node{1:0}
      child{
        node{2:0}
        edge from parent node[left]{PFAD}
      }
      child{node{1:1}}
      edge from parent node[left] {$p_n$}
    }
    child{
       node{0:1} 
       child{node {1:1}}
       child {node{0:2}}
       edge from parent node[right]{Pfad}
    }
  ;
  \end{tikzpicture}
\end{figure}
\end{document}
Permanenter link

beantwortet 16 Aug '14, 22:32

esdd's gravatar image

esdd
17.7k254256
Akzeptiert-Rate: 62%

bearbeitet 17 Aug '14, 01:44

graph als Alternative

Ab pgf/TikZ Version 3.0 kann man Bäume auch als Graphen zeichnen. Der folgende Code muss dann aber mit LuaLaTeX kompiliert werden:

Open in writeLaTeX
\documentclass[tikz]{standalone}
\usetikzlibrary{graphdrawing, graphs,arrows,quotes,babel}
\usegdlibrary{trees}

\begin{document}

\tikz[>=stealth',shorten >=1pt,nodes={fill=white,draw}]
  \graph[
    tree layout,
    minimum number of children=2,
    level distance=2cm,
    sibling distance=2cm,
    edge quotes={draw=none,auto}
    ]{
    0:0->{
      1:0[>"$p_n$" ']->2:0[>"PFAD" ']->3:0->4:0,
      0:1[>"Pfad"]->{
        1:1->2:1->3:1,
        0:2->{
          1:2->2:2,
          0:3->{1:3,0:4}
        }
      }
    },
    1:0->1:1->1:2->1:3,
    2:0->2:1->2:2,
    3:0->3:1
  };
\end{document}

Ergebnis:

alt text

Das lässt sich dann einigermaßen überschaubar auf mehr Ebenen erweitern:

Open in writeLaTeX
\documentclass[tikz,margin=10pt]{standalone}
\usetikzlibrary{graphdrawing, graphs,arrows,quotes,babel}
\usegdlibrary{trees}

\begin{document}

\tikz[>=stealth',shorten >=1pt,nodes={fill=white,draw}]
  \graph[
    tree layout,
    minimum number of children=2,
    level distance=2cm,
    sibling distance=2cm,
    edge quotes={draw=none,auto}
    ]{
    0:0->{
      1:0[>"$p_n$" ']->2:0[>"PFAD" ']->3:0->4:0->5:0->6:0->7:0->8:0->9:0->10:0,
      0:1[>"Pfad"]->{
        1:1->2:1->3:1->4:1->5:1->6:1->7:1->8:1->9:1,
        0:2->{
          1:2->2:2->3:2->4:2->5:2->6:2->7:2->8:2,
          0:3->{
            1:3->2:3->3:3->4:3->5:3->6:3->7:3,
            0:4->{
              1:4->2:4->3:4->4:4->5:4->6:4,
              0:5->{
                1:5->2:5->3:5->4:5->5:5,
                0:6->{
                  1:6->2:6->3:6->4:6,
                  0:7->{
                    1:7->2:7->3:7,
                    0:8->{
                      1:8->2:8,
                      0:9->{
                        1:9,
                        0:10
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    1:0->1:1->1:2->1:3->1:4->1:5->1:6->1:7->1:8->1:9,
    2:0->2:1->2:2->2:3->2:4->2:5->2:6->2:7->2:8,
    3:0->3:1->3:2->3:3->3:4->3:5->3:6->3:7,
    4:0->4:1->4:2->4:3->4:4->4:5->4:6,
    5:0->5:1->5:2->5:3->5:4->5:5,
    6:0->6:1->6:2->6:3->6:4,
    7:0->7:1->7:2->7:3,
    8:0->8:1->8:2,
    9:0->9:1
  };
\end{document}

Ergebnis:

alt text

Permanenter link

beantwortet 17 Aug '14, 01:42

esdd's gravatar image

esdd
17.7k254256
Akzeptiert-Rate: 62%

Ich würde die nodes benennen und dann zur Beschriftung Pfade setzen:

alt text

Open in writeLaTeX
\documentclass{report}
\usepackage[ngerman]{babel}
\usepackage[latin1]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{pgf}
\usepackage{tikz}
\usetikzlibrary{arrows,automata,snakes}

\usepackage{lipsum}
\pagecolor{lightgray!50!orange}
\begin{document}
\lipsum[66]
\begin{figure}[h]
\begin{tikzpicture}[->,>=stealth',shorten >=1pt,auto,node distance=2.8cm,
               semithick]
\tikzstyle{every node}=[fill=white,draw=black,rectangle,text=black]
\node (S) {0:0}
    child{ node (A) {1:0}
        child{node (B) {2:0}}
        child{node (C) {1:1}}}
    child{ node (D) {0:1} 
       child{node (E) {1:1}}
       child {node (F) {0:2}}}
        ;

\path  (A) -- (B) node[draw=none, midway, left=4pt]{PFAD};
\path  (D) -- (S) node[draw=none, midway, right=4pt]{Pfad};
\end{tikzpicture}
\end{figure}
\lipsum[66]
\end{document}
Permanenter link

beantwortet 16 Aug '14, 20:54

cis's gravatar image

cis
9.5k74452491
Akzeptiert-Rate: 29%

Wie kommt's eigentlich, dass Du bei allen Deinen Beispielen \pagecolor einsetzt?

(16 Aug '14, 22:02) cgnieder

Ja weißer Adler (Bilder) auf weißem Grund ist immer so eine Sache. Ich könnte jetzt ein dezentes Hellgrau nehmen, aber wenn ich schon diese Option bemühen muß, kann ich auch gleich irgendwas Protziges nehmen. Natürlich steht es dem Nutzer frei, diese pagecolor-Option nach Belieben zu ändern oder auch zu löschen ;)

(16 Aug '14, 22:14) cis

Cool danke, so funktionierts gut!

(16 Aug '14, 22:17) lhop

@lhop ich habe Deine »Antwort« (=Lösung der Frage) mal in einen Kommentar zu @cis Antwort umgewandelt. Die TeXwelt is kein Forum im eigentlichen Sinn und das Antwortfeld sollte Lösungen der Fragen vorbehalten bleiben :)

(16 Aug '14, 22:19) cgnieder

Ah ok, wird nicht wieder vorkommen ;)

(16 Aug '14, 23:14) lhop
1

@cis Wenn Du dem root Node den Namen S gibst, dann braucht Du die child Nodes eigentlich nicht mehr extra zu benennen. Wenn Du bei diesen keine eigenen Namen angibst, werden sie automatisch benannt: S-1 statt Deinem A, S-1-1 statt Deinem B und S-2 statt Deinem D.

(17 Aug '14, 00:53) esdd
Ergebnis 5 von 6 show 1 more comments
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
×11

gestellte Frage: 16 Aug '14, 19:58

Frage wurde gesehen: 19,626 Mal

zuletzt geändert: 17 Aug '14, 01:44