森林,樹枝不對稱

森林,樹枝不對稱

考慮貢薩洛·梅迪納對問題的回答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只有當節點有兄弟節點時,的值才重要,這是不正確的。

[但是,這並沒有說明我先前版本的答案所聲稱的內容。所以如果你讀到了這篇文章,我就是個白痴,你應該忽略它。

的預設值caligncenter將父級anchor與子級之間的中點對齊anchor。預設值為anchorbase

這是一張圖片:

預設對齊演示

因此,我們想要的對齊方式需要更改anchor父級和子級的 ,或使用 的非預設值calign

在第一種情況下,我們可以做這樣的事情,設定anchor=center樹:

錨點=中心

anchor=parent(即west在這種情況下):

錨=父級

anchor=children(即east)這裡:

錨=孩子

錨點children始終面向節點的子節點(或子節點所在的位置);parent面向節點的父節點(或父節點所在的位置)。

或者,我們可以改變calign.例如calign=edge midpoint。然而,這並不像我預期的那樣工作:

對齊邊緣的中點

在這種情況下,我無法確切地弄清楚孩子們的子錨點在哪裡,但它們似乎位於相對於您從哪裡出發或去往哪裡的任何 TikZ 會採取路徑的地方。

但即使設定parent anchor=eastandchild anchor=west為樹也沒有真正的幫助:

對齊邊緣的中點?

所以我會改變anchor這棵樹,就像我下面所做的那樣,不管其他看起來是否合意。在這種情況下,這似乎給出了良好的結果。

(然而,對於非圓形節點,除此之外的其他東西center通常是有意義的。)

我還做了一些您可能(或可能不)感興趣的其他微小修改。因此,您可以改變成長方向,並且錨點parentchild錨點仍然應該有意義。我還讓包裝弄清楚邊緣上的標籤是否應該位於線條上方或下方。

但只有

    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}

相關內容