如何获得 tikz-graph 中边缘路径的细粒度控制?我想避免较大图中的“交叉”边缘以及较小图中的距离太小。我的想法是引入不可见节点并通过这些节点连接边缘:
\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{arrows,graphs,matrix,positioning}
\begin{document}
\begin{tikzpicture}[>=stealth',
font=\sffamily\small,
every node/.style={align=center},
skip loop left/.style={to path={-- ++(-#1,0)|- (\tikztotarget)}},
skip loop right/.style={to path={-- ++(#1,0)|- (\tikztotarget)}},
hv path/.style ={to path={-| (\tikztotarget)}},
vh path/.style ={to path={|- (\tikztotarget)}},
]
\node[draw] (root) {{.}};
\node[draw, left of=root] (C) {{C}} ;
\node[below=of C] (bC) {};
\node[draw, left of=C] (B) {{B}} ;
\graph[use existing nodes] {
root->[edge label=0, loop above]root;
C->[edge label=1]root;
C->[edge label=0, loop above]C;
B->[edge label=0, loop above]B;
B->[edge label=1]C;
B--bC->[edge label=2, bend right]root;
};
\end{tikzpicture}
\end{document}
但结果却不尽人意:
我现在不仅需要微调节点位置,还有边缘形状的问题。
是否有任何解决方案可以让我指定每条边必须具有的最小距离全部节点?
答案1
控制边缘的方法有多种。
通过将节点的大小减小到零,可以改进不可见节点的方法。然后边缘的末端将相遇,节点将不需要不可见的空间,例如图片的边框。在图片之前的任何地方定义
\tikzset{invisible/.style={minimum width=0mm,inner sep=0mm,outer sep=0mm}}
并将节点标记为不可见:
\node[below=of C,invisible] (bC) {};
或者,使用 (bC.center) 代替 (bC) 作为边的起点和终点。但是,该节点仍将占据空间。
基本上,大多数情况下,隐形节点都不是必需的。首先,你可以在一定程度上控制强边的弯曲程度:
B->[bend left=120]root;
到目前为止,to[out=...,in=...]
规范始终能够满足我的需求。例如,命令
\draw (C) to[out=-20,in=90,edge label=a,swap] (bC.center);
从 C 到 bC 画一条线,边缘从 -20 度处的 C 开始(从正 x 轴测量),并以 90 度角(即顶部位置)结束于 bC。
\draw[->] (C) to[out=-135,in=45,edge label=b,swap] (B);
从 B 到 C 画一条线,从西南开始,到达东北。
这是完整的实验代码及其输出。
\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{arrows,graphs,matrix,positioning}
\begin{document}
\tikzset{invisible/.style={minimum width=0mm,inner sep=0mm,outer sep=0mm}}
\begin{tikzpicture}[>=stealth',
font=\sffamily\small,
every node/.style={align=center},
skip loop left/.style={to path={-- ++(-#1,0)|- (\tikztotarget)}},
skip loop right/.style={to path={-- ++(#1,0)|- (\tikztotarget)}},
hv path/.style ={to path={-| (\tikztotarget)}},
vh path/.style ={to path={|- (\tikztotarget)}},
]
\node[draw] (root) {{.}};
\node[draw, left of=root] (C) {{C}} ;
\node[below=of C,invisible] (bC) {};
\node[below=of C] (bC) {};
\node[draw, left of=C] (B) {{B}} ;
\graph[use existing nodes] {
root->[edge label=0, loop above]root;
C->[edge label=1]root;
C->[edge label=0, loop above]C;
B->[edge label=0, loop above]B;
B->[edge label=1]C;
B->[bend left=120]root;
B--[bend right=40]bC.center->[edge label=2, bend right]root;
};
\draw (C) to[out=-20,in=90,edge label=a,swap] (bC.center);
\draw[->] (C) to[out=-135,in=45,edge label=b,swap] (B);
\end{tikzpicture}
\end{document}