4

LaTeX 绘制美丽的图案-Tikz 使用

 2 years ago
source link: https://mathpretty.com/14737.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

LaTeX 绘制美丽的图案-Tikz 使用

王 茂南 2022年6月6日07:37:04评论6123字阅读20分24秒

本文我们会聚焦在 LaTeX 中的一个 package,即 Tikz

Tikz 基础知识(一个 20 min 的视频,可以快速上手),How to make beautiful math graphics using Tikz & LaTeX

利用 Tikz 绘制神经网络,Drawing Neural Networks in TikZ: Short Guide

Tikz 绘制基础形状

导入 package

在开始使用 Tikz 之前,我们首先导入对应的 package。这里我们还导入关于数学公式相关的 package,通常我们会在图中包含公式:

  1. \usepackage{tikz}
  2. \usetikzlibrary{matrix, positioning, fit}
  3. % 数学公式
  4. \usepackage{amsmath}
  5. \usepackage{amsfonts}

首先我们看一下如何绘制折线。下面分别绘制三种折线,分别是,普通折线带有箭头的折线带有箭头+虚线的折线

  1. \begin{tikzpicture}
  2.     \draw (0,0) -- (2,1) -- (3,2);
  3.     \draw[->] (0,-1) -- (2,0) -- (3,1); % 带箭头
  4.     \draw[->, dashed] (0,-2) -- (2,-1) -- (3,0); % 带箭头+虚线
  5. \end{tikzpicture}

我们看一下上面的例子,可以看到:

  • 绘制的内容在 tikzpicture 中;
  • 通过指定坐标进行绘制,这里坐标是在这个这个图像内相对和,图像之间相互不影响;
  • 使用 draw 作为关键词,draw 后面可以加上不同的样式,例如虚线。折线使用 -- 连接坐标即可;

于是上面的代码最终绘制的结果如下所示:

LaTeX 绘制美丽的图案-Tikz 使用

绘制圆与椭圆

接下来我们查看绘制圆的例子。还是使用 draw 作为关键词。与上面折线相比,将 -- 换为关键词 circle 或是 ellipse 即可。后面分别加上圆的半径即可。

同样我们可以在 draw 中设置不同的颜色,且圆的半径可以使用不同的单位。

  1. \begin{tikzpicture}
  2.     \draw[blue] (0,0) circle (1);
  3.     \draw[red] (2,0) circle (1.5in);
  4.     \draw[green] (5,0) ellipse (10pt and 20pt);
  5. \end{tikzpicture}

运行上面的代码,最终的结果如下所示:

LaTeX 绘制美丽的图案-Tikz 使用

绘制长方形

我们将 circle 换为 rectangle 即可进行矩形的绘制。例如在下面的例子中分别绘制了三个矩阵。这里我们定义矩阵的「左下角点」+「右上角点」:

  1. \begin{tikzpicture}
  2.     \draw[red] (0,0) rectangle (1,1);
  3.     \draw[blue] (1,1) rectangle (2,2);
  4.     \draw[green] (1,1) rectangle (0,2);
  5. \end{tikzpicture}

最终绘制的结果如下图所示(可以通过矩形的颜色与上面代码对应上):

LaTeX 绘制美丽的图案-Tikz 使用

绘制 Grid

我们将 rectangle 换为 grid 即可绘制网格。例如下面的例子中,我们分别绘制一个 54 的网格和一个 22 的网格:

  1. \begin{tikzpicture}
  2.     \draw[blue] (0,0) grid (5,4);
  3.     \draw[red] (0,0) grid (-2,-2);
  4. \end{tikzpicture}

最终的结果如下图所示:

LaTeX 绘制美丽的图案-Tikz 使用

Tikz 样式设置

修改图像整体大小

有的时候我们需要整体修改图像的大小,这个时候时候可以使用 transform canvas={scale=4.0}scale 后面是缩放的倍数。下面是完整的代码,我们将要绘制的图像放在 center 中使其保持居中:

  1. \begin{center}
  2.     \begin{tikzpicture}[transform canvas={scale=4.0}] % transform 粗细也一起变化
  3.     \draw[blue] (0,1) arc (90:-90:0.5cm and 1cm); % 蓝色的线
  4.     \draw[dashed, red] (0,1) arc (90:270:0.5cm and 1cm); % 红色虚线
  5.     \draw (0,0) circle (1cm); % 黑色圆
  6.     \filldraw[red] (0,1) circle  (0.05); % 带有填充, 上下红点
  7.     \filldraw[red] (0,-1) circle (0.05);
  8.     \shade[ball color=blue!10!white,opacity=0.20] (0,0) circle (1cm); % 与 fill 不同, shade 可以有阴影
  9.     \end{tikzpicture}
  10. \end{center}

我们分别调整为 scale=1scale=4,最终的结果如下图所示,可以看到一大一小两个球体:

LaTeX 绘制美丽的图案-Tikz 使用

自定义样式

我们也可以提前自定义好一些样式,从而方便使用。下面的例子中,我们定义了两种样式,包含不同的边框颜色和不同的填充颜色。这里 red!60 中的 60 表示 redwhite 的比例,60%red40%white。也就是数字越小,颜色越淡。

接着利用好定义的两个样式首先绘制两个 node,接着将这两个 node 连接起来。简单说明一下 nodeline 的语句:

  • \node[样式ID] (node ID) [方位] {文字内容};
    • 关于方位包含,[left, right, above, below]
    • 可以指定距离,[left=0.01 of NodeID],也可以不指定距离,[left=of NodeID]
  • \draw[样式] (node ID.位置) to node[auto] {文字内容} (node ID.位置);
  1. \begin{tikzpicture}[
  2.     node1/.style={rectangle, draw=red!60, fill=red!5, very thick, minimum size=40},
  3.     node2/.style={rectangle, draw=blue!60, fill=blue!5, very thick, minimum size=40},
  4.     %Nodes
  5.     \node[node1] (nodeID1) {$x_{1}$};
  6.     \node[node2] (nodeID2) [below=of nodeID1] {$y_{1}$};
  7.     % Line
  8.     \draw[->, very thick] (nodeID1.south)  to node[auto] {$x \rightarrow y$} (nodeID2.north);
  9. \end{tikzpicture}

最终的结果如下图所示,两个 node 的填充颜色和边框颜色不同:

LaTeX 绘制美丽的图案-Tikz 使用

Tikz 结合 Node 添加说明

我觉得,Tikz 厉害的地方在于可以结合 node 在图片的任意位置添加任意注释说明等(这里的说明可以是任意的格式,文字,图片,甚至是一个 tikz picture)。

在指定位置写入文字

首先我们来看一个基本的用法,可以将 node 放在指定坐标,然后添加文字。下面的例子中,我们首先绘制一个圆,接着在圆心的位置写下文字

  1. \begin{tikzpicture}
  2.     \draw (0,0) circle (3); % 绘制圆
  3.     \draw node at (0,0) {$(x_{0},y_{0})=(0,0)$}; % 圆心位置写入内容
  4. \end{tikzpicture}

最终的效果如下图所示:

LaTeX 绘制美丽的图案-Tikz 使用

利用多个 Node 写入文字

在上面的例子中,我们利用一个 node 从而在一处添加了文字。这个方式很容易进行扩展,可以在多处进行文字的添加。例如下面的例子中,我们绘制出不同粗细的线条,接着每个线条的后方添加文字:

  1. \begin{tikzpicture}
  2.     % 绘制折线
  3.     \draw[ultra thick] (0,3) -- (2,3);
  4.     \draw[very thick] (0,2.5) -- (2,2.5);
  5.     \draw[thick] (0,2) -- (2,2);
  6.     \draw[thin] (0,1.5) -- (2,1.5);
  7.     \draw[very thin] (0,1) -- (2,1);
  8.     \draw[ultra thin] (0,.5) -- (2,.5);
  9.     % 使用 node, 在指定位置显示文字
  10.     \draw node at (3, 3) {Ultra Thick};
  11.     \draw node at (3, 2.5) {Very Thick};
  12.     \draw node at (3, 2) {Thick};
  13.     \draw node at (3, 1.5) {Thin};
  14.     \draw node at (3, 1) {Very Thin };
  15.     \draw node at (3, 0.5) {Ultra Thin};
  16. \end{tikzpicture}

最终的效果如下图所示,每个线条后方都有对应的文字:

LaTeX 绘制美丽的图案-Tikz 使用

调整 Node 文字位置

在这个例子中,我们通过 anchor=west 等其他方位将 node 的文字固定在不同的位置。我们分别在四个坐标绘制四个圆,接着在不同的位置借助 node 加入文字描述:

  1. \begin{tikzpicture}
  2.     \filldraw[red] (1,0) circle (0.1cm) node[anchor=west]{Anchor West};
  3.     \filldraw[red] (-1,0) circle (0.1cm) node[anchor=east]{Anchor East};
  4.     \filldraw[red] (0,1) circle (0.1cm) node[anchor=south]{Anchor South};
  5.     \filldraw[red] (0,-1) circle (0.1cm) node[anchor=north]{Anchor North};
  6. \end{tikzpicture}

最终的效果如下所示,可以看到文字出现在圆的不同位置:

LaTeX 绘制美丽的图案-Tikz 使用

利用 Node 插入图片

除了插入文字信息之外,我们还可以插入图片。例如下面的例子,我们在圆心的位置插入图片:

  1. \begin{tikzpicture}
  2.     \node[inner sep=0pt] (Naruto) at (0,0)
  3.         {\includegraphics[width=.25\textwidth]{./images/test.png}};
  4.     \draw (0,0) circle (3);
  5. \end{tikzpicture}

最终的效果如下所示,可以看到圆心出会有图片:

LaTeX 绘制美丽的图案-Tikz 使用

参考资料How can I embed an external image within a tikzpicture environment?

Tikz 绘制矩阵

Tikz 综合使用

使用曲线连接 node

在这个例子中,我们会介绍如何使用「曲线」来连接两个 node。在下面的代码中,首先:

  • 定义了两种 style,一种是 node 的样式,另外一种为字体;
  • 接着定义了三个 node。其实node 可以是任意的形状,图片,甚至是 tikz的图像;
  • 最后将 node 连接起来即可。这里我们尝试使用曲线进行连接:
    • Control 点\draw[->, very thick] (Recovered.east) .. controls +(right:7mm) and +(right:7mm) .. (Susceptible.east);
    • 角度\draw[bend left=70, ->, very thick] (Recovered.west) to node[legend,auto] {Link} (Susceptible.west);
  1. \begin{tikzpicture}[
  2.     SIR/.style={rectangle, draw=red!60, fill=red!5, very thick, minimum size=5mm},
  3.     legend/.style={font=\large\bfseries},
  4.     ] % 定义 style, red!5 表示 5% red
  5.     % Nodes
  6.     \node[SIR] (Susceptible) {Susceptible $S(t)$};
  7.     \node[SIR] (Infectious) [below=of Susceptible] {Infectious $I(t)$};
  8.     \node[SIR] (Recovered) [below=of Infectious] {Recovered $R(t)$};
  9.     % Lines
  10.     \draw[->, very thick] (Susceptible.south)  to node[right] {$a$} (Infectious.north); % node 可以添加字符 () to () 是最简单的写法
  11.     \draw[->, very thick] (Infectious.south)  to node[right] {$b$} (Recovered.north);
  12.     \draw[->, very thick] (Recovered.east) .. controls  +(right:7mm) and +(right:7mm)   .. (Susceptible.east); % control 点
  13.     \draw[bend left, ->, very thick] (Recovered.west) to (Susceptible.west);
  14.     \draw[bend left=10, ->, very thick] (Recovered.west) to (Susceptible.west);
  15.     \draw[bend left=30, ->, very thick] (Recovered.west) to (Susceptible.west);
  16.     \draw[bend left=50, ->, very thick] (Recovered.west) to (Susceptible.west);
  17.     \draw[bend left=70, ->, very thick] (Recovered.west) to node[legend,auto] {Link} (Susceptible.west);
  18. \end{tikzpicture}

编译上面的代码,最终获得如下的效果图:

LaTeX 绘制美丽的图案-Tikz 使用
  • 微信公众号
  • 关注微信公众号
  • weinxin
  • QQ群
  • 我们的QQ群号
  • weinxin

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK