一篇文章应该简洁又准确,有些信息仅使用文字是不能同时满足此二者也,因此需要学会制图来传达信息。
我的习惯:
一些展示结果、数据类的绘图(云图、直方图等等)优先用 Python;
流程图、示意图等用 draw.io;
若文章用的是 latex,且图形非常结构化,可以用 latex 的 tikz 绘制流程图。
流程图和示意图
流程图五种基本图形
起止——椭圆/圆角矩形;
处理——矩形;
判断——菱形;
输出输入——梯形;
连接——箭头
PPT
省略……
Draw.io
这是一款免费开源的可以在浏览器直接使用的流程图绘制工具。但实际上,它绝不仅限于绘制流程图,也适合绘制示意图等。它默认提供了很多模板。
官网: draw.io (drawio.com)
在线: https://app.diagrams.net/
Draw.io 没有账户体系,如果使用网页版,文件需要保存在本地,也可以存在网盘,但基本都是国外的。Obsidian 中有 Draw.io 插件,可以进行展示和修改。
Visio
Visio是一款功能强大的流程图软件,由微软公司推出,主要用于绘制各种流程图、结构图、网络拓扑图、组织结构图等等,被广泛的应用在项目管理和工程设计领域。它具有以下特点:
- 功能强大:Visio 提供了丰富的绘图工具和图形库,支持各种图形元素的绘制和修改,包括线条、箭头、形状、图标等等。
- 兼容性好:Visio 可以导入和导出多种文件格式,包括 PDF、SVG、AutoCAD 等等,使得多种文件的共享和转换变得更加方便。
- 易于学习:Visio 的界面清晰简洁,操作流程清晰,易于学习和使用。
- 适用范围广:Visio 可以应用于各种领域,如流程管理、软件开发、网络架构等等。
在价格方面
Visio 提供了 2 种方案——订阅计划和一次性购买,每个方案还细分出 2 种计划:
订阅计划:Visio 网页版 36 元/月,Visio 网页版 + 桌面客户端 109 元/月
一次性购买(买断):Visio 标准版 2898 元,Visio 专业版 5808 元
数据图
这个网站展示了数据各种图形化的例子,给出详细的解释和示例。
Data Viz Project | Collection of data visualizations to get inspired and find the right type
Python
直接问 ChatGPT 。
常用的库有 Matplotlib ,从2D到3D、从标量到矢量, 图片能够保存成eps、pdf、svg、png和jpg等多种格式。
R
R语言则是做数据统计分析最强大的工具了,在数据挖掘、数据分析等领域具有非常广泛的应用。
ggplot2 是R语言的一个包,最擅长统计数据可视化。ggplot2 按图层作图,其核心理念是将绘图与数据分离。缺点是 ggplot2 功能没有 Python 或者 Matlab 全面,不过人家就是在统计方面做的最好最专业。
Mathematica/Matlab
这两款软件是不用多去介绍的,理工科的人再熟悉不过了,都是一个公司的。
其功能的强大在于编程代码简单,默认出图漂亮,自定义性好,支持常见各种类型的画图,能导出丰富的格式,动态交互很强大,方便简单上手。
Origin
简单易学、操作灵活、功能丰富全面的画图软件,既可以满足一般用户的制图需要,也可以满足高级用户数据分析、函数拟合的需要。
目前,它似乎已成为专业论文SCI的标配绘图软件。缺点是操作系统不太友好、易崩溃,只支持Windows系统。
Latex
Tikz 是 LaTex 原生支持的图包,可以画论文中的插图。二维图、三维图、流程图、示意图都能实现。缺点就是难度较高,入门需花时间。
其实绘图流程应该是在纸上或其他软件先大概画出来,然后描述让gpt4画
LaTeX—Tikz 宏包入门使用教程 – 知乎 (zhihu.com)
如何在LaTeX中使用TikZ绘图的简明教程 – An Amateur Computational Mathematician (scaomath.github.io)
基本流程
需要确保你的TeX系统已安装了pgf
和tikz
宏包。
-
在文档的导言区载入宏包:
在LaTeX文档的导言区,使用\usepackage{tikz}
命令来载入宏包。
如果需要使用特定库,请在\usetikzlibrary{}
中指定,例如:\usetikzlibrary{shapes,arrows,positioning}
。 -
开始和结束TikZ环境:
在需要插入图形的地方,使用\begin{tikzpicture}
开始一个TikZ环境,并使用\end{tikzpicture}
结束该环境。 -
根据需求绘制图形元素:
在TikZ环境中,可以使用各种命令绘制节点、线条、形状等。例如,\node
用于添加节点,\draw
用于绘制线条等。 -
设置样式:
为了使图形更美观,可以使用\tikzset{}
或者在TikZ环境中使用style
选项设置样式。例如,\tikzset{mystyle/.style={rectangle,rounded corners,draw=black,minimum width=2cm,minimum height=1cm,inner sep=5pt,align=center}}
定义了一个名为mystyle的样式,可用于节点等。
Latex绘制的曲线图:
Latex绘制的结构图:
借助 GPT4
为了让GPT4更好地理解想要绘制的流程图,可以按照以下几个方面提供详细信息:
-
流程图中的节点:
- 节点的数量和描述(例如,“开始”、“步骤1”等)。
- 节点的形状(例如,矩形、圆形、椭圆等)。
- 节点的样式(例如,边框、颜色、文字大小等)。
-
流程图中的连接线:
- 连接线的类型(例如,直线、曲线、双箭头等)。
- 连接线的样式(例如,颜色、粗细、箭头形状等)。
- 节点之间的连接关系(例如,“开始”连接到“步骤1”等)。
-
节点之间的相对位置:
- 节点之间的水平和垂直距离。
- 节点之间的对齐方式(例如,居中对齐、左对齐等)。
-
其他元素和样式:
- 是否需要背景颜色、边框等其他元素。
- 是否需要标注、文字说明等。
我想要用Latex的Tikz绘制一个UWB定位系统中标签的程序流程图。已有的LaTeX代码如下
\documentclass[type=bachelor]{bithesis}
\usepackage{listings}
\usepackage[
backend=biber,
style=gb7714-2015,
gbalign=gb7714-2015,
gbnamefmt=lowercase,
gbpub=false,
doi=false,
url=false,
eprint=false,
isbn=false,
]{biblatex}
% 参考文献引用文件位于 misc/ref.bib
\addbibresource{misc/ref.bib}
% 文档开始
\begin{document}
\end{document}
提交的latex代码中省略上面已有的代码。
会用到的节点形状有:起止——圆角矩形;判断——菱形;处理——矩形;输出输入——梯形;连接线用单箭头的。
以下是节点信息,左边是节点类型,右边是节点描述:
开始--上电;
步骤1--初始化一系列资源;
步骤2--广播通信帧;
判断1--收到锚点的答复信息? NO 就连接到步骤1与步骤2之间的连接线上, YES就继续向下
步骤3--与锚点测距得到飞行时间,存锚点信息到MyLink和AnchorData;
步骤4--计算与锚点之间的距离,存入AnchorData,更新屏幕;
步骤5--计算本次测距与前两次测距平均值,存入MyLink;
判断2--距离上次发送数据超过 updateInterval 时间? NO 就连接到步骤1与步骤2之间的连接线上, YES就继续向下
步骤6--转化MyLink为JSON格式;
步骤7--发送JSON数据到服务端,记录时间戳;
步骤7的连接线连接到步骤1与步骤2之间的连接线上
请提交相应的latex代码
流程图(一条线往下的)模板
% 绘制流程图
\usepackage{tikz}
\usetikzlibrary{arrows.meta,
chains,
positioning,
shapes.geometric}
如图\ref{fig:tagflowchart}
\begin{figure}[htbp]
\centering
\begin{tikzpicture}[
node distance = 6mm and 6mm,
start chain = going below,
arr/.style = {-Stealth, thick},
base/.style = {draw, minimum width=3cm, align=center, on chain},
startstop/.style = {base, rectangle, rounded corners},
io/.style = {base, trapezium, trapezium left angle=70,
trapezium right angle=110, fill=blue!30},
process/.style = {base, rectangle, fill=orange!30},
decision/.style = {base, diamond, fill=green!30,
minimum height=1cm, minimum width=2cm, aspect=2},
]
\node (start) [startstop] {上电}; % start
\node (step1) [process] {初始化一系列资源}; % step 1
\node (step2) [process] {广播通信帧}; % step 2
\node (dec1) [decision] {收到锚点的答复信息?}; % decision 1
\node (step3) [process] {与锚点测距得到飞行时间,\\存锚点信息到MyLink和AnchorData}; % step 3
\node (step4) [process] {计算与锚点之间的距离,\\存入AnchorData,更新屏幕}; % step 4
\node (step5) [process] {计算本次测距与前两次测距平均值,\\存入MyLink}; % step 5
\node (dec2) [decision] {距离上次发送数据超过 \\ updateInterval 时间?}; % decision 2
\node (step6) [process] {转化MyLink为JSON格式}; % step 6
\node (step7) [io] {发送JSON数据到服务端}; % step 7
\node (step8) [process] {记录时间戳}; % step 8
\draw[arr] (start) -- (step1);
\draw[arr] (step1) -- (step2);
\draw[arr] (step2) -- (dec1);
\draw[arr] (dec1) -- node[midway,right] {YES} (step3);
\draw[arr] (dec1.west) -- ++(-1,0) node[pos=1,left] {NO} |- (step2);
\draw[arr] (step3) -- (step4);
\draw[arr] (step4) -- (step5);
\draw[arr] (step5) -- (dec2);
\draw[arr] (dec2) -- node[midway,right] {YES} (step6);
\draw[arr] (dec2.west) -- ++(-2,0) node[pos=1,left] {NO} |- (step2);
\draw[arr] (step6) -- (step7);
\draw[arr] (step7) -- (step8);
\draw[arr] (step8.east) -- ++(3,0) |- (step2);
\end{tikzpicture}
\caption{标签程序流程图} % 插入标题
\label{fig:tagflowchart} % 插入标签,用于引用
\end{figure}