调整边和顶点标签

调整边和顶点标签

我正在使用以下代码(感谢TeX.Stackexchange)绘制一个小的二分图:

\documentclass{article}
\usepackage{tkz-berge}
\usetikzlibrary{fit,shapes,arrows}

\definecolor{myblue}{RGB}{80,80,160}
\definecolor{mygreen}{RGB}{80,160,80}

\begin{document}
\begin{figure}
\centering
\begin{tikzpicture}[scale=0.5]
  \GraphInit[vstyle=Classic]
  \tikzset{VertexStyle/.style =
    {shape=circle,fill=mygreen,minimum size = 6pt,inner sep=0pt}
  }
  \grEmptyPath[Math,x=0,y=0,prefix=d,RA=3,rotation=270]{2}
  \tikzset{VertexStyle/.style =
    {shape=circle,fill=myblue,minimum size = 6pt,inner sep=0pt}
  }  
  \grEmptyPath[Math,x=6,y=0,prefix=s,RA=3,rotation=270]{2}
  \tikzset{EdgeStyle/.style={->,font=\scriptsize}}
  \Edge[label = $0.005$](d0)(s0)
  \Edge[label = $0.002$](d0)(s1)
  \Edge[label = $0.100$](d1)(s1)    
\end{tikzpicture}
\caption{graph}
\label{fig:graph}
\end{figure}
\end{document}

得出

小二分图示例

我想再做一些修改。具体如下:

  1. 将顶点标签d0d1向左移动,以使边缘不会穿过它们。
  2. 移动边缘权重,使得数字位于边缘正上方并与边缘的斜率平行。

笔记: 我是顾问本手册,但没有找到与我的问题相关的有用信息。如果您可以提供更详尽文档的链接,这对我将来会非常有帮助。

进步\SetUpVertex[Lpos=-180]:在定义左列顶点样式之前添加该行,然后\SetUpVertex[Lpos=0]在定义右列顶点样式之前添加该行(即s0s1顶点)。这解决了我在顶点标签位置方面遇到的问题。

答案1

您已经解决了问题的难点:顶点标签的位置。简单的部分是边的标签。您只需添加选项sloped。因此,您的 MWE 代码是:

    \documentclass{article}

\usepackage{tkz-berge}
\usetikzlibrary{fit,shapes,arrows}

\definecolor{myblue}{RGB}{80,80,160}
\definecolor{mygreen}{RGB}{80,160,80}

\usepackage[active,floats,tightpage]{preview}%<-- just to show figure only
    \setlength\PreviewBorder{1em}


\begin{document}
    \begin{figure}
\centering
\begin{tikzpicture}[scale=0.5]
  \GraphInit[vstyle=Classic]
\SetUpVertex[Lpos=-180]
\tikzset{VertexStyle/.style = {shape=circle, fill=mygreen,
                               minimum size=6pt,inner sep=0pt}
  }
\grEmptyPath[Math,x=0,y=0,prefix=d,RA=3,rotation=270]{2}
%
\SetUpVertex[Lpos=0]
\tikzset{VertexStyle/.style = {shape=circle, fill=myblue,
                               minimum size=6pt, inner sep=0pt}
  }
\grEmptyPath[Math,x=6,y=0,prefix=s,RA=3,rotation=270]{2}
\tikzset{EdgeStyle/.style={->,font=\scriptsize,above,sloped,midway}}%<-- new options
  \Edge[label = $0.005$](d0)(s0)
  \Edge[label = $0.002$](d0)(s1)
  \Edge[label = $0.100$](d1)(s1)
\end{tikzpicture}
    \caption{graph}
\label{fig:graph}
    \end{figure}
\end{document}

在此处输入图片描述

在从 pdf 到 jpg 的转换过程中,带有边缘标签的形状的透明度会丢失,因此图片会受到一点损坏。

答案2

PSTricks 解决方案:

\documentclass{article}

\usepackage{pstricks-add}
\usepackage{xfp}

\def\Label(#1)(#2)#3{%
  \psline{->}(#1)(#2)
  \pcline[linestyle = none, offset = 8pt](#1)(#2)
  \ncput*[nrot = :U]{$#3$}}
\def\pointL(#1)#2{%
  \psdot[dotstyle = o, fillcolor = green!80!blue](#1)
  \uput[180](#1){$#2$}}
\def\pointR(#1)#2{%
  \psdot[dotstyle = o, fillcolor = blue!60!red](#1)
  \uput[0](#1){$#2$}}

% parameters
\def\width{4}
\def\height{2}

\begin{document}

\begin{pspicture}(-0.5,-0.15)(\fpeval{\width+0.45},\fpeval{\height+0.4})
  \pnodes{P}(0,0)(\width,0)(0,\height)(\width,\height)
  \Label(P0)(P1){0.100}
  \Label(P2)(P1){0.200}
  \Label(P2)(P3){0.500}
  \pointL(P0){d_{1}}
  \pointL(P2){d_{0}}
  \pointR(P1){s_{1}}
  \pointR(P3){s_{0}}
\end{pspicture}

\end{document}

输出

您所要做的就是改变参数的值,绘图就会相应地调整。

答案3

尝试一下MetaPost及其盒子包,包含在 LuaLaTeX 程序中以方便使用。(如果需要,可以使其独立于 LuaLaTeX。)

编辑注意,它需要luamplib2.10.1 或更高版本。以前的版本有一个vardef与使用后缀(即此处宏@#dot@#)定义的宏相关的错误。

\documentclass[border=2mm]{standalone}
\usepackage{luamplib}
  \mplibtextextlabel{enable}
\begin{document}
  \begin{mplibcode}
    input boxes
    color mygreen, myblue;
    mygreen = 16/51(red+2green+blue); myblue = 16/51(red+green+2blue);
    ahangle := 30; ahlength := 7bp; % Arrowheads stretched: more visible at s1
    numeric r, h, v; h = 4cm; v = 2.5cm;
    circmargin := 3pt;
    vardef dot@#(expr c) =
      fill bpath@# withcolor c; drawboxed(@#); draw bpath@#;
    enddef;
    beginfig(1);
      forsuffixes s = d0, d1, s0, s1: circleit.s(""); endfor
      s0.c - d0.c = (h, 0); d0.c - d1.c = s0.c - s1.c = (0, v);  
      forsuffixes i = 0, 1:
        dot.d[i](mygreen); dot.s[i](myblue);
        drawarrow d[i].e -- s[i].w;
      endfor
      drawarrow d0.c -- s1.c cutbefore bpath.d0 cutafter bpath.s1;
      label.lft("$d_0$", d0.w); label.rt("$s_0$", s0.e);
      label.lft("$d_1$", d1.w); label.rt("$s_1$", s1.e); 
      label.top("$0.005$", .5[d0.c, s0.c]);
      label.top("$0.002$", .5[d0.c, s1.c]) 
        rotatedaround (.5[d0.c, s1.c], angle(s1.c-d0.c)); 
      label.top("$0.100$", .5[d1.c, s1.c]);
    endfig; 
  \end{mplibcode}
\end{document}

d0以原点为中心,其他节点的位置可以通过hv参数随意改变,如点的半径(赋予包circmargin中定义的变量的值boxes)。

在此处输入图片描述

相关内容