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.
Antwort1
Dies ist eine Lösung. Die Dokumentation ist eher irreführend, da es nicht stimmt, dass der Wert anchor
nur 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 calign
ist , center
wodurch das übergeordnete Element anchor
auf den Mittelpunkt zwischen den anchor
s des untergeordneten Elements ausgerichtet wird. Und der Standardwert von anchor
ist base
.
Hier ist ein Bild:
Die gewünschte Ausrichtung erfordert also entweder eine Änderung der anchor
der ü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=center
für den Baum ändern:
oder anchor=parent
(also west
in diesem Fall):
oder anchor=children
(dh east
) hier:
Der Anker children
ist immer auf die untergeordneten Knoten (oder dorthin, wo sich die untergeordneten Knoten befinden würden) und parent
auf 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:
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=east
und child anchor=west
für den Baum hilft nicht wirklich:
anchor
Ich 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 center
sinnvoll.)
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 parent
Anker child
sollten 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}
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}