TikZ作图教程:图论篇—树图的绘制

作者: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命令绘图的话,这三项是必须加载的。

如果我们需要使用一些不同风格的箭头,就要加载arrowstrees,layered是决定图的呈现方式的算法程序。

需要注意的是,当我们调用了graphdrawing库后,编译命令要用LuaLaTeX,否则会报错。

今天我们画一个简单的树图:
在这里插入图片描述

我们来看一下这个简单的树图有些什么要素:

  • 点、边相连构成图的主体;
  • 点用黑色小圆圈表示,边用线段表示;
  • 每个点都有标签;

每个图论文献中的图都有这些要素。我们用TikZ作图(这里的图特指图论中的“graph”)可以分为四个步骤:

1. 告诉邻接关系,
2. 设置顶点样式,
3. 批量设置标签,
4. 美化修饰细节。

下面分步进行说明:

Step 1. 告诉邻接关系

图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}

这时,变成这样:
在这里插入图片描述

稍微好看一点了!但是我们发现它的顶点是数字,而不是小黑圆圈,也没有标签。所以还需要下面两步。

Step 2. 设置顶点样式

顶点的样式可以在命令\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}

编译后的结果如下图:
在这里插入图片描述

Step 3. 批量设置标签

下面我们首先添加顶点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 v2v5, 用选项[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 v2v5四个顶点的距离太宽了, v 1 v_1 v1与下面四个顶点的距离小了一点…。

令人欣慰的是,TikZ允许我们进行自由调整这些距离。我们进入最后一步:美化修饰细节。

美化修饰细节

首先调节level distancesibling 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入门资料,里面包含:

  • 一份简明的关于安装latex的介绍
  • 中文LaTeX安装与使用
  • 5
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值