Wald, Asymmetrie der Zweige

Wald, Asymmetrie der Zweige

Betrachten Sie die Antwort von Gonzalo Medina auf die FrageEntscheidungsbäume in TikZFür meinen Lernprozess habe ich es leicht abgewandelt:

\documentclass[tikz,multi,border=5pt]{standalone}
\usepackage{forest}

\tikzset{
EL/.style={%Edge Labels
  midway,
  #1,% <--- position: "EL=above" or "EL=below"
  font=\scriptsize\sffamily,
  text=teal,
  text width=1.5cm,
  align=center,
            }
}

\begin{document}
%%%% modified version
\begin{forest}
for tree={
  grow=east,
  draw=teal,
  circle,
  line width=0.4pt,
  parent anchor=east,
  child anchor=west,
  edge={draw=teal,very thin},
%  edge label={\Huge\color{black}}, % <-- this seems to haven't any influence on tree
  edge path={
    \noexpand\path[\forestoption{edge}]
      (!u.parent anchor) -- 
      ([xshift=-17mm].child anchor) -- % intermediate point
      (.child anchor)\forestoption{edge label};
  },
  l sep=19mm,            % <-- *l*: level distance
}
[,rectangle, 
  s sep=8mm,            % <-- *s*: sibling distance
  [,edge label={node[EL=below]{option1}}
    [,edge label={node[EL=below]{a longer text goes here}}
    ]
    [,edge label={node[EL=above]{text}}
    ]
  ]
  [B,edge label={node[EL=above]{option2}}
    [,edge label={node[EL=below]{a longer text goes here}}
    ]
    [,edge label={node[EL=above]{text}}
    ]
  ]
]
\end{forest}
    \end{document}

Warum wird der Entscheidungsbaum in Bezug auf die horizontale Symmetrielinie durch die Knoten asymmetrisch, wenn ich einige Tests in die Knoten einfüge? Beispielsweise haben bei Knoten B die oberen Zweige der nächsten Ebene einen geringeren Abstand von der mittleren horizontalen Linie durch den Knoten als die unteren. Ich habe dies mit Forest 2.0 getestet.

Bildbeschreibung hier eingeben

Antwort1

Dies ist eine Lösung. Die Dokumentation ist eher irreführend, da es nicht stimmt, dass der Wert anchornur dann von Bedeutung ist, wenn der Knoten ein Geschwister hat.

[Allerdings wird hier nicht das gesagt, was ich in meiner früheren Version dieser Antwort behauptet habe. Wenn Sie das also lesen, war ich ein Idiot und Sie sollten es ignorieren.]

Der Standardwert von calignist , centerwodurch das übergeordnete Element anchorauf den Mittelpunkt zwischen den anchors des untergeordneten Elements ausgerichtet wird. Und der Standardwert von anchorist base.

Hier ist ein Bild:

Standardausrichtungsdemo

Die gewünschte Ausrichtung erfordert also entweder eine Änderung der anchorder übergeordneten und untergeordneten Elemente oder die Verwendung eines nicht standardmäßigen Wertes für calign.

Im ersten Fall könnten wir etwa Folgendes tun und die Einstellungen anchor=centerfür den Baum ändern:

Anker=Mitte

oder anchor=parent(also westin diesem Fall):

Anker=Elternteil

oder anchor=children(dh east) hier:

Anker=Kinder

Der Anker childrenist immer auf die untergeordneten Knoten (oder dorthin, wo sich die untergeordneten Knoten befinden würden) und parentauf die übergeordneten Knoten (oder dorthin, wo sich die übergeordneten Knoten befinden würden) ausgerichtet.

Alternativ könnten wir ändern calign. Zum Beispiel calign=edge midpoint. Das funktioniert jedoch nicht ganz so, wie ich es erwartet habe:

Mittelpunkte der Kanten ausrichten

Ich kann nicht genau herausfinden, wo sich in diesem Fall die untergeordneten Anker der untergeordneten Elemente befinden, aber sie scheinen sich dort zu befinden, wo TikZ einen Pfad einschlagen würde, relativ zu dem Ort, von dem aus Sie die Komposition durchführen oder zu dem Sie gehen.

Aber auch das Setzen von parent anchor=eastund child anchor=westfür den Baum hilft nicht wirklich:

Mittelpunkte der Kanten ausrichten?

anchorIch würde also den Baum ändern , wie ich es unten tue, unabhängig davon, was sonst wünschenswert erscheint. Dies scheint in diesem Fall gute Ergebnisse zu liefern.

