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

像这种普通的函数图象:

plt.fill(x, y1, 'b', x, y2, 'r', alpha=0.3)

以及这种 Scatter 图(中文不知道该怎么说…):

plt.scatter(x, y, s=area, alpha=0.5)

精致的曲线,半透明的配色。都显出你那高贵冷艳的X格,最重要的是只需一行代码就能搞定。从此以后再也不用忍受 Matlab以及GNUPlot 中那蛋疼的配色了。

想画 3D 数据?没有问题 (不过用 mayavi 可能更方便一些):

ax.plot_surface(X, Y, Z, rstride=8, cstride=8, alpha=0.3)cset = ax.contourf(X, Y, Z, zdir='z', offset=-100, cmap=cm.coolwarm)cset = ax.contourf(X, Y, Z, zdir='x', offset=-40, cmap=cm.coolwarm)cset = ax.contourf(X, Y, Z, zdir='y', offset=40, cmap=cm.coolwarm)

四行代码你就能拥有(后三行是画坐标平面上的等高线,严格的额说还是一行)。

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

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 作为运行终端(这张图是自己的~):如果再搭配上 IPython 作为运行终端(这张图是自己的~):

简直就是神器啊,有木有!

心动不如行动,还等什么?

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

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

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

(图片引用自网络)(图片引用自网络)

此外结合 IPython Notebook 后更多精彩内容,请看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 画出来如下:

代码在此处:代码在此处:gist.github.com/coldfog

代码在此处:代码在此处:gist.github.com/coldfog

【张知洞的回答(376票)】:

  • 我喜欢用Mathematica画图,默认出图漂亮,自定义性好,支持常见各种类型的画图,能导出丰富的格式,动态交互和制作动画也很强大,还有一点:Mathematica很数学,语法和数学上的习惯更接近,函数或方程作图只需输入表达式和范围即可,Matlab和Python中一般需要先手动离散化
  • Matlab的可视化也很强大,不过被吐槽较多的一点是线条有锯齿(这个和取的点多少无关,其实也能消掉)(tieba.baidu.com/p/20878)3维绘图色调不好看,当然如果有耐心也可以画出漂亮的图形的
  • Python的matplotlib库我也用过,风格是模仿Matlab的,就默认绘图来说比Matlab好看(起码没锯齿),好处楼上已经有人说过了,但是并非没有缺点,使用matplotlib需要一点编程和Python基础,对于编程基础不好的同学来说入门会比其他的软件慢一点;matplotlib的2维绘图很好,但是3维绘图目前还比较差,各种绘图细节方面的可选项不算很丰富,不支持隐函数绘图(形如F(x,y,z)=0这种),性能也不好(如3D的scatter,大概1万个点就开始卡了,Mathematica和Matlab 10万个点都不算卡),3维的用mayavi这个库可能更好
普通函数绘图只需输入表达式以及取值范围,真正的一行代码。

第二幅图中加上Mesh->All,显示出所有点的位置。可以看出Mathematica很聪明,它知道在变化剧烈的地方取更多的点,变化较少的地方少取一些

Mathematica不仅支持Latex,还能直接写二维的公式以及把公式导出为Latex

不等式区域绘图,在Mathematica中使用RegionPlot很简单,但在Matlab和Matplotlib中有点麻烦

(下面这个是在极坐标下的)

绘制图表

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

cnblogs.com/qtsharp/arc

xue163.com/178/6/178711

2行代码创建的2行代码创建的Menger sponge

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

矢量场流线图矢量场流线图

图论中的图图论中的图

散点图

更多美图

51xuewen.com/group/513/

mathematica.stackexchange.com

mathematica.stackexchange.com

【王开源的回答(172票)】:

工科生说Matlab完爆其他

数学系的说Mathematica高贵冷艳

统计系的说R语言作图领域天下无敌

计算机系的说Python低调奢华有内涵

…………

【知乎用户的回答(163票)】:

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

首先是 matplotlib 的。

import numpy as npimport matplotlib.pyplot as pltx = 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 offline.set_dashes(dashes)plt.show()

接着是 pgfplots 的。

