如何在论文中画出漂亮的插图? 您所在的位置:网站首页 漂亮的权杖怎么画 如何在论文中画出漂亮的插图?

如何在论文中画出漂亮的插图?

2023-08-15 01:13| 来源: 网络整理| 查看: 265

开头放颗爱心吧,图片是我自己用 LaTex 编译得到的,代码来自Can we make a love heart with LaTeX?

再放一个今天刚看到的多米诺的图,觉得超赞,代码来自Falling dominoes。

以上just for fun。

我 认为,在如何在论文里画图的问题下面,没有人重视 LaTex 是一件不合理的事情。LaTex 在学术界的流行程度之广是不容置疑的,你敢说你投论文从来没用过 LaTex?期刊没有要求过你提交 Tex 源码?那么使用 LaTex 原生支持的图包来画论文中的插图是一件很自然的事情,况且,它的绘图工具库 (pgfplots) 也没有很难学。另外,从TeX - LaTeX Stack Exchange上的问答内容的丰富程度来看,在世界范围内,LaTex 还是很流行的。

这个答案不打算很详细地教你如何入门,但我会给一些很简单很基础的例子来告诉你怎么用 LaTex 的代码画出基本的图形来。至于更复杂的例子,就看你自己啦,网上的 LaTex 资源是非常丰富的。对于我来说,只要有 TeX - LaTeX Stack Exchange 和 TikZ and PGF 就足够回答我几乎所有的 LaTex 日常编码及 pgfplots 的问题了(你么有看错,不用 google 也行,反正你 google 到的大多也是 TeX - LaTeX Stack Exchange 的问答页面)。

下 面我会先说一下代码量的问题,因为在很多人提到 LaTex 的绘图代码量大。接着,我会说一下代码可读性的问题,我认为 LaTex 的 pgfplots 的绘图代码的可读性优于 python 的 matplotlib,我会举一个简单的例子来说明。如果你把这个例子看完,事实上也已经掌握了用 Latex 来绘制简单的函数图形的方法。然后,由于很多人肯定会关心如何根据已有的数据来绘制图形的问题,比如绘制某段时间的温度变化曲线之类,所以,我会再介绍一 下用 LaTex 读取数据文件并绘制成曲线图的方法。我相信你读完这些内容之后会发现,其实用 LaTex 画图,上手也很容易,没有编程基础的话也没有很大难度。你会发现 LaTex 的 pgfplots 包中有很多设定都是对初学者很温馨的。最后,我会给出更多的效果图。

当然当然,我这里说的肯定是片面的,因为我在努力地夸 LaTex。事实当然是它也有很多缺点,但因为大多数人都对它有偏见,所以我想多夸夸它会更有意义些。

1. 代码量

很 多人似乎觉得 LaTex 的画图代码量很大,是的,我这里贴的一些图的代码量确实很大,但是,你要和其它画图方式相比较的话,总得找一样的例子吧,下面我给一个很简单的例子来比较 一下用 LaTex 的 pgfplots 画图和用 python 的 matplotlib 来画图的代码。

首先是 matplotlib 的。

import numpy as np import matplotlib.pyplot as plt x = np.linspace(0, 10) line, = plt.plot(x, np.sin(x), '--', linewidth=2) dashes = [10, 5, 100, 5] # 10 points on, 5 off, 100 on, 5 off line.set_dashes(dashes) plt.show() 接着是 pgfplots 的。 \documentclass{article} \usepackage{pgfplots} \begin{document} \begin{tikzpicture} \begin{axis} \addplot [dash pattern=on 10 off 5 on 100 off 5, domain=0:10, samples=100, very thick, blue] {sin(deg(x))}; \end{axis} \end{tikzpicture} \end{document} 看,代码量没什么太大差距吧。

2. 代码可读性

其实,除 了代码量以外还有一个很重要的问题需要考虑,就是学习曲线。是的,在这个 LaTex 的学习曲线很陡峭已经几乎被公认的年代里,我居然会说我们可以来比一下学习曲线。LaTex 的这个 pgfplots 真的很难学吗?下面我们来看一下上面给的这两段代码吧,我想说的其实是,LaTex 的这段画图代码对于初学者来说,可读性会比 python 更好,因为你不用看文档就能够大致猜到 LaTex 代码的含义。

我们一行一行地看看绘图有关的代码。

先来看看 LaTex 的。

\begin{tikzpicture} 虽然 tikz 不知道是什么意思,但是 begin 和 picture 我知道,所以我猜这是要开始画图了。

\begin{axis}

axis 的意思是坐标轴,恩,我猜这是要画坐标轴。

\addplot [dash pattern=on 10pt off 5pt on 100pt off 5pt, domain=0:10, samples=100, very thick] {sin(deg(x))};

plot,这个词我在韦伯词典里查到它的意思是:3 a: to locate (a point) by means of coordinates b: to locate (a curve) by plotted points c: to represent (an equation) by means of a curve so constructed。所以理解应该没难度吧。

dash pattern,明显是要指定虚线样式的节奏,后面跟了个 on 10pt off 5pt on 100pt off 5pt,on和 off 是什么?好像虚线就是画一段空一段嘛,所以大概这个 on 就表示画一段的意思,off 就表示空一段的意思,那么后面的数字应该就是这一段的长度了。

domain=0:10,这似乎表示某个域的大小,一般来说,如果我们要画的是一条由某个函数表示的曲线的话,很可能需要关心的域是x的域。

