Ebenenabstand von Kanten im zyklischen Baum

Ebenenabstand von Kanten im zyklischen Baum
\documentclass[png,tikz,border=10pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{trees,decorations,shadows}

% style definitions
\tikzset{level 1/.style={sibling angle=90,level distance=25mm}}

\begin{document}

\begin{tikzpicture}
[grow cyclic,cap=round]
\node[shape=circle, draw, minimum size=12pt] {\large PL} 
 child {node[shape=circle, draw, minimum size=8pt] {}
    [level distance=1cm]
    child {node {Textual}}
    child {node {Visual}}
}
 child {node[shape=circle, draw, minimum size=8pt] {}
    [level distance=1cm]
    child {node {General-purpose}}
    child {node {Special-purpose}}
}
 child {node[shape=circle, draw, minimum size=8pt] {}}
 child {node[shape=circle, draw, minimum size=8pt] {}}
;
\end{tikzpicture}

\end{document}

Bildbeschreibung hier eingeben

Wie Sie sehen, habe ich zwar angegeben level distance=1cm. Es misst vom Mittelpunkt aus, daher ist „Special-purpose“ zu nah an seinem übergeordneten Element. Die Kantenlängen von „Textual“ und „Visual“ sind ebenfalls unterschiedlich.

Kann ich den waagerechten Randabstand so messen, dass die Randlänge unabhängig von der Textlänge 1cm beträgt?

Dieses Problem ähnelt in gewisser WeiseKnotenabstand zwischen Rändern in Tikz festlegenaber dieser Beitrag baut keine Bäume.

Antwort1

Eine Alternative besteht darin, zu verwenden chains, das standardmäßig den Abstand zwischen Knotengrenzen misst. Die scopesBibliothek macht den Code übersichtlicher, wenn Sie viele Zweige haben.

Bildbeschreibung hier eingeben

\documentclass{article}

\usepackage{tikz}
\usetikzlibrary{chains, scopes}

\begin{document}

\begin{tikzpicture}[start chain, every on chain/.style=join, node distance=10mm and 10mm]
\node [on chain, draw, circle] {PL};
{[start branch=1 going above right]
    \node [on chain, draw, circle] {};
}
{[start branch=2 going above left]
    \node [on chain, draw, circle] {};
}
{[start branch=3 going below left]
    \node [on chain, draw, circle] {};
    {[start branch=31 going left]
    \node [on chain] {Textual};
    }
    {[start branch=32 going below]
    \node [on chain] {Visual};
    }
}
{[start branch=4 going below right]
    \node [on chain, draw, circle] {};
    {[start branch=41 going right]
    \node [on chain] {Special purpose};
    }
    {[start branch=42 going below]
    \node [on chain] {General purpose};
    }
}
\end{tikzpicture}

\end{document}

Antwort2

Dies liegt daran, dass die zur Positionierung der Knoten verwendete Koordinate in der Mitte jedes Knotens liegt. Sie können dies ändern mit anchor:

\documentclass[border=10pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{trees}

% style definitions
\tikzset{level 1/.style={sibling angle=90,level distance=25mm}}

\begin{document}

\begin{tikzpicture}[grow cyclic,cap=round]
\node[shape=circle, draw, minimum size=12pt] {\large PL} 
 child {node[shape=circle, draw, minimum size=8pt] {}
    [level distance=1cm]
    child {node[anchor=east] {Textual}}
    child {node[anchor=north] {Visual}}
}
 child {node[shape=circle, draw, minimum size=8pt] {}
    [level distance=1cm]
    child {node[anchor=north] {General-purpose}}
    child {node[anchor=west] {Special-purpose}}
}
 child {node[shape=circle, draw, minimum size=8pt] {}}
 child {node[shape=circle, draw, minimum size=8pt] {}}
;
\end{tikzpicture}

\end{document}

Bildbeschreibung hier eingeben

verwandte Informationen