考慮貢薩洛·梅迪納對問題的回答TikZ 中的決策樹。對於我的學習過程建議我稍微修改一下:
\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}
如果我在節點中添加一些測試,為什麼決策樹相對於通過節點的水平對稱線變得不對稱?例如,在節點 B 處,下一級上層分支與穿過節點的中心水平線的距離小於下層分支。我用森林2.0對此進行了測試。
答案1
這是一個解決方案。該文件相當具有誤導性,因為anchor
只有當節點有兄弟節點時,的值才重要,這是不正確的。
[但是,這並沒有說明我先前版本的答案所聲稱的內容。所以如果你讀到了這篇文章,我就是個白痴,你應該忽略它。
的預設值calign
是center
將父級anchor
與子級之間的中點對齊anchor
。預設值為anchor
。base
這是一張圖片:
因此,我們想要的對齊方式需要更改anchor
父級和子級的 ,或使用 的非預設值calign
。
在第一種情況下,我們可以做這樣的事情,設定anchor=center
樹:
或anchor=parent
(即west
在這種情況下):
或anchor=children
(即east
)這裡:
錨點children
始終面向節點的子節點(或子節點所在的位置);parent
面向節點的父節點(或父節點所在的位置)。
或者,我們可以改變calign
.例如calign=edge midpoint
。然而,這並不像我預期的那樣工作:
在這種情況下,我無法確切地弄清楚孩子們的子錨點在哪裡,但它們似乎位於相對於您從哪裡出發或去往哪裡的任何 TikZ 會採取路徑的地方。
但即使設定parent anchor=east
andchild anchor=west
為樹也沒有真正的幫助:
所以我會改變anchor
這棵樹,就像我下面所做的那樣,不管其他看起來是否合意。在這種情況下,這似乎給出了良好的結果。
(然而,對於非圓形節點,除此之外的其他東西center
通常是有意義的。)
我還做了一些您可能(或可能不)感興趣的其他微小修改。因此,您可以改變成長方向,並且錨點parent
和child
錨點仍然應該有意義。我還讓包裝弄清楚邊緣上的標籤是否應該位於線條上方或下方。
但只有
anchor=children,% work around alignment issue
確實對結果有任何影響。
\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}
演示程式碼:
\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}