Estou tentando construir um gráfico colocando manualmente os nós usando posicionamento relativo. Mas enfrento alguns problemas com a forma como os nós são colocados. Tentei incluí-lo em um MWE:
\documentclass[tikz]{standalone}
\usetikzlibrary{positioning}
\begin{document}
\begin{tikzpicture}[
test node/.style={rectangle, draw, text height=1.5ex, text depth=0.25ex}
]
\small
\node (a) [test node] {First node};
\node (b) [test node, above right=of a] {Upper branch 1};
\node (c) [test node, below right=of a] {Lower branch 1};
\begin{scope}[red]
\foreach \pos/\n in {above right/x, right/y, below right/z}
{
\node (\n) [circle, draw, \pos=of a] {};
\foreach \a in {north, center, south}
{
\draw[shift=(\n.\a)] plot [mark=x] coordinates{(0,0)};
}
}
\foreach \n in {x, y, z}
\draw (0,2 -| \n.center) -- ++(0,-4);
\node [circle, draw, below=of a] at (3,0) {};
\end{scope}
\end{tikzpicture}
\end{document}
Como você pode ver, o posicionamento dos círculos e dos nós de texto em relação ao primeiro nó não corresponde. Em segundo lugar, os três círculos não se alinham horizontalmente. E como terceiro “bônus”, o último círculo colocado com uma combinação da below
chave e uma posição explícita na direção x é incompatível de uma terceira maneira.
Qual é a maneira correta de colocar esses nós (com diferentes formas e diferentes maneiras de colocá-los) sem adicionar coordenadas manualmente? Preciso combinar diferentes formas e definir explicitamente algumas coordenadas x para distribuir corretamente os nós em diferentes ramos ...
Editar: Para esclarecer: gostaria de alinhar verticalmente os círculos e retângulos e gostaria de alinhar horizontalmente suas âncoras oeste.
Responder1
\node (b) [test node, above right=of a] {Upper branch 1};
define o anchor
nó b
para south west
enãopara west
. Em seguida b.south west
é posicionado 1cm à direita e 1cm acima do a.north east
. E se o nó for um círculo, há diferença na x
direção entre âncora south west
e west
.
Se a âncora de b
deveria ser west
em vez de south west
você tem que usaranchor=west
depoisa opção above right=of a
.
\documentclass[tikz]{standalone}
\usetikzlibrary{positioning}
\begin{document}
\begin{tikzpicture}[
test node/.style={rectangle, draw, text height=1.5ex, text depth=0.25ex},
node distance=1cm and 1cm
]
\small
\node (a) [test node] {First node};
\node (b) [test node, above right=of a,anchor=west] {Upper branch 1};
\node (c) [test node, below right=of a,anchor=west] {Lower branch 1};
\begin{scope}[red]
\foreach \pos/\n in {above right/x, right/y, below right/z}
{
\node (\n) [circle, draw, \pos=of a,anchor=west] {};
\foreach \a in {north, center, south}
{
\draw[shift=(\n.\a)] plot [mark=x] coordinates{(0,0)};
}
}
\foreach \n in {x, y, z}
\draw (0,2 -| \n.center) -- ++(0,-4);
\node [circle, draw, below=of a] at (3,0) {};
\end{scope}
\draw[green](a.east)--+(1,0);
\draw[blue](a.north east)--++(1,0)--+(0,1);
\draw[orange](a.south east)--++(1,0)--+(0,-1);
\end{tikzpicture}
\end{document}
E talvez você queira posicionar as west
âncoras em relação à east
âncora de a
:
\documentclass[tikz]{standalone}
\usetikzlibrary{positioning}
\begin{document}
\begin{tikzpicture}[
test node/.style={rectangle, draw, text height=1.5ex, text depth=0.25ex},
node distance=1cm and 1cm
]
\small
\node (a) [test node] {First node};
\node (b) [test node, above right=of a.east,anchor=west] {Upper branch 1};
\node (c) [test node, below right=of a.east,anchor=west] {Lower branch 1};
\begin{scope}[red]
\foreach \pos/\n in {above right/x, right/y, below right/z}
{
\node (\n) [circle, draw, \pos=of a.east,anchor=west] {};
\foreach \a in {north, center, south}
{
\draw[shift=(\n.\a)] plot [mark=x] coordinates{(0,0)};
}
}
\foreach \n in {x, y, z}
\draw (0,2 -| \n.center) -- ++(0,-4);
\node [circle, draw, below=of a] at (3,0) {};
\end{scope}
\draw[green](a.east)--+(1,0);
\draw[blue](a.east)++(1,0)--+(0,1);
\draw[orange](a.east)++(1,0)--+(0,-1);
\draw[purple](a.center)--++(0,-1)--+(3,0);
\end{tikzpicture}
\end{document}