
Я использую tree layout
with tikz, что обычно работает очень хорошо, но иногда при использовании подграфов у меня получаются ребра, которые идеально выровнены друг над другом, как здесь:
В моем коде ниже я также пробовал различные другие методы компоновки, например, spring layout
и электрические варианты. Но у них, похоже, тоже есть проблемы с вложенными компоновками, и силы не распространяются хорошо по уровням. Это приводит к куче узлов, наваленных друг на друга.
Есть ли какой-то трюк, который мне нужен, чтобы работать с вложенными макетами?
\documentclass[tikz]{standalone}
\usetikzlibrary{graphs, graphdrawing, quotes, arrows.meta}
\usegdlibrary{trees}
\begin{document}
\tikz[
every node/.style={
font=\scriptsize,
inner sep=2pt,
},
identity/.style={circle, draw=black, fill=white, inner sep=0pt, minimum size=4pt},
var/.style={circle, draw=black, fill=white, inner sep=2pt},
function/.style={circle, draw=black, fill=white, inner sep=2pt},
subgraph nodes={draw=gray, rounded corners},
subgraph text none,
]
\graph [
tree layout,
grow'=right,
fresh nodes,
sibling sep=5em,
node distance=1cm,
node sep=1cm,
nodes behind edges,
nodes={align=center},
] {
main+cluster [draw=black, circle] // [tree layout]{
sub+cluster // [tree layout]{
node+A[function,as=$A$];
node+x1[var,as=$x$];
(node+x1) -> [-latex, "$i$"] (node+A);
},
node+x2[var,as=$x$];
(node+A) -- ["$i$"] (node+x2);
},
node+j[as=];
(node+A) -- ["$j$"] (node+j);
node+i+prime[as=];
(main+cluster) -- [Circle-, "$i'$"] (node+i+prime);
};
\end{document}
решение1
Вот предложение, я переместил x
узел вниз с помощью nudge down =5mm
и согнул стрелку с помощью out=-80,in=230,looseness=1.4
. Вы можете изменить эти настройки, чтобы подогнать это как можно ближе к вашей идее.
node+x2[var,nudge down=5mm,as=$x$];
(node+A) -- [out=-80,in=230,looseness=1.4,"$i$"] (node+x2);
Полный код
\documentclass[tikz]{standalone}
\usetikzlibrary{graphs, graphdrawing, quotes, arrows.meta}
\usegdlibrary{trees}
\begin{document}
\tikz[
every node/.style={
font=\scriptsize,
inner sep=2pt,
},
identity/.style={circle, draw=black, fill=white, inner sep=0pt, minimum size=4pt},
var/.style={circle, draw=black, fill=white, inner sep=2pt},
function/.style={circle, draw=black, fill=white, inner sep=2pt},
subgraph nodes={draw=gray, rounded corners},
subgraph text none,
]
\graph [
tree layout,
grow'=right,
fresh nodes,
sibling sep=5em,
node distance=1cm,
node sep=1cm,
nodes behind edges,
nodes={align=center},
] {
main+cluster [draw=black, circle] // [tree layout]{
sub+cluster // [tree layout]{
node+A[function,as=$A$];
node+x1[var,as=$x$];
(node+x1) -> [-latex, "$i$"] (node+A);
},
node+x2[var,nudge down=5mm,as=$x$];
(node+A) -- [out=-80,in=230,looseness=1.4,"$i$"] (node+x2);
},
node+j[as=];
(node+A) -- ["$j$"] (node+j);
node+i+prime[as=];
(main+cluster) -- [Circle-, "$i'$"] (node+i+prime);
};
\end{document}