这里是一则小广告:
关注作者请点击这里哦:zdr0
我的专栏里面不仅有学习笔记,也有一些科普文章,相信我的专栏不会让您失望哦~大家可以关注一下:数学及自然科学
记得点赞加收藏哦~
创作不易,请赞赏一下支持一下作者吧[期待]~
文章中如果有错误的话还请各位大佬多多斧正,感谢!
-尽力写最好的讲义,尽力写最好的科普。
这篇文章中,我们来学习
中tikz宏包的一些基本命令。
一般人们并不直接使用PGF 底层命令,而是通过它前端TikZ 来调用。在引用tikz 宏包之前,用户需要设置PGF 系统驱动。比如dvipdfmx 的设置方法如下,使用pdflatex 和xelatex 时,它知道驱动是谁。
\def\pgfsysdriver{pgfsys -dvipdfmx.def}
\usepackage{tikz}
\begin{document}
...
\end{document}
TikZ宏包是一个十分强大的绘图宏包,它提供\tikz 命令和tikzpicture 环境,具体绘图指令可以放在\tikz 后面,也可以放在tikzpicture 中间。两者效果相同,用户可以任意选择。
\tikz ...
\begin{tikzpicture}
...
\end{tikzpicture}
本人的习惯是使用后者。
基本图形对象
直线和矩形
使用PGF绘图的基本语法是:
\draw[option]...;
其中\draw 称为绘图命令;后面的...部分称为操作;而[]中的能容称为选项,也就是说[]内可以不写内容。
如果我们要绘制一条直线的话,我们只需要在\draw 命令后面输入点的坐标并使用--连结起来即可。比如:
%Ex1\begin{tikzpicture}
\draw (1,3)--(2,2)--(4,5);
\end{tikzpicture}图片1:Ex1。
当然了,你可以通过[option]将图片1中锋利的角变成圆角,在option 处填写rounded corners即可:
%Ex1(rounded corners)\begin{tikzpicture}
\draw[rounded corners] (1,3)--(2,2)--(4,5);
\end{tikzpicture}图片2:Ex1(rounded corners)。
我们也可以将Ex1 的首尾相连,使他成为一个“封闭”图形。做法也很简单,就是让最后一个点的坐标与起点相同即可:
%Ex1(circuit)\begin{tikzpicture}
\draw (1,3)--(2,2)--(4,5)--(1,3);
\end{tikzpicture}图片3:Ex1(circuit)。
但图片三并非真正意义上的封闭图形,因为那只是我们人为的设置了终点和起点一致而已。如果想要绘制真正意义上的封闭图形,那我们需要使用cycle 操作:
%Ex1(closed circuit)\begin{tikzpicture}
\draw (1,3)--(2,2)--(4,5)--cycle;
\end{tikzpicture}图片4:Ex1(closed circuit)。
你会发现图片4和图片3似乎没有什么区别,但是,如果将所有的角都换成圆角,那么区别就立刻出现了:图片5:加圆角效果。
图片5的左侧是我们对图片3加圆角的效果,右侧是对图片4加圆角的效果。可见,图片4这个伪封闭的图形它的左上顶点并未被圆角化,而图片4中的所有角均被圆角化了。
下面我们在来看看如何绘制一个矩形。矩形当然也有伪封闭和真封闭之分了,伪封闭的矩形我就不再举例了,下面的的代码是最正统的绘制矩形的方式:
%Ex2(rectangle)\begin{tikzpicture}
\draw (0,0) rectangle (4,2);
\end{tikzpicture}图片6:Ex2(rectangle)。
可见绘制矩形使用到的操作是 rectangle。我们只需要给出矩形的一对对角顶点然后将 rectangle 写在两者中间即可。比如Ex2 中的两个对角顶点分别是
和
。矩阵也有圆角选项,设置方式与之前一样:
%Ex2(rectangle rounded corners)\begin{tikzpicture}
\draw[rounded corners] (0,0) rectangle (4,2);
\end{tikzpicture}图片7:Ex2(rectangle rounded corners)。
圆、椭圆、弧
画一个圆的命令十分的简单,给出圆心坐标和半径,然后将circle 操作写在两者之间即可,注意半径值需要用小括号括起来:
%Ex3(circle)\begin{tikzpicture}
\draw (1,1) circle (1);
\end{tikzpicture}图片8:Ex3:(circle)。
Ex3绘制了一个圆心在
,半径为
的圆。
绘制椭圆的方式也很简单,只要给出椭圆的重心和长轴长、短轴长,然后将ellipse 操作写在两者中间即可,注意,长轴长和短轴长需要用括号括起来,两者之间用and隔开:
%Ex4(ellipse)\begin{tikzpicture}
\draw (1,1) ellipse (2 and 1);
\end{tikzpicture}图片9:Ex4(ellipse)。
Ex4绘制了一个中心在
,长轴长为
、短轴长为
的椭圆。
绘制圆弧或者椭圆弧我们只需要使用arc 操作并给出相应角度即可:
%Ex5(arc)\begin{tikzpicture}
\draw (1 ,1) arc (0:270:1);
\draw (6 ,1) arc (0:270:2 and 1);
\end{tikzpicture}图片10:Ex5(arc)。
其中,参数
代表的是
到
,即图片10分别绘制了一个圆心在
,半径为
的四分之三圆弧和一个中心在
,长轴长为
、短轴长为
的四分之三椭圆弧。在终止角度之后,使用一个冒号隔开终止角度与半径(长轴长 and 短轴长)。
曲线
我们把直线的 --换成 ..,就得到贝塞尔曲线,它需要至少一个控制点。抛物线用parabola 操作,bend 操作可以指明顶点。
%Ex6(parabola)\begin{tikzpicture}
\draw (5,1) parabola bend (6,0) (7.414 ,2);
\end{tikzpicture}图片11:Ex6(parabola)。
Ex6中,
代表抛物线的起点,
代表抛物线的顶点,
代表抛物线的终点。如果我们想要将这些点也进行标记那我们可以使用\filldraw 命令:
\Ex6(mark point)
\begin{tikzpicture}
\draw (5,1) parabola bend (6,0) (7.414 ,2);
\filldraw (5,1) circle (.1)
(6,0) circle (.1)
(7.414 ,2) circle (.1);
\end{tikzpicture}图片12:Ex6(mark point)。
网格
网格的画法如下,其缺省步长是
。grid 操作需要起止点两个参数。help lines 参数指示用0.2pt 的灰线。
%Ex8(grid)\begin{tikzpicture}
\draw [step=20pt] (0,0) grid (3,2);
\draw [help lines ,step=20pt] (4,0) grid (7,2);
\end{tikzpicture}图片13:Ex8(grid)。
绘制网格类似于绘制矩形,起点和终点类似于我们在绘制矩形时给出的一对矩形的对角顶点,我们将grid 操作放在这一对点之间即可。step 是步长,即每一个小单元格的边长(小单元格均为正方形),其单位是pt。如果我们想要单元格的长度大一点的话那我们就将步长设置的大一些,否则就设置的小一些。
图形控制
箭头
一些绘制箭头的命令如下:
%Ex9(arrows)\begin{tikzpicture}
\draw [->] (0,0)--(9,0);
\draw [
\draw [] (0,2)--(9,2);
\draw [>->>] (0,3)--(9,3);
\draw [||] (0,4)--(9,4);
\end{tikzpicture}图片14:Ex9(arrows)。
绘制箭头的命令很简单,不需要任何操作。[]仍是选项,这个选项中是你要绘制的箭头的形式,其中代表了箭头两侧的指向,而—表示线。因为我们的箭头都是有限长度的,所以,我们需要在[]后面指定箭头的起点和终点,而线是直线,所以我们仍使用--连接起点和终点。
线型和线宽
PGF 中线条的缺省宽度是0.4pt,线型是实线。下例给出了改变线型和线宽的方法:
%Ex10(change the type and the width of the line)\begin{tikzpicture}
\draw [line width =2pt] (0,0)--(9,0); %加粗实线\draw [dotted] (0,1)--(9,1); %点状虚线\draw [densely dotted] (0,2)--(9,2); %较密的点状虚线\draw [loosely dotted] (0,3)--(9,3); %较疏的点状虚线\draw [dashed] (0,4)--(9,4); %线状虚线\draw [densely dashed] (0,5)--(9,5); %较密的线状虚线\draw [loosely dashed] (0,6)--(9,6); %较疏的线状虚线\end{tikzpicture}图片15:Ex10(change the type and the width of the line)。
样式
PGF 比较牛逼的一个地方是我们可以自定义一些样式,这些样式一旦被定义了就可以像面向对象的类一样被继承。也就是说我们可以在导言区定义一个样式,然后将来我们可以直接在文本区调用它。比如:
%Ex11(style)\tikzset{
dline/.style ={color = blue, line width =2pt}
}
\begin{document}
...
\begin{tikzpicture}
\draw[dline] (0,0) --(9,0);
\end{tikzpicture}
...
\end{document}图片16:Ex11(stylw)
除了用\tikzset 命令定义样式,我们也可以在tikzpicture 环境头部声明样式。前者是全局有效,后者则是局部范围有效。
%Ex11(style head of tikzpicture environment)\begin{tikzpicture}[dline /. style ={line width =2pt}]
\draw[dline] (0,0) --(9,0);
\end{tikzpicture}
图形变换
我们可以对图形对象进行一些变换操作,比如缩放(scale)、平移(shift)、倾斜(slant) 、旋转(rotate)、定点旋转(rotate around) 等。注意如果两种操作同时进行,它们是有顺序的。预定义的长度单位在这里对单向平移选项(xshift或yshift) 失效。我们以正方形为例,来看看如何对它进行上述变换。首先,先来画一个正方形:
\begin{tikzpicture}
\draw (0,0) rectangle (2,2);
\end{tikzpicture}
下面我们先对其进行平移变换:
\begin{tikzpicture}
\draw (0,0) rectangle (2,2);
\draw[shift ={(3 ,0)}] (0,0) rectangle (2,2);
\draw[shift ={(0 ,3)}] (0,0) rectangle (2,2);
\draw[shift ={(0 ,-3)}] (0,0) rectangle (2,2);
\draw[shift ={(-3 ,0)}] (0,0) rectangle (2,2);
\draw[shift ={(3 ,3)}] (0,0) rectangle (2,2);
\draw[shift ={(-3 ,3)}] (0,0) rectangle (2,2);
\draw[shift ={(3 ,-3)}] (0,0) rectangle (2,2);
\draw[shift ={(-3 ,-3)}] (0,0) rectangle (2,2);
\end{tikzpicture}图片17:平移变换。中间的正方形为原始正方形。
即:将正方形的左下顶点
沿水平方向向右平移
个单位到
,这样矩形整体向右平移
个单位;
将正方形的左下顶点
沿水平方向向上平移
个单位到
,这样矩形整体向上平移
个单位;
将正方形的左下顶点
沿水平方向向下平移
个单位到
,这样矩形整体向下平移
个单位;
将正方形的左下顶点
沿水平方向向左平移
个单位到
,这样矩形整体向左平移
个单位;
将正方形的左下顶点
沿水平方向向右上平移
个单位到
,这样矩形整体向右上平移
个单位;
将正方形的左下顶点
沿水平方向向左上平移
个单位到
,这样矩形整体向左上平移
个单位;
将正方形的左下顶点
沿水平方向向右下平移
个单位到
,这样矩形整体向右下平移
个单位;
将正方形的左下顶点
沿水平方向向左下平移
个单位到
,这样矩形整体向左下平移
个单位。
我们还可以指定平移方向和平移距离。xshift 表示水平平移;yshift表示竖直平移,后面直接跟平移的距离即可(可为负数),平移距离的单位是pt:
\begin{tikzpicture}
\draw (0,0) rectangle (2,2);
\draw[xshift =100pt] (0,0) rectangle (2,2);
\draw[xshift =-100pt] (0,0) rectangle (2,2);
\draw[yshift =100pt] (0,0) rectangle (2,2);
\draw[yshift =-100pt] (0,0) rectangle (2,2);
\end{tikzpicture}图片18:指定平移方向以及平移距离。
需要注意的是如果指定了平移的方向那么后面就不能使用坐标了,而只能自定义平移距离。下面我们再来看看缩放变换:
\begin{tikzpicture}
\draw (0,0) rectangle (2,2);
\draw[xshift =70pt ,xscale =1.5] (0,0) rectangle (2,2);
\draw[yshift =70pt ,yscale =1.5] (0,0) rectangle (2,2);
\draw[xshift =-70pt ,xscale =0.5] (0,0) rectangle (2,2);
\draw[yshift =-70pt ,yscale =0.5] (0,0) rectangle (2,2);
\end{tikzpicture}图片19:指定方向的缩放变换。
注意,缩放变换是不需要平移的!这里用了平移是为了方便一次性说明所有缩放的效果。xscale = a:指定水平方向缩放
倍。若
则代表水平方向放大(水平拉长);若
则代表水平方向缩小(水平缩短);
yscale = a:指定竖直方向缩放
倍。若
则代表竖直方向放大(竖直拉长);若
则代表竖直方向缩小(竖直缩短)
还有一种更特殊的缩放方式,就是对图形进行整体缩放:
\begin{tikzpicture}
\draw (0,0) rectangle (2,2);
\draw[shift ={(3,0)},scale =1.5] (0,0) rectangle (2,2);
\draw[shift ={(-2 ,0)},scale =0.5] (0,0) rectangle (2,2);
\end{tikzpicture}图片20:整体缩放变换。
scale = a:指定整体缩放
倍。若
则代表整体放大;若
则代表整体缩小;
然后是旋转变换:
\begin{tikzpicture}
\draw (0,0) rectangle (2,2);
\draw[xshift =125pt ,rotate =45] (0,0) rectangle (2,2);
\end{tikzpicture}图片21:旋转变换。
rotate后面的数值写要旋转的角度,正数表示逆时针旋转相应角度,而负数表示顺时针旋转相应角度,这与数学上的正方向规定是一致的。
而且如果没有指定对某个点进行旋转的话那么默认是对起点进行旋转,上例中即
。
还有一个倾斜变换:
\begin{tikzpicture}
\draw (0,0) rectangle (2,2);
\draw[xshift =70pt ,xslant =1] (0,0) rectangle (2,2);
\draw[yshift =70pt ,yslant =1] (0,0) rectangle (2,2);
\end{tikzpicture}图片22:倾斜变换。
最后一个就是我们的定点旋转了:
\begin{tikzpicture}
\draw (0,0) rectangle (2,2);
\draw[xshift =125pt ,rotate =45] (0,0) rectangle (2,2);
\draw[xshift =175pt ,rotate around ={45:(2 ,2)}] (0,0) rectangle (2,2);
\end{tikzpicture}图片23:定点旋转。
定点旋转的只需要在rotate aroun后面的{}中写上旋转的角度和指定点的坐标即可。旋转的方向与非定点旋转时的方向规定一致。
最后一定要说明的一点就是无论是使用哪种变换操作,后面一定要更被操作的对象!比如上面的几个例子中,每次变换后面都跟了(0,0) rectangle (2,2) 这个对象,也就是我们的正方形。
颜色和填充
PGF 可以结合xcolor 宏包的色彩功能。颜色和填充的用法见下例,其中\filldraw 命令可以用不同颜色画线和填充。注意封闭路径才可以填充!
\begin{tikzpicture}
\draw[red] (0,0) --(9,0);
\draw[green] (0,1) --(9,1);
\draw[blue] (0,2) --(9,2);
\filldraw[draw=blue!80,fill=blue!20] (14 ,1) circle (1);
\end{tikzpicture}图片24:颜色和填充示例。
上例中如果我们想设置直线的颜色那么我们可以直接在\draw 命令后面的选项中填写颜色即可。\filldraw 命令的选项中,draw是为封闭图形的边界设置颜色,而fill是对封闭图形的内部填充颜色。
示意图
节点
PGF 中的节点(node) 可以是简单的标签,也可以有各种形状的边框,还可以有各种复杂的属性。比如下例中的box 样式,它的边框是矩形,有圆角;它有最小宽度、高度、文字和边框的距离,边框和填充颜色等属性。
\tikzset{
box/.style ={
rectangle, %矩形节点rounded corners =5pt, %圆角minimum width =50pt, %最小宽度minimum height =20pt, %最小高度inner sep=5pt, %文字和边框的距离draw=blue %边框颜色}}
流程图
除了上述属性,节点还可以有名字、位置等属性。在下例中,我们先画了三个有名字和边框的节点,也就是文本框;然后用两跳箭头连线把文本框连接起来,注意连接时要引用文本框的名字;接着在连线上加了两个没有名字和边框的标签。
\begin{tikzpicture}
\node[box] (1) at(0,0) {1};
\node[box] (2) at(4,0) {2};
\node[box] (3) at(8,0) {3};
\draw[->] (1)--(2);
\draw[->] (2)--(3);
\node at(2,1) {a};
\node at(6,1) {b};
\end{tikzpicture}图片25:简单流程图。
\node 命令是绘制节点,[]还是选项,这个选项中可以填我们之前自定义的box,如果填了box 那么他就会按照box 所定义的样式绘制节点,否则就按缺省模式绘制。()中写的是文本框的名字,这个名字可以随便取,{}是文本框中的文本,而at+坐标表示的是节点所处的位置。
我们也可以绘制一棵树:
\begin{tikzpicture}[sibling distance =80pt]
\node[box] {1}
child {node[box] {2}}
child {node[box] {3}
child {node[box] {4}}
child {node[box] {5}}
child {node[box] {6}}
};
\end{tikzpicture}图片26:树。
child 关键字用来声明子节点;sibling distance 选项可以控制相邻节点之间的距离,单位为pt。当然,你可也以使用圆形节点,将box\.style 中的rectangle 换成circle 并删除rounded corners选项,并将minimum width 的值和minimum height 的值设为同一个值,比如这里都设置为20pt:图片27:使用圆形节点。
填充,在box\.style 在添加一项fill = blue!20即可得到:图片28:填充效果。
是不是感觉可以用流程图搞一个神经网络玩儿玩儿?那必须可以啊,我来画一个:
\begin{tikzpicture}
\node[circle,
minimum width =30pt ,
minimum height =30pt ,draw=blue] (1) at(0,2){$x_1$};
\node[circle,
minimum width =30pt ,
minimum height =30pt ,draw=blue] (2) at(0,0){$x_2$};
\node[circle,
minimum width =30pt ,
minimum height =30pt ,draw=orange] (3) at(2,-1){$a_3^{(2)}$};
\node[circle,
minimum width =30pt ,
minimum height =30pt ,draw=orange] (4) at(2,1){$a_2^{(2)}$};
\node[circle,
minimum width =30pt ,
minimum height =30pt ,draw=orange] (5) at(2,3){$a_1^{(2)}$};
\node[circle,
minimum width =30pt ,
minimum height =30pt ,draw=orange] (6) at(4,-1){$a_3^{(3)}$};
\node[circle,
minimum width =30pt ,
minimum height =30pt ,draw=orange] (7) at(4,1){$a_2^{(3)}$};
\node[circle,
minimum width =30pt ,
minimum height =30pt ,draw=orange] (8) at(4,3){$a_1^{(3)}$};
\node[circle,
minimum width =30pt ,
minimum height =30pt ,draw=purple] (9) at(6,2){$a_1^{(4)}$};
\node[circle,
minimum width =30pt ,
minimum height =30pt ,draw=purple] (10) at(6,0){$a_2^{(4)}$};
\draw[->] (1) --(3);
\draw[->] (1) --(4);
\draw[->] (1) --(5);
\draw[->] (2) --(3);
\draw[->] (2) --(4);
\draw[->] (2) --(5);
\draw[->] (3) --(6);
\draw[->] (3) --(7);
\draw[->] (3) --(8);
\draw[->] (4) --(6);
\draw[->] (4) --(7);
\draw[->] (4) --(8);
\draw[->] (5) --(6);
\draw[->] (5) --(7);
\draw[->] (5) --(8);
\draw[->] (6) --(9);
\draw[->] (6) --(10);
\draw[->] (7) --(9);
\draw[->] (7) --(10);
\draw[->] (8) --(9);
\draw[->] (8) --(10);
\end{tikzpicture}图片29:神经网络。
怎么样,这个神经网络颜值高吧?那必须的高啊,而且还很好画哦。
函数图像绘制
tikz宏包还可以帮助绘制函数图像,比如:
\begin{tikzpicture}
\draw[->] (-0.2,0) --(6,0) node[right] {$x$};
\draw[->] (0,-0.2) --(0,6) node[above] {$f(x)$};
\draw[domain =0:4] plot (\x ,{0.1* exp(\x)}) node[right] {$f(x)=\frac{1}{10}e^x$};
\end{tikzpicture}图片30:绘制函数f(x)=\frac{1}{10}e^x的图像。
其中domain 设置了我们想要绘制的范围,起始点和终止点之间用 :隔开。plot 是绘制操作,node后面[]中填写我们文本的位置。
不过想要绘制函数图像的话我推荐一个一定会让你感觉很惊艳的网站(这是另外一个宏包了,叫做pgfplots),如果你想画各种函数图像、曲面、三维矢量场、统计图等等,那你看完这个网站以后一定爽死了:
甚至还能画飞机哦!!!图片31:飞机。
参考:
雷太赫排版系统简介第二版 v2.03——包太雷