我正在使用以下代码(感谢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}
得出
我想再做一些修改。具体如下:
- 将顶点标签
d0
和d1
向左移动,以使边缘不会穿过它们。 - 移动边缘权重,使得数字位于边缘正上方并与边缘的斜率平行。
笔记: 我是顾问本手册,但没有找到与我的问题相关的有用信息。如果您可以提供更详尽文档的链接,这对我将来会非常有帮助。
进步\SetUpVertex[Lpos=-180]
:在定义左列顶点样式之前添加该行,然后\SetUpVertex[Lpos=0]
在定义右列顶点样式之前添加该行(即s0
和s1
顶点)。这解决了我在顶点标签位置方面遇到的问题。
答案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。)
编辑注意,它需要luamplib
2.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
以原点为中心,其他节点的位置可以通过h
和v
参数随意改变,如点的半径(赋予包circmargin
中定义的变量的值boxes
)。