Hier ist das MWE:
\documentclass[landscape]{article}
\usepackage{tikz}
\usetikzlibrary{shapes,arrows}
\begin{document}
\tikzset{
treenode/.style = {align=center, inner sep=2pt, rounded corners = 2pt, minimum width = 2cm, text centered, font=\sffamily},
block/.style = {treenode, rectangle, white, font=\sffamily\bfseries, draw=black, fill=black},
phantom/.style = {}
}
\begin{tikzpicture}[->,>=stealth',level/.style={sibling distance = 3in/#1, level distance = 1.5cm}]
\node [block] {P1}
child {node [block] {P2}
child {node [block] {P3}
child {node [block] {P4}}
child {node [block] {P5}}
}
}
child {node [block] {P6}
child {node [phantom] {}
child {node [block] {P7}}
}
}
child {node [block] {P8}
child {node [block] {P9}
child {node [block] {P10}}
}
}
;
\end{tikzpicture}
\end{document}
Die Verbindungen zwischen den verschiedenen Knoten sind schräge Linien. Wie erhalte ich anstelle dieser horizontale und vertikale Linien?
Antwort1
Eine andere Möglichkeit ist die Verwendung von forest
. In diesem Fall können Sie auf den phantom
Knoten verzichten und einfach verwenden, um mit tier
auszurichten usw. Ich habe Ihren Code auch aktualisiert, um die aktuelle Syntax für Pfeile zu verwenden, die von der Bibliothek bereitgestellt wird, da dies jetzt empfohlen wird. Mir gefällt das, weil das Angeben eines Baums viel weniger Tipparbeit erfordert!P7
P4
P5
arrows.meta
forest
Aktualisierte Lösung (Forest Version 2+)
\documentclass[tikz, border=5pt]{standalone}
\usepackage[edges]{forest}
\usetikzlibrary{arrows.meta}
\begin{document}
\tikzset{
treenode/.style = {align=center, inner sep=2pt, rounded corners = 2pt, minimum width = 2cm, text centered, font=\sffamily},
block/.style = {treenode, rectangle, white, font=\sffamily\bfseries, draw=black, fill=black},
}
% Forest version 2.1
\begin{forest}
for tree={
block,
edge+={thick, -{Stealth[]}}
},
forked edges
[P1
[P2
[P3
[P4, tier=terminal]
[P5]
]
]
[P6, calign with current
[P7, tier=terminal]
]
[P8
[P9
[P10]
]
]
]
;
\end{forest}
\end{document}
Ursprüngliche Lösung (Forest Version 1)
\documentclass[tikz, border=5pt]{standalone}
\usepackage{forest}
\usetikzlibrary{arrows.meta}
\begin{document}
\tikzset{
treenode/.style = {align=center, inner sep=2pt, rounded corners = 2pt, minimum width = 2cm, text centered, font=\sffamily},
block/.style = {treenode, rectangle, white, font=\sffamily\bfseries, draw=black, fill=black},
}
\begin{forest}
for tree={
parent anchor=south,
child anchor=north,
block,
edge path={
\noexpand\path [-{Stealth[]}, \forestoption{edge}, thick]
(!u.parent anchor) -- +(0,-5pt) -| (.child anchor)\forestoption{edge label};
},
}
[P1
[P2
[P3
[P4, tier=terminal]
[P5]
]
]
[P6, calign with current
[P7, tier=terminal]
]
[P8
[P9
[P10]
]
]
]
;
\end{forest}
\end{document}
Ergebnis
Das Ergebnis ist grundsätzlich dasselbe, unabhängig davon, welche Lösung Sie verwenden.
Antwort2
Meinen Sie das, wenn Sie horizontal/vertikal sagen?
Hier ist der Code:
\documentclass[tikz,border=10]{standalone}
\usetikzlibrary{shapes,arrows}
\begin{document}
\tikzset{
treenode/.style = {align=center, inner sep=2pt, rounded corners = 2pt, minimum width = 2cm, text centered, font=\sffamily},
block/.style = {treenode, rectangle, white, font=\sffamily\bfseries, draw=black, fill=black},
phantom/.style = {},
edge from parent/.style={draw,red,thick},
edge from parent path={(\tikzparentnode.south)-- ++(0,-3mm) -| (\tikzchildnode.north)}
}
\begin{tikzpicture}[->,>=stealth',level/.style={sibling distance = 3in/#1, level distance = 1.5cm}]
\node [block] {P1}
child {node [block] {P2}
child {node [block] {P3}
child {node [block] {P4}}
child {node [block] {P5}}
}
}
child {node [block] {P6}
child {node [phantom] {}
child {node [block] {P7}}
}
}
child {node [block] {P8}
child {node [block] {P9}
child {node [block] {P10}}
}
}
;
\end{tikzpicture}
\end{document}
BEARBEITEN:[edge from parent fork down]
Ich habe gerade entdeckt, dass wir Stile aus der Bibliothek verwenden können, trees
um denselben Effekt zu erzielen.
Antwort3
Eine PSTricks-Lösung:
\documentclass{article}
\usepackage{pstricks}
\usepackage{xfp}
\psset{
linecolor = red,
arrows = ->
}
\def\Label(#1,#2)#3{%
\psframe[
framearc = 0.3,
linecolor = black,
fillstyle = solid,
fillcolor = black
](\fpeval{#1-0.5*\widthBox},\fpeval{#2-0.5*\heightBox})%
(\fpeval{#1+0.5*\widthBox},\fpeval{#2+0.5*\heightBox})
\rput(#1,#2){\textcolor{white}{#3}}}
\begin{document}
% parameters
\def\widthBox{1.4}
\def\heightBox{0.4}
\def\horiDist{4.5}
\def\vertDist{1.6}
% drawing
\begin{pspicture}(\fpeval{2*\horiDist+1.75*\widthBox},\fpeval{4*\heightBox+3*\vertDist})
% left
\Label(\fpeval{1.25*\widthBox},\fpeval{2.5*\heightBox+2*\vertDist}){P2}
\psline(\fpeval{1.25*\widthBox},\fpeval{2*\heightBox+2*\vertDist})%
(\fpeval{1.25*\widthBox},\fpeval{2*\heightBox+\vertDist})
\Label(\fpeval{1.25*\widthBox},\fpeval{1.5*\heightBox+\vertDist}){P3}
\psline(\fpeval{1.25*\widthBox},\fpeval{\heightBox+\vertDist})%
(\fpeval{1.25*\widthBox},\fpeval{\heightBox+0.5*\vertDist})%
(\fpeval{0.5*\widthBox},\fpeval{\heightBox+0.5*\vertDist})%
(\fpeval{0.5*\widthBox},\heightBox)
\psline(\fpeval{1.25*\widthBox},\fpeval{\heightBox+0.5*\vertDist})%
(\fpeval{2*\widthBox},\fpeval{\heightBox+0.5*\vertDist})%
(\fpeval{2*\widthBox},\heightBox)
\Label(\fpeval{0.5*\widthBox},\fpeval{0.5*\heightBox}){P4}
\Label(\fpeval{2*\widthBox},\fpeval{0.5*\heightBox}){P5}
% middle
\Label(\fpeval{\horiDist+1.25*\widthBox},\fpeval{3.5*\heightBox+3*\vertDist}){P1}
\psline(\fpeval{\horiDist+1.25*\widthBox},\fpeval{3*\heightBox+3*\vertDist})%
(\fpeval{\horiDist+1.25*\widthBox},\fpeval{3*\heightBox+2*\vertDist})
\Label(\fpeval{\horiDist+1.25*\widthBox},\fpeval{2.5*\heightBox+2*\vertDist}){P6}
\psline(\fpeval{\horiDist+1.25*\widthBox},\fpeval{2*\heightBox+2*\vertDist})%
(\fpeval{\horiDist+1.25*\widthBox},\heightBox)
\Label(\fpeval{\horiDist+1.25*\widthBox},\fpeval{0.5*\heightBox}){P7}
\psline(\fpeval{\horiDist+1.25*\widthBox},\fpeval{1.5*\heightBox+\vertDist-0.1})%
(\fpeval{\horiDist+1.25*\widthBox},\heightBox)
% right
\Label(\fpeval{2*\horiDist+1.25*\widthBox},\fpeval{2.5*\heightBox+2*\vertDist}){P8}
\psline(\fpeval{2*\horiDist+1.25*\widthBox},\fpeval{2*\heightBox+2*\vertDist})%
(\fpeval{2*\horiDist+1.25*\widthBox},\fpeval{2*\heightBox+\vertDist})
\Label(\fpeval{2*\horiDist+1.25*\widthBox},\fpeval{1.5*\heightBox+\vertDist}){P9}
\psline(\fpeval{2*\horiDist+1.25*\widthBox},\fpeval{\heightBox+\vertDist})%
(\fpeval{2*\horiDist+1.25*\widthBox},\heightBox)
\Label(\fpeval{2*\horiDist+1.25*\widthBox},\fpeval{0.5*\heightBox}){P10}
% connection
\psline(\fpeval{\horiDist+1.25*\widthBox},\fpeval{3*\heightBox+2.5*\vertDist})%
(\fpeval{1.25*\widthBox},\fpeval{3*\heightBox+2.5*\vertDist})%
(\fpeval{1.25*\widthBox},\fpeval{3*\heightBox+2*\vertDist})
\psline(\fpeval{\horiDist+1.25*\widthBox},\fpeval{3*\heightBox+2.5*\vertDist})%
(\fpeval{2*\horiDist+1.25*\widthBox},\fpeval{3*\heightBox+2.5*\vertDist})%
(\fpeval{2*\horiDist+1.25*\widthBox},\fpeval{3*\heightBox+2*\vertDist})
\end{pspicture}
\end{document}
Mit diesem Code müssen Sie lediglich die Breite ( \widthBox
) und Höhe ( \heightBox
) der Boxen sowie den horizontalen ( \horiDist
) und vertikalen ( \vertDist
) Abstand zwischen ihnen auswählen. Die Zeichnung wird dann automatisch entsprechend angepasst.