我的图形的边缘重叠了,有没有办法让它们之间保持一定的距离,以及如何为特定的边缘着色?
\definecolor{myblue}{RGB}{80,80,160}
\definecolor{mygreen}{RGB}{80,160,80}
\begin{tikzpicture}[thick,
every node/.style={draw,circle},
ssnode/.style={fill=myblue},
fsnode/.style={fill=mygreen},
every fit/.style={ellipse,draw,inner sep=-1pt,text width=1.75cm},
->,shorten >= 2pt,shorten <= 2pt
]
% the vertices of Slots
\begin{scope}[start chain=going below,node distance=1.5mm]
\foreach \i in {1,2,...,8}
\node[ssnode,on chain] (s\i) [label=left: \i] {};
\end{scope}
% the vertices of Flights
\begin{scope}[xshift=4cm,yshift=-0.5cm,start chain=going below,node distance=1.5mm]
\foreach \i in {$f_{2}$,$f_{5}$,$f_{6}$,$f_{7}$,$f_{8}$}
\node[fsnode,on chain] (f\i) [label=right: \i] {};
\end{scope}
% the set Slots
\node [myblue,fit=(s1) (s8),label=above:$Slots$] {};
% the set Flights
\node [mygreen,fit=(f$f_{2}$) (f$f_{8}$),label=above:$Flights$] {};
% the edges
\draw (s2) -- (f$f_{2}$);
\draw (s5) -- (f$f_{5}$);
\draw (s6) -- (f$f_{6}$);
\draw (s7) -- (f$f_{7}$);
\draw (s8) -- (f$f_{8}$);
\draw (f$f_{2}$) -- (s1);
\draw (f$f_{5}$) -- (s3);
\draw (f$f_{6}$) -- (s5);
\draw (f$f_{7}$) -- (s5);
\draw (f$f_{8}$) -- (s7);
\draw (s3) -- (f$f_{5}$);
\draw (s1) -- (f$f_{2}$);
\end{tikzpicture}
答案1
有多种技术可以改变\draw
线条的位置:
- 指定节点的起始和终止位置(以度为单位)
yshift
在开始和结束节点上使用- 使用
calc
tikzlibrary 为开始和/或结束位置添加偏移量
第一种方法是将节点指定为(nodename.degrees)
而不是,因此您可以使用(nodename)
而不是例如。在这种情况下,您不会从最靠近对面节点的点开始画线,而是从 0 度开始逆时针 45 度的位置开始画线,该位置位于节点的右侧。(s5)
(s5.45)
第二种方法使用语法指定线节点在 y 位置上的移动距离,([yshift=xx unit]nodename)
在本例中例如([yshift=-25mm]s6)
。这仅当您以完全相同的量移动相对节点时才有效,因此它不太灵活。
第三种方法使用calc
tikzlibrary 向节点添加坐标,语法为($(nodename)+(x,y)$)
。这看起来有点复杂,但它是最灵活的方法。请注意,这会偏移属性shorten =
,因此您需要通过在 x 坐标上加或减一点来将其添加回来。
下面的 MWE 显示了所有三种方法。此外,我(f)
通过将下标放在节点标签中而不是节点名称中来简化节点的名称。对于从节点到节点的双向箭头,我通过使用 来简化绘制[<->]
。这在重叠方面看起来也更好一些。
通过将颜色名称作为绘图命令的选项来完成边的着色,例如\draw[red]
。
梅威瑟:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{chains,fit,shapes}
\usetikzlibrary{calc}
\begin{document}
\definecolor{myblue}{RGB}{80,80,160}
\definecolor{mygreen}{RGB}{80,160,80}
\begin{tikzpicture}[thick,
every node/.style={draw,circle},
ssnode/.style={fill=myblue},
fsnode/.style={fill=mygreen},
every fit/.style={ellipse,draw,inner sep=-1pt,text width=1.75cm},
->,shorten >= 2pt,shorten <= 2pt
]
% the vertices of Slots
\begin{scope}[start chain=going below,node distance=1.5mm]
\foreach \i in {1,2,...,8}
\node[ssnode,on chain] (s\i) [label=left: \i] {};
\end{scope}
% the vertices of Flights
\begin{scope}[xshift=4cm,yshift=-0.5cm,start chain=going below,node distance=1.5mm]
\foreach \i in {2,5,6,7,8}
\node[fsnode,on chain] (f\i) [label=right: $f_{\i}$] {};
\end{scope}
% the set Slots
\node [myblue,fit=(s1) (s8),label=above:$Slots$] {};
% the set Flights
\node [mygreen,fit=(f2) (f8),label=above:$Flights$] {};
% the edges
\draw[red] (s2) -- (f2);
\draw (s5.45) -- (f5.220);
\draw ([yshift=-25mm]s6) -- ([yshift=-25mm]f6);
\draw (s7) -- (f7);
\draw (s8) -- (f8);
\draw[<->] ($(f2)+(-0.15,0.15)$) -- (s1);
\draw[<->] (f5) -- (s3);
\draw (f6) -- (s5);
\draw (f7) -- (s5);
\draw (f8) -- (s7);
\end{tikzpicture}
\end{document}
结果:
答案2
您可以将飞行节点间隔开一点,并更改箭头形状。在下面的示例中,我使用了Latex[width=3pt, length=4pt]
,这需要库arrows.meta
。此外,减少两组之间的距离可以改善箭头角度。
其他变化:
- 使用
\itshape
而不是$...$
来获得正确的间距。 - 我更改了节点名称以避免飞行节点出现奇怪的名称。
- 绘制箭头时放置箭头的方向,而不是使用全局设置。
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary {chains, fit, shapes.geometric, arrows.meta}
\begin{document}
\definecolor{myblue}{RGB}{80,80,160}
\definecolor{mygreen}{RGB}{80,160,80}
\begin{tikzpicture}[thick,
every node/.style={draw, circle},
ssnode/.style={fill=myblue},
fsnode/.style={fill=mygreen},
every fit/.style={ellipse, draw, inner sep=-1pt, text width=1.75cm},
>={Latex[width=3pt, length=4pt]}, shorten >= 2pt, shorten <= 2pt
]
% the vertices of Slots
\begin{scope}[start chain=going below,node distance=1.5mm]
\foreach \i in {1,2,...,8}
\node[ssnode,on chain] (s\i) [label=left: \i] {};
\end{scope}
% the vertices of Flights
\begin{scope}[xshift=3cm, yshift=-0.15cm, start chain=going below, node distance=5mm]
\foreach \i in {2,5,6,7,8}
\node[fsnode, on chain] (f\i) [label=right: $f_{\i}$] {};
\end{scope}
% the set Slots
\node [myblue, fit=(s1) (s8), label=above:\itshape Slots] {};
% the set Flights
\node [mygreen, fit=(f2) (f8), label=above:\itshape Flights] {};
% the edges
\draw[->] (s2) -- (f2);
\draw[->] (s5) -- (f5);
\draw[->] (s6) -- (f6);
\draw[->] (s7) -- (f7);
\draw[->] (s8) -- (f8);
\draw[<->] (f2) -- (s1);
\draw[<->, red] (f5) -- (s3);
\draw[->, orange] (f6) -- (s5);
\draw[->] (f7) -- (s5);
\draw[->] (f8) -- (s7);
\end{tikzpicture}