documentclass{article}usepackage{pgfplots}egin{document}egin{tikzpicture}egin{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 的。

egin{tikzpicture}

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

egin{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 | TikZ example

Poppy flower

Modernized Islamic Art

Mandala | TikZ example

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

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

【傅渥成的回答(20票)】:

这里我先讲示意图吧。先要想好你要用这个示意图表达什么问题,然后直接用你最熟悉的工具吧,最后存成 pdf 或者 eps,然后再插入到文档中就可以了。

使用工具的时候,关键是要能够物尽其用。能把有限的工具组合起来用,例如可能在PowerPoint 里找不到好用的橡皮擦,那把一个白色的矩形放在不同的层上其实就可以实现各种效果的「橡皮擦」。画出这些示意图,其实不一定要是多么专业的软件, Keynote,PowerPoint ,只要熟练使用,我觉得这里给出的这些效果都能做出来。

另外,如果做化学、生物领域的一些工作,要画一些小分子或者大分子的图,也是一定要熟练掌握某一种软件就好,最好是用各种命令行工具,当然如果已经用图形界面很熟练了也没有必要强制自己改,熟悉的工具就最好了。

要知道,始终是你想表达的东西才是最重要的,例如:

额……以上的示意图是我随手画的,效果肯定很差啦,没有什么想表达的意味,就是想略模仿并恶搞一下题主给出的一些示意图。画上图用的工具是就是 PowerPoint(椭圆+矩形+曲线),想要说的就是这个弄起来很容易,随手一弄就能画,因为没有仔细修过,平时如果我要自己演示要用,我还会处理得细致些。如果是放到文章里,看你想要发表的杂志的类型,有时候其实并不是越华丽越好。

另外,作图的时候也是把自己常用的作图软件用熟。当然在此基础上,美观也很重要的。例如:下面的两个图其实是同一个图,只是换了配色方案。效果你可以感受一下,当然觉得哪种更好可能也跟具体的问题有关(例如下面的两个图不但是配色方案不同,在视觉上,二者所强调的区域也有所不同)。这样的东西就真的是要自己慢慢摸索了。如果你们组里面有老师或者学长学姐在作某些特定类型的图的时候有一些成熟的配色方案或者是显示为立体的方案,不论是 MATLAB 的还是 gnuplot 的等等,你都可以向他们请教,并且存在自己电脑里面随手备用。

【知乎用户的回答(46票)】:

大家都理解错了嘛~楼主问的是论文里怎么才能画出精美的插图。顶在最前面的Python、Matlab等软件虽然能准确画各种常见图,但是从美术角度来看不及格好吗!最让人吐槽的就是这俩的配色!看看直方图那丑陋的配色!函数图难看的等高线!一点都不精美!

要比高端大气上档次,本页所有答案完全不是R的ggplot2包的对手嘛~以前我也用Matlab,自从遇到ggplot2之后就彻底成为脑残粉了!

ggplot2是R的一个package,画图风格相当文艺小清新。看论文看到用ggplot2画图都是一种享受哦!极为擅长于数据可视化。可惜ggplot2功能没有Python或者Matlab全面,画不出稀奇古怪的电路图不支持三维立体图像哦~不过作为一个统计绘图软件那些功能也不算很重要啦。

ggplot2有一个最大的特点是引入了图层的概念,各位用过Photoshop应该能理解吧?

你可以随心所欲将各种基本的图叠加起来显示在一张图上,构造出各种各样新奇的图片!

先来一个最基础的散点图开胃。这是不调颜色软件包默认的配色。灰色的背景,黑色的小点点。拟合曲线和置信域看着就很舒服嘛。先来一个最基础的散点图开胃。这是不调颜色软件包默认的配色。灰色的背景,黑色的小点点。拟合曲线和置信域看着就很舒服嘛。

来看看直方图,和傻大黑粗的Matlab相比精致秀气多啦!来看看直方图,和傻大黑粗的Matlab相比精致秀气多啦!

还有精致的半透明效果!还有精致的半透明效果!

折线图画得美到极致了好吗!

柱状图+密度!柱状图+密度!

Heat Map!

这么乱糟糟的线也画得好清新!

ggplot2能把密密麻麻的散点图画的极具美感,彻底治愈密集恐惧症!

还可以画地图!把非洲画得这么美我都想去了好吗!还可以画地图!把非洲画得这么美我都想去了好吗!

Network也能画!Network也能画!

散点图+误差区间!散点图+误差区间!

极坐标柱状图!极坐标柱状图!

【车路的回答(14票)】:

各位科学家们,

我虽然无法看懂你们的专业论文中的插图,

但是我作为一个助人为乐的设计师,

常常帮助你们这样的专业人士“美化”插图。

例如:

很多时候,被“美化“插图的原作者,都会感觉到,新图和原图的差别。虽然这些图中的内容,是我不了解的知识,但是并不阻碍我通过制图软件把图做漂亮。

漂亮的图和丑陋的图的区别:

1.均匀的线条

有时候科学家们从这里抓一个图,那里生成一个图,每个图因为放大缩小的关系,线条都变得粗细不同,这样不会好看的。我修改的第一步一般是把所有线条变成一样粗细。

2.有规划的色彩

同理,如果色彩纷乱,没有规划,看上去也会大打折扣。所以建议一开始就对色彩进行一个规划,多图都统一一下色调。

3.统一的图形语言

这里是锐利的形状,那里又是温柔的圆角,另外一个地方居然是三维的,这就好比论文第一段和第二段的语言风格不一样,这样可不行。一定要用同一种图形语言来制图。就算全部用儿童手绘效果,也比参杂了水平不同的各种图形语言要强啊。

好啦,作为经常帮人美化插图的人,我也只能从图的角度随便说一说。其实,如果图的内容是正确的,想要图好看最主要要提高的能力绝对不是制图能力,而是审美能力。当你能够清楚地知道好看是怎么实现的,什么样的东西不好看的时候,你就能够轻松地运用自己熟悉的软件,制作出非常好的插图啦。如果有什么问题可以评论问我,我可以从设计的角度和科学家们一起探讨。

【王宇的回答(17票)】:

OriginLab 方便快捷

python+numpy+matplotlib 强大、开源、高质量

一般单纯的画图,或者简单的数据处理(多项式拟合、fft、包络等等)用OriginLab

复杂的数据处理,或者要与设备相连实时处理实验数据就用python的那套方案。

【Rio的回答(16票)】:

如果你用 LaTeX 的话,推荐学一下 PGF/TikZ [1]。好处是直接在 LaTeX 文件中用命令绘制需要的各种图形,是我目前见过的最好的 LaTeX 图文混排工具。比如其他答案提到的工具的一个共同问题是图形和文档是分开制作的,图形中的文字和文档中的文字的字体和字号不一样。PGF/TikZ 就没有这个问题,工作原理不通。缺点是和 LaTeX 一样,学习曲线比较陡……

[1]: ctan.org/tex-archive/gr

【虞快的回答(2票)】:

如果你会latex的话可以使用tikz package: texample.net/tikz/

【SaYi的回答(4票)】:

cdr啊…

如果图像是你知道要画成什么样的——那么专业矢量软件CorelDraw肯定最好……

如果你需要计算机自己按照你的公式运算,然后表现出精确的图像……我就爱莫能助了……

【知乎用户的回答(15票)】:

Xfig

Tikz/PGF

OmniGraffle

Inkscape

Dia

Graphviz

GeoGebra

ipe

Mahtematica

conceptdraw

【知乎用户的回答(14票)】:

前几天听报告的时候,被一个3D数据图震惊了,可视化做得太好了。交流的时候赶紧请教咋做的,答曰:"我提供数据,图是请计算机学院的人做的。"

这给我一个启发:论文作图一般也就是IDL那些,同质化严重,要想做出真让人眼前一亮的插图,找专业的啊!

【知乎用户的回答(9票)】:

先上结论:

不用Excel,用Matlab, Visio, Mathematica, WolframAlpha等工具绘图。

可尝试学习Paint.NET 、 Pixelmator 、 GeoGebra工具进行比较学习。

————————解释说明分割线——————————

Excel:

在我有限的科研生涯中,用Excel几乎是不专业的代名词,从来没有看到Excel下画出的优美漂亮的图表,所以我至少是使用Matlab或者Mathematica作图,后者还在学习中。

Matlab:

Matlab的使用是将Excel中的数据以矩阵形式导入到Matlab的向量空间中,然后用Plot函数等其他作图的函数作出基本的图形以后,用菜单上选择Plot Toolkit工具(具体名字我忘了)对函数曲线中的表头、图例、箭头指示、参考线等进行微调。效果如下(自己做的真是渣啊= =):

Visio:

像下面这种简单的图形绘制,利用各种基本图形如线条、箭头和弧线,再善于利用Visio的对齐功能,就可以作出比较漂亮的图形,注意变量的格式规范如斜体、字体用Times New Roman字体,另外流程图用Visio绘制最佳。

流程图一般用Visio,遵循设计的基本原则如对齐与保持大小一致。

WolframAlpha:

神器中的神器,除了计算功能强大,画出的函数图像也相当优美,画函数图象的时候直接输入函数图像即可自动生成,效果如下:

接下来由请大神@matrix67出场:

@matrix67 在他的博客中提到

Q: 你的 Blog 配图都好精致!究竟是用什么画图的呢?

A: 我用 Paint.NET 、 Pixelmator 、 Mathematica 、 GeoGebra 等工具画图。配图的秘诀就是背景透明化、图形反锯齿化、注重色彩、多用 png 、图内字体大小与正文一致。

以下是图形范例:

以上。

【YolandaHou的回答(3票)】:

推荐paraview,开源可编程,我们空客噪声技术中心都用

【知乎用户的回答(2票)】:

作图软件很多,我用过origin。

但是作图软件和作出漂亮的图是两回事,我用origin作图很简陋,而我的导师则能作得很漂亮。

【晖小晖的回答(1票)】:

如果会latax最好,lyx是免费的,无版权问题。傻瓜一点,并且不惧怕盗版,那scientifi workplace也还可以。推荐用r画图,很强大

【诺娃喵的回答(1票)】:

前面给了好多牛逼软件,我只推荐一个画流程图或者关系图或者示意图或者组织结构图电路图房屋结构图等等各种图又方便又好用又美观的软件——Office套件里的Visio啊!!!!

至于数据图表,请善用Excel,这是个异常强大的软件,可是大多数人只把它当格子纸用!

【罗磊的回答(1票)】:

发一张 gif 图吧发一张 gif 图吧

你可能感兴趣的:(如何在论文中画出漂亮的插图)