samples=100,任何一条曲线在画的时候,实际上都是需要采样 (sample) 的,那么这里的意思很可能就应该是采样点数量的意思。

very thick,很粗?是的,这就是表示粗细,是什么东西的粗细呢?你画曲线的时候最关心的是什么东西的粗细?我相信是曲线本身吧。而且,回过去看看这一行开头写的是 \addplot,所以应该也能猜到这里需要描述的对象是曲线。

blue,很显然,就是画成蓝色的意思。

最后再看 sin(deg(x)),sin 大家都知道是什么意思,deg 似乎要想一下,恩...degree 大家都很常用吧,所以这里的意思似乎就是把x转换成角度的意思,所以,这个图的横坐标应该表示的是弧度。

然后是两个 \end,意思应该也很容易猜到。

现在我们来看 python 的代码,请注意,假设你是一个不会写代码的人。

x = np.linspace(0, 10) 我知道 x 可能是曲线方程的自变量,但是 np 是个啥?下面加个点是什么意思?linspace 可能是 line space 的意思,但是 line space 是什么意思?大概是线的绘制空间吧。你觉得 pgfplots 里用的关键字 domain 和这里的 linspace ,哪个更容易被理解成 x 的取值范围?

line, = plt.plot(x, np.sin(x), '--', linewidth=2) 我们不说 line 后面那个逗号和等号。plt.plot,似乎就是要画个什么曲线图的意思(主要是 plot 可以看懂)。后面的 x ,我大概能理解,因为上面说 x 等于某个 linspace,所以这里大概也是值linspace。np.sin(x),不管 np 是什么意思吧,sin(x) 还是能理解的。然后,你说 '--' 是什么意思?linewidth=2,这个很好理解,应该是线的宽度。不过我不知道2到底是有多宽,比方说它和坐标轴的粗细比,哪个宽?很多时候我们需要 画出来看看才行。LaTex 里用的是 very thick 这样的词,所以我们会猜到它是比一般的线要粗很多的。

dashes = [10, 5, 100, 5] # 10 points on, 5 off, 100 on, 5 off dashes 是虚线的意思。但是后面中括号里的东西就比较难理解了,如果没有#后面的注释的话。再者,你看#后面的这段注释,是不是感觉和 LaTex 里的代码很像?所以哪段代码更容易理解应该很显然了吧。而且,如果不看这段注释,你知道第一个 10 表示的 on 还是 off 吗?

3. 数据文件

有很多人提到数据管理的问题。如果我没理解错,那么关键的问题就是如何利用存储在文件中的数据来画图。这一点,LaTex 完全可以做到。

用 LaTex 最方便地可以读取的数据格式是纯文本数据,比如你有一个二维点的数组,你可以存成这样:

1 -1.52 3.43 2.24 0.95 0.46 4.17 7.08 4.89 2.9

我现在有一个365天的气温数据文件 temperaturesOslo.txt (这个文件来自Temperature and rain sparklines),其中的365个数据是按照上面的格式存储的,读取这个文件并绘制出来的代码很简单:

\documentclass{article} \usepackage{tikz} \usepackage{pgfplots} \begin{document} \begin{tikzpicture} \begin{axis} \addplot [mark = none, blue] table {temperaturesOslo.txt}; \end{axis} \end{tikzpicture} \end{document} 这段代码中,除了那些和环境设定相关的代码,关键的绘制代码就只有一行 \addplot [mark = none, blue] table {temperaturesOslo.txt}; 绘制的结果是数据文件中,数据的分隔符并不一定要用空格,可以自定义,使用逗号什么的也没问题,当默认读取失败时,可以在代码中注明你实际使用的分隔符。

有 人也提到和 MATLAB 的数据互通问题,MATLAB 保存的 .mat 文件 LaTex 读取起来不是很方便(应该有一些 LaTex 的库可以做到),主要是因为 .mat 文件是个二进制文件。但有一个变通的更简单的办法,因为 MATLAB 也可以很容易地把数据保存成纯文本的格式。

假设我有一个 MATLAB 矩阵 mymatrix,将其保存成纯文本格式的代码是

save('myfile.txt', 'mymatrix', '-ascii','-double'); 得到的 myfile.txt 中的数据的格式就和我上面给出的数据格式相同。

4. 更多效果图

受不鸟了,居然几乎木有 LaTex 的图,我来贴。下面所有的图都来自TeXample.net,每张图下面都有源码所在的页面地址。

首先是和问题中给的图比较接近的点阵图Drawing lattice points and vectors

经典的函数曲线,不管是离散点还是直接用functionPgfplots | TikZ exampleAnimated definite integral

三维的Spherical and cartesian gridsMembrane-like surface

网络结构也没问题Scientific interactions

经典物理力学Free body diagrams

化学的RNA codons table

元素周期表也是可以的Periodic Table of Chemical Elements

电路Power electronics

如果你想要一个示波器TeXtronics oscilloscope

光学Polarizing microscope

分形也没什么啦Lindenmayer systems

有了分形,即使是圣诞树也是有可能的Christmas fractal tree

手绘风格Simulating hand-drawn lines with TikZ

还有ArtSunset | TikZ example

Poppy flower

Modernized Islamic Art

Mandala | TikZ example

可能,理论上说,其它工具也可以画出这些图,但是,我怀疑它们是否有一个和 LaTex 媲美的社区,提供这么多丰富的资源和代码。

LaTex 还有一个和stackoverflow媲美的问答网站,我日常工作中会遇到的 LaTex 相关的问题的答案,都可以在这里找到TeX - LaTeX Stack Exchange



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有