二分图

二分图

我的图形的边缘重叠了,有没有办法让它们之间保持一定的距离,以及如何为特定的边缘着色?

\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线条的位置:

  1. 指定节点的起始和终止位置(以度为单位)
  2. yshift在开始和结束节点上使用
  3. 使用calctikzlibrary 为开始和/或结束位置添加偏移量

第一种方法是将节点指定为(nodename.degrees)而不是,因此您可以使用(nodename)而不是例如。在这种情况下,您不会从最靠近对面节点的点开始画线,而是从 0 度开始逆时针 45 度的位置开始画线,该位置位于节点的右侧。(s5)(s5.45)

第二种方法使用语法指定线节点在 y 位置上的移动距离,([yshift=xx unit]nodename)在本例中例如([yshift=-25mm]s6)。这仅当您以完全相同的量移动相对节点时才有效,因此它不太灵活。

第三种方法使用calctikzlibrary 向节点添加坐标,语法为($(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}

相关内容