赞
踩
作者:Daniel
时间:2020年6月4日
本文介绍一个简单树图的绘制方法,领悟其中的思路以后,举一反三就可以画出更复杂的图了。
前一篇文章介绍了Tikz
作图的优点:专业、精致、与LaTeX
完美融合。你现在是不是准备好了来尝试画出自己的第一个图了呢?让我们开始吧!
TikZ
作图不需要安装什么软件,因为它就是一个LaTeX
宏包,我们直接调用就可以了。只要电脑里安装了TeXLive
,就可以开始了。
打开LaTeX
编辑器,写下下面的代码,保存为一个空白的TikZ
作图模板,下次作图就可以从这个空白模板开始。
\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{graphs,graphdrawing,arrows}
\usegdlibrary{trees,layered}
\begin{document}
\end{document}
这里使用的文档类型是standalone
, 编译出来的结果就是一张pdf格式的图片。
导言区的三行语句是调用tikz
宏包、加载graphs,graphdrawing
库文件。我们如果使用\graph
命令绘图的话,这三项是必须加载的。
如果我们需要使用一些不同风格的箭头,就要加载arrows
。trees,layered
是决定图的呈现方式的算法程序。
需要注意的是,当我们调用了graphdrawing
库后,编译命令要用LuaLaTeX
,否则会报错。
今天我们画一个简单的树图:
我们来看一下这个简单的树图有些什么要素:
每个图论文献中的图都有这些要素。我们用TikZ
作图(这里的图特指图论中的“graph”)可以分为四个步骤:
1. 告诉邻接关系,
2. 设置顶点样式,
3. 批量设置标签,
4. 美化修饰细节。
下面分步进行说明:
图1中的图的邻接关系很简单:顶点1与顶点2、3、4、5相连,它是一个星图。我们用命令\graph{1--{2,3,4,5}};
就说明白了这种邻接关系。
这里\graph{ };
是一个空的作图命令,它告诉Tikz
用库文件graphs,graphdrawing
绘制一个graph。需要注意的是,每个TikZ
绘图命令末尾都要加上英文分号:;
,否则会出现报错。
1--{2,3,4,5}
这句话是说顶点1与四个邻点用无向边连结。四个邻点用大括号括起来,用逗号分开。
在\begin{document}
和\end{document}
之间加上下面的代码:
\begin{tikzpicture}
\graph{
1--{2,3,4,5}
};
\end{tikzpicture}
编译后的图形如下:
当我们初次看到这个结果时,会皱着眉头说,TikZ
画出来的图不过如此嘛,看来是徒有虚名啊!
慢着,你的结论可能下得太早了!丑小鸭长大了才变成美天鹅,不是吗?现在的图不过是雏形,我们还要后期制作,让它变成我们想要的样子。
先在\graph
加上后面加上tree layout
选项,即
\begin{tikzpicture}
\graph[tree layout]{
1--{2,3,4,5}
};
\end{tikzpicture}
这时,变成这样:
稍微好看一点了!但是我们发现它的顶点是数字,而不是小黑圆圈,也没有标签。所以还需要下面两步。
顶点的样式可以在命令\graph[style1,style2,...]{};
中的中括号添加选项完成。我们需要将顶点设置成:小黑圆圈,去掉数字,只需要这样写命令:[nodes={draw,circle,fill,as=}]
。
draw,circle
是画一个黑色的圆圈。如果你想让顶点成为一个长方形,就去掉circle
选项,因为顶点的默认形状就是长方形。
fill
是将圆圈填充为默认的黑色,如果写fill=blue
则是用蓝色填充,同样可以用draw=blue
将圆圈设置为蓝色。
as=
是为顶点添加一个文本,这里“=”后面为空,就是空白,这相当于将原来的数字去掉了。如果用empty nodes
也有同样效果。
添加设置顶点样式的代码:
\begin{tikzpicture}
\graph[nodes={draw,circle,fill,as=}]{
1--{2,3,4,5}
};
\end{tikzpicture}
编译后的结果如下图:
下面我们首先添加顶点1的标签,在\graph{};
外面重新开始一行:
\node at(1)[above=3pt]{$v_1$};
这里\node
是我们常常用于添加标签的命令,at(1)
是在顶点1的位置,“(1)
”相当于指明顶点1的坐标,尽管我们不知道它的坐标是什么。中括号的选项说明标签放在顶点1的上方,并向上移动3pt。大括号中的数学公式是顶点1的标签
v
1
v_1
v1。
用同样的方式可以将顶点2~5的标签设置为
v
2
∼
v
5
v_2\sim v_5
v2∼v5, 用选项[below=3pt]
将标签置于顶点下方。
但是,我们可以有更加聪明、有效的方法进行批量设置顶点的标签。那就是重复操作命令\foreach
, 用一个变量\x
,让它在集合
{
2
,
.
.
.
,
5
}
\{2,...,5\}
{2,...,5}中取值,然后将标签用含有变量的$v_{\x}$
表示:
\foreach \x in {2,...,5} \node at (\x)[below=3pt]{$v_{\x}$};
当\x
每取一个数值时,就执行一次\node
的命令,直到\x
取完集合中的每一个数值,就批量设置出了顶点2~5的标签。
这时,图形就画好了:
我们来仔细端详一下这个成品图,整体看起来不错!但是,每个人的审美观不一样,可能有些细节地方还没有达到自己想要的效果。比如,我觉得顶点大了一点, v 2 ∼ v 5 v_2\sim v_5 v2∼v5四个顶点的距离太宽了, v 1 v_1 v1与下面四个顶点的距离小了一点…。
令人欣慰的是,TikZ
允许我们进行自由调整这些距离。我们进入最后一步:美化修饰细节。
首先调节level distance
和sibling distance
这两个距离。sibling不是兄弟姊妹吗?这个sibling distance
是什么意思呢?原来,在树结构图中,将上顶点是分级的,一个顶点与其下一级相邻的顶点是父(parent)与子(children)的关系,所以,同一级的children之间就是sibling的关系。
下面的示意图直观解释了这两个距离的含义:
现在将这两个距离分别设置为1cm 和0.5cm:
level distance=1cm,sibling distance=0.5cm
然后,将顶点的圆缩小一点,设置为:
inner sep=0mm,minimum size=2.5mm
这里inner sep
指的是文字和它的背景形状边缘之间空隙宽度,而minimum size
是顶点形状的宽和高的值,对于圆来说,指的是半径。
由于inner sep
默认是
1
3
e
m
\frac{1}{3}em
31em, 所以即使是空的顶点,画出来的圆圈也是挺大的。将它设为0以后,又变得太小了,所以再用minimum size =2.5mm
进行校正。
将上面的两行代码加入到\graph[]
的中括号中,得到完整的代码如下:
\documentclass{standalone} \usepackage{tikz}%%调用TikZ宏包 \usetikzlibrary{graphs,graphdrawing,arrows}%%调用graphs和graphdrawing库 \usegdlibrary{trees,layered}%% \begin{document} \begin{tikzpicture} \graph[tree layout,level distance=1cm,sibling distance=0.5cm ,nodes={draw,circle,fill,inner sep=0pt,minimum size=2.5mm,empty nodes}]%%设置样式 { 1--{2,3,4,5}; };%% 邻接关系 \node at(1)[above=3pt]{$v_1$};%%设置标签 \foreach \x in {2,...,5}\node at (\x)[below=3pt]{$v_{\x}$};%%批量设置标签 \end{tikzpicture} \end{document}
输出的图形如下:
总结:
TikZ
是一款与LaTeX
无缝对接的智能绘图宏包,它就像一个经验丰富的大师,你只需要告诉它做什么,修改哪里,它都能给你一个圆满的解决方案。虽然,我们学习需要记住一些命令,但是,这些命令好像生活中的语言,记住它们并没有太大的难度。使用TikZ
画图,就是与它对话!
关注公众号:大哉数学之为用,领取福利啦!
【LaTeX微信交流加群:】
如果你希望交流LaTeX使用或者TikZ作图方面的问题,请先添加作者微信:niltxz
,然后加入作者的LaTeX交流微信群。
【免费资料索取:】
如果你需要LaTeX方面的安装、使用的入门学习材料,请在本公众号回复:latex0
, 索取资料下载链接及提取码(链接永久有效),都是非常实用LaTeX入门资料,里面包含:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。