(Bei nicht kreisförmigen Knoten ist jedoch oft etwas anderes centersinnvoll.)

Ich habe auch noch ein paar andere kleine Änderungen vorgenommen, die Sie vielleicht interessieren (oder auch nicht). Insbesondere habe ich die Anker so geändert, dass sie nicht richtungsabhängig sind. Sie können also die Wachstumsrichtung ändern und die parentAnker childsollten trotzdem Sinn ergeben. Ich habe das Paket auch herausfinden lassen, ob die Beschriftungen an den Rändern über oder unter die Linien gehen sollen.

Aber nur

    anchor=children,% work around alignment issue

wirklich einen Unterschied im Ergebnis macht.

\documentclass[tikz,multi,border=5pt]{standalone}
\usepackage{forest}
\begin{document}
% Zarko's modification of Gonzalo Medina's answer: http://tex.stackexchange.com/a/177254/
\tikzset{%
  EL/.style={%
    midway,
    #1,
    font=\scriptsize\sffamily,
    text=teal,
    text width=1.5cm,
    align=center,
  }
}
\begin{forest}
  for tree={
    draw=teal,
    line width=0.4pt,
    edge={draw=teal,very thin},
    grow=east,
    circle,
    parent anchor=children,
    child anchor=parent,
    edge path'={
       (!u.parent anchor) -- ([xshift=-17mm].child anchor) -- (.child anchor)
    },
    l sep=19mm,
    anchor=children,% work around alignment issue
  },
  before typesetting nodes={%
    where n=1{%
      edge label/.wrap value={node[EL=below]{#1}}
    }{%
      edge label/.wrap value={node[EL=above]{#1}}
    }
  }
  [, rectangle, s sep=8mm,
    [, edge label={option1}
      [, edge label={a longer text goes here}
      ]
      [, edge label={text}
      ]
    ]
    [B, edge label={option2}
      [, edge label={a longer text goes here}
      ]
      [, edge label={text}
      ]
    ]
  ]
\end{forest}
\end{document}

Problemumgehung für die Ausrichtung

Code für Demos:

\documentclass[tikz,multi,border=5pt]{standalone}
\usepackage{forest}
\usetikzlibrary{calc}
\begin{document}
\begin{forest}
  for tree={% default calign, anchor
    grow=east,
    draw
  }
  [
    [B, tikz={%
      \draw [densely dotted, blue] (!u.base) -- (.base);
      \draw [densely dotted, red] (.base) -- ($(!1.base)!1/2!(!l.base)$) edge (!1.base) -- (!l.base);
    }
      [][]
    ]
  ]
\end{forest}
\begin{forest}
  for tree={% default calign, anchor=center
    grow=east,
    draw,
    anchor=center
  }
  [
    [B, tikz={%
      \draw [densely dotted, blue] (!u.center) -- (.center);
      \draw [densely dotted, red] (.center) -- ($(!1.center)!1/2!(!l.center)$) edge (!1.center) -- (!l.center);
    }
      [][]
    ]
  ]
\end{forest}
\begin{forest}
  for tree={% default calign, anchor=parent
    grow=east,
    draw,
    anchor=parent
  }
  [
    [B, tikz={%
      \draw [densely dotted, blue] (!u.parent) -- (.parent);
      \draw [densely dotted, red] (.parent) -- ($(!1.parent)!1/2!(!l.parent)$) edge (!1.parent) -- (!l.parent);
    }
      [][]
    ]
  ]
\end{forest}
\begin{forest}
  for tree={% default calign, anchor=children
    grow=east,
    draw,
    anchor=children
  }
  [
    [B, tikz={%
      \draw [densely dotted, blue] (!u.children) -- (.children);
      \draw [densely dotted, red] (.children) -- ($(!1.children)!1/2!(!l.children)$) edge (!1.children) -- (!l.children);
    }
      [][]
    ]
  ]
\end{forest}
\begin{forest}
  for tree={% calign=edge midpoint, default anchor
    grow=east,
    draw,
    calign=edge midpoint,
    parent anchor=east,
    child anchor=west,
  }
  [
    [B, tikz={%
      \draw [densely dotted, blue] (!u.parent anchor) -- (.child anchor);
      \draw [densely dotted, red] (.parent anchor)  -- ($(!1.child anchor)!1/2!(!l.child anchor)$) edge (!1.child anchor) -- (!l.child anchor);
    }
      [][]
    ]
  ]
\end{forest}
\end{document}

verwandte Informationen