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

更新时间:2024-07-05 02:44:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

经常看到别人论文中画出各种绚烂的插图,我想知道这些图都是用一些什么样的软件画出来的。比如下面给出的几张,好吧,我承认有的并不那么绚烂,但用什么样的软件比较合适呢?具体答案可以拓展到更为广远的作图领域。

知乎用户,计算图形学和计算机视觉,努力学以致用

知乎用户、李嘉、钱钱 等人赞同

很多人似乎觉得 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}

看,代码量没什么太大差距吧。

其实,除了代码量以外还有一个很重要的问题需要考虑,就是 学习曲线。是的,在这个 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 是什么?好像虚线就是画一段空一段嘛,所以大概这个o n就表示画一段的意思,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 吗?

以上。

/******下面是原来的答案******/

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

首先是和问题中给的图比较接近的点阵图

Drawing lattice points and vectors

经典的函数曲线,不管是离散点还是直接用function

Pgfplots | TikZ example

Animated definite integral

三维的

Spherical and cartesian grids

Membrane-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

还有Art

Sunset

除此以外,不过你是矢量场,网络还是什么奇葩的需求都能够搞定:

plt.streamplot(X, Y, U, V, color=U, linewidth=2, cmap=plt.cm.autumn) plt.colorbar()

plt.triplot(x, y, triangles, 'go-')

plt.title('triplot of user-specified triangulation') plt.xlabel('Longitude (degrees)')

plt.ylabel('Latitude (degrees)')

ax = plt.subplot(111, polar=True)

bars = ax.bar(theta, radii, width=width, bottom=0.0)

这还没完,Matplotlib 还支持Latex公式的插入,当别人画的图还是这个样子的时候(以下图片引用自Matplotlib Tutorial(译))

你能够把它变成这个样子:

如果再搭配上 IPython 作为运行终端(这张图是自己的~):

简直就是神器啊,有木有! 心动不如行动,还等什么?

(奉上教程一篇 Matplotlib Tutorial(译))

==== Update: 2013-9-18 18:04 ====

经@许铖同学提醒,再补充一句,matplotlib 还可以话 xkcd 风格的图呦~

(图片引用自网络)

此外结合 IPython Notebook 后更多精彩内容,请看http://nbviewer.ipython.org/

==== Update: 2013-9-19 20:04 ====

如果嫌安装麻烦并且恰好在 Windows 系统下的话可以尝试Python的一个发行版winpython - Portable Scientific Python 2/3 32/64bit Distribution for Windows。

==== Update: 2013-10-1 23:45 ====

鉴于@van li同学质疑 matplotlib 是否能画出题目中所示的图像,我在这里将题目中的图像用 matplotlib 画出来如下:

绘制图表

下面是几个3D的,比较下Matlab和Python画的爱心

http://www.cnblogs.com/qtsharp/archive/2012/03/24/2415147.html http://www.xue163.com/178/6/1787117.html

2行代码创建的

Menger sponge

Matlab版:Matlab软件环境下的Sierpinsk地毯及Sierpinski海绵

量场流线图

图论中的

散点图

更多美图

http://www.51xuewen.com/group/513/topic_12635.htm

http://mathematica.stackexchange.com/questions/11880/animating-mathematica-se-logo

http://mathematica.stackexchange.com/questions/11350/xkcd-style-graphs2013-10-22

本文来源:https://www.bwwdw.com/article/kfq.html

Top