学忠

V1

2022/05/13阅读:51主题:红绯

Tikz作图教程:如何画流程图?——从一个简单的例子谈起

今天我们来谈谈如何画流程图。广义的流程图是指流经一个系统的信息流、观点流或部件流的图形代表。

流程图主要由两种元素构成:文本框和连接线段(通常带有箭头)。Tikz画这两类元素的工具是node--线段工具。其中,文本框工具node在上一篇推文Tikz作图教程:两个漂亮的示意图,兼谈 Tikz 中的文本框——node 的高级用法中有详细的介绍。

下面我们一个简单的例子来说明如何画流程图,掌握里面的思想以后就可以画出各种更加复杂的图形。

如图1,这里文本框的大小、形状有类似的风格,但是框线颜色和填充颜色不同。箭头有相同的颜色和形状。

我们可以先定义两种style(风格)——文本框(rec)和箭头(arrow)。所谓style是指一组设置图形元素外观,如形状、大小、线条颜色、填充颜色、文字字体、文字对齐方式等等的选项构成的集合。

然后,设置每个文本框(node)的各选项,主要包括引用名称、位置、文本内容。

最后一步是连线。

一、导言区设置

使用standalone文类。调入tikz宏包和calc,positioning库文件(用于作图、计算坐标和自动放置文本框位置),调入ctex添加中文。

\documentclass[margin=10pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{calc,positioning}
\usepackage{ctex}

二、搭建作图环境

\begin{document}
\begin{tikzpicture}[]

\end{tikzpicture}
\end{document}

三、定义文本框和箭头风格

文本框风格(rec/.style

  • node distance=3.5cm:文本框之间的距离;
  • rectangle,thick: 形状为长方形,线条为粗线;
  • minimum width=1.5cm,minimum height=0.5cm: 文本框宽为1.5cm,高为0.5cm
  • text centered:文本内容居中;
  • draw=#1,fill=#1!15:文本框颜色为#1,填充颜色为15%的#1。这里#1是参数,由绘图者自己设定颜色。

箭头风格(arrow/.style):

  • >=stealth,very thick: 箭头风格为stealth(像某种隐形战斗机的外形),线条为粗线;
  • red!80!black: 箭头的颜色为80%的红色和20%的黑色混合后的颜色。
\begin{tikzpicture}[node distance=3.5cm,
rec/.style={rectangle, thick,minimum width=1.5cm,minimum height=0.5cm,text centered,draw=#1,fill=#1!15},
arrow/.style={ ->,>=stealth,very thick,red!80!black},
]

设置文本框的各选项

\node(<name>)[<style and position>]{<text>};

  • 小括号内为文本框的引用名称;
  • 中括号内为文本框风格,位置;
  • 大括号内为文本框里面的文字内容。
\node(rec1) [rec=blue]  {现实问题};
\node(rec2) [rec=purple,right of = rec1] {数学模型};
\node(rec3) [rec=green,right of = rec2] {数学结论};
\node(rec4) [rec=orange,right of = rec3]{解释 \& 预测};

五、连线

连线的基本命令为\draw[<style>](<name1>)--(<name2>);

  • <style>这里为已经定义好的arrow风格。
  • <name1>,<name2>node中小括号里面设置的引用名称。
  • node[above]{建模}:为箭头上方添加文字说明;
  • (rec4.south)为第四个文本框正下方锚点的坐标;
  • ($(rec4.south)+(0,-1)$):计算两个坐标之和,这里的效果相当于把(rec4.south)向下平移一个单位。
  • 文本框的八个锚点如下图:
\draw[arrow] (rec1)  --node[above]{建模}    (rec2);
\draw[arrow] (rec2)  --node[above]{求解}    (rec3);
\draw[arrow] (rec3)  --node[above]{解释}    (rec4);
\draw[arrow] (rec4.south)--($(rec4.south)+(0,-1)$) --node[above]{检验}  ($(rec1.south)+(0,-1cm)$) -- (rec1.south);

完整代码:

\documentclass[margin=20pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{calc,positioning}
\usepackage{ctex}

\begin{document}

\begin{tikzpicture}[node distance=1.5cm,
  rec/.style={thick,rectangle, minimum width=1.5cm,minimum height=0.5cm,text centered,draw=#1,fill=#1!15},
  arrow/.style={very thick, ->,>=stealth,red!80!black},
]
      \node(rec1)     [rec=blue]                                   {现实问题};
      \node(rec2)     [rec=purple,right = of rec1]         {数学模型};
      \node(rec3)     [rec=green,right = of rec2]          {数学结论};
      \node(rec4)     [rec=orange,right = of rec3]        {解释 \& 预测};

      \draw[arrow]   (rec1)  --node[above]{建模}    (rec2);
      \draw[arrow]   (rec2)  --node[above]{求解}    (rec3);
      \draw[arrow]   (rec3)  --node[above]{解释}    (rec4);
      \draw[arrow]   (rec4.south)--($(rec4.south)+(0,-1)$)
                                          --node[above]{检验}  ($(rec1.south)+(0,-1cm)$)
                                          -- (rec1.south);
\end{tikzpicture}

\end{document}

分类:

数学

标签:

数学编程

作者介绍

学忠
V1

大学数学老师