숲, 가지의 비대칭

숲, 가지의 비대칭

질문에 대한 Gonzalo Medina의 답변을 고려하십시오.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입니다 . 그리고 기본값은 입니다 .centeranchoranchoranchorbase

사진은 다음과 같습니다.

기본 정렬 데모

따라서 우리가 원하는 정렬에는 anchor부모와 자식의 를 변경하거나 기본값이 아닌 값을 사용해야 합니다 calign.

anchor=center첫 번째 경우에는 트리를 설정하여 다음과 같이 할 수 있습니다 .

앵커=중앙

또는 anchor=parent(즉, west이 경우):

앵커=상위

또는 anchor=children(즉 east) 여기서:

앵커=어린이

앵커는 children항상 노드의 자식(또는 자식이 있는 위치)을 향합니다. parent노드의 상위(또는 상위가 있는 위치)를 향합니다.

또는 calign. 예를 들어 calign=edge midpoint. 그러나 이것은 예상대로 작동하지 않습니다.

가장자리의 중간점 정렬

이 경우 어린이의 하위 앵커가 어디에 있는지 정확히 알 수는 없지만 TikZ가 출발하거나 가는 곳과 관련하여 어디로든 가는 것 같습니다.

그러나 트리를 설정 parent anchor=east하고 설정하는 것조차 실제로 도움이 되지 않습니다.child 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}

관련 정보