科研论文绘图绘图软件论文插图

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

问题描述

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

地铁风
不会撸程序的设计狮不是好科研狗

高能预警!!!多图杀猫!!!我是认真的!!!

首先发个链接:bugman123.com/index.htm 这哥们的 visualization 能力完爆所有答案(包括我的)加起来,实在是牛逼……

==

看到这个问题的时候我有点纠结问题里的最后一张图是怎么画的,不过仔细看了一下我觉得应该是二维空间里画的。所以 Asymptote 和 Metapost 都可以。

对了补充一点,在我的另一个回答里(当别人问你的研究有什么实际价值的时候,你是怎么回答的?),我提到对于科研的价值,科研圈和大众的定义是不一样的。对于“漂亮的插图”也是一样。君不见大众媒体里少有数据图,就算有也是寥寥几笔,fancy 为主,使用符合当前大众审美的风格(比如现在是扁平、极简),测量从来不画 errorbar,甚至极简风格的连坐标轴都不画,一条颜色风骚的曲线牛逼闪闪。对于大众来说,看起来牛逼、fancy 才是漂亮。但是在科研圈里显然不是这样,而且不同的学科之间对图的严谨、清晰程度的要求也不一样。所以单纯地说一个插图“漂亮”其实没什么意义。


我觉得这个问题让我答简直太合适了…… 只要是用来画图的玩意我基本都用过,也都会。这个回答主要介绍工具,为什么不说方法呢?因为感觉好像没什么好说的,你觉得什么地方难看,改一下就行了啊…… 从最简单的开始吧。

菜鸟级

Matlab, MathematicaR 就不说了。

Python 有个著名的库叫 Matplotlib, 主要用来数据作图,但本身带有层次较低的 API, 原则上可以用来画任意种类的图。这玩意自带 TeX 数学语法。数据作图效果这样:




丧病一点可以这样:

这种牛逼闪闪的等高线也是小意思~~



这么多点也是没问题的:


这玩意极其的灵活,比如 Mathematica 有个功能就是画函数曲线的时候自动选择合适的采样率,斜率或者曲率比较大的地方会自动使用高采样率。于是我在 Python 里也实现了一个,这样就可以用 Matplotlib 无脑画函数曲线了,比如这样:



Gnuplot. 纯画图方面与 Matplotlib 不相上下,优点是快,超级快。图就不放了,和 Matplotlib 差不多。

普通级

Metapost. 脱离菜鸟级以后,我们离开了 API 和程序的地盘,开始撸绘图语言。首先当然要介绍大名鼎鼎的 Metapost. 这货的历史最早要追溯到 Knuth 大神设计的 Metafont, 但是 Metafont 是用来制作字体的,于是一帮人仿照 Metafont 设计了通用绘图语言 Metapost. 写程序画图相对于使用 GUI 工具来说最大的好处就是可以精确地控制,和自动化。这种绘图语言尤其适合画示意图。还是上图吧……




费曼图什么的简直就是不在话下…… 其实我是不太明白为什么有些软件画出的费曼图那么难看的……


然后这是我用 Metapost 给我的统计力学笔记撸的封面:


Asymptote. 有一小撮人用 Metapost 不爽,毕竟语法太古老了,于是搞出了类 C++ 语法的面向对象语言 Asymptote, 也是醉了…… 除了写出来比 metapost 好看一些意外,基本上差不多:




初中几何题都是可以的。


这玩意比较逆天的功能是 3D 矢量作图~~ 你看我这么一比划,你不就知道面心立方

的晶胞是什么样的了么~~

你看我这么一笔划,你不就知道 RGB 空间是怎么嵌在 xyz 空间里的了么~~

继续

嗯,还有好多图懒得找了,Asymptote 就先这样吧。

…… …… ……


<更新 2016-01-22>
最近又折腾了一下传说中的 D3.js. 这个东西的核心实际上是一套 selector 实现和把数据绑定到 DOM 上的机制,非常紧凑。然后 HTML 的 DOM 里可以包含 SVG, 这就很好玩了。

我试了一下数据作图


然后顺便撸了个 Game of Life, 你们可以玩玩~~ (暂不支持移动端……),长这样:


看上去挺好用,对吧?但是!!这个东西其实并不是特别适合给论文出图,原因是你用的时候需要把 SVG 保存下来。SVG 是 DOM 的一部分,一般只能用 Javascript 把 SVG 序列化,然后抛出一个文件让你在浏览器里下载,或者打开一个新窗口你手动另存为什么的,这不是关键,关键是我们写 SVG 的时候经常会用 CSS 来指定样式,这样如果你需要所有的线都粗一点,只要改下 CSS 就好,不用碰逻辑。然而你序列化 SVG 的时候是没法同时序列化 CSS 的(吧?)……………………………………
</更新>

地狱级

这个级别的工具当之无愧地给了 Postscript 这个基于堆栈的底层页面描述语言,这个语言是如此的强大,以至于 Adobe 后来不得不发展了简化版(更易于实现):EPS 和 PDF. 这个语言的神奇之处就是它底层到用户几乎忘了它的存在,但同时它写起来却不是很费劲。如果你玩过 RPN 计算器,就很容易理解 PS 的逻辑。这玩意最大的好处它的语法十分简单,无论你用什么语言来计算,都可以方便地生成 PS 代码,而不需要考虑你用的语言是否有好用的绘图 API. 比如我之前玩元胞自动机的时候就可以用计算的代码直接生成图形:

放大一点可以看到我在图上直接写了格点的编号,方便调试~~

奇葩级

最后这个级别主要是给一些特殊用途的工具。

Graphviz. 这是一个图可视化工具包,可以可视化各种无向图和有向图。前几天我刚刚用它画过一个流程图:


Blender. 这是一个自由的通用 3D 建模/着色/渲染/动画套件,我基本上是看着它一点点从一个土了吧唧的山寨三维软件逐渐进化成现在 Maya 级别的 3D 套件的。你们都在 Nature 杂志上见过那种很漂亮很 Fancy 但其实没什么用的三维渲染图对吧?我只能说…… 他们如果雇我画图的话会更漂亮更 fancy…

不过在放 fancy 图以前,先放个看起来不那么 fancy 的:

画这个图以前我以为在 Blender 里面放几个立方体几个球打开卡通渲染就行了……
……
……
……
我简直就是拿衣服。这货最后用了三个渲染层才搞定…… 如果有人知道更简单的方法请告诉我……

下面放 fancy 图~~

小清新洛伦兹吸引子:


小清新某分子:

这张图的源文件(分子略不同,注意有三个 scenes 需要渲染):drive.google.com/file/d


嗯,就先这样吧~~ 想起什么再更新……

<更新>

这两天在帮妹子折腾这样一个分子:

最终在 node editor 里撸出了这个

感觉放在文章里挺不错。方法是用一个 tonemapping node... 详情见 Sky Watch / Molecule visualization with Blender

然后给妹子渲染的另一个:

</更新>

更新:

Pov-ray: 好像还没有回答里提及这个。这是一个场景描述语言 + 渲染器,那个渲染器还是不错的,就是比较慢。这玩意有两种用法:

  1. 当渲染器用,主要是在别的 3D 软件中把场景导出成 pov 文件,然后直接渲染,没什么技术含量
  2. 把数学公式写进去画曲面。这个玩法比较特别,配合 pov 强大的渲染器可以撸一些非常怪异的东东,但是…… Blender 是有 Python API 的,所以其实 Pov-ray 能撸的 Blender 都能撸。我之前有一段时间特别痴迷这个,后来发现然并卵,用 Blender 就行了……

最后再把之前那个链接发一下:bugman123.com/index.htm 实在是太牛逼,不服不行……

6,700 赞同 1,735 感谢 14,024 收藏 246 条已备份评论 发布于 2015-07-10 知乎原页 ↗

评论 246

目前仍并将长期处在菜鸟级orz
64 赞
钫是碱金属回复 格兰特

同……我还是去买个数位板直接画吧,对我来说容易多了………………

3 赞
Tursun Muhammad
这些东西中只学过(并不太会用)Matlab,想学origen。求大神多多关照
0 赞
乘物游心回复 Tursun Muhammad
一般画图需求的话还是老老实实用origin吧,而且还要看你导师的要求,我导师要我给他origin双击能打开的原图,他不会用别的
0 赞
动脑筋爷爷
可是并不好看哦
4 赞
地铁风回复 动脑筋爷爷作者
其实主要是我的领域里不看重图是否特别好看,而是要清晰,所以一般还是倾向于画那种大红大绿的。想画统计里那种 fancy 的也是可以的。
1 赞
这不是菜鸟高手的区别,应该是普通青年,文艺青年和2B青年画图的区别。。。
25 赞
爱钢琴的紫薯布丁
楼主大神,弱问普通的折线图怎么画更好看?
0 赞
地铁风回复 爱钢琴的紫薯布丁作者
主要得看受众是谁,不同层次的受众对“好看”的理解是不一样的,然后再多看看相似受众的好图,总结一下就好了。
1 赞
爱钢琴的紫薯布丁回复 地铁风
普通给客户看的ppt里边的呢?
0 赞
地铁风回复 爱钢琴的紫薯布丁作者
那应该还是要 fancy 点才好吧,不过我也不了解了
1 赞
最后两张分子图是pymol和blender一起作的吗?
0 赞
地铁风回复 贾名淄作者
是的,pymol 导出到 blender.
0 赞
动脑筋爷爷回复 地铁风
题目不是说漂亮嘛。不过看着确实很专业
0 赞
地铁风回复 动脑筋爷爷作者
嗯,起码 Blender 撸的那几个还可以吧~~
0 赞
动脑筋爷爷回复 地铁风
对 那几个图有渲染过 看起来好一些。专业要求不一样
0 赞
贾名淄回复 动脑筋爷爷
见仁见智吧,这些图比绝大多数科学家做的图都漂亮,再漂亮就要花钱雇人做了
0 赞
对了想麻烦问下答主,这些软件可以在Mac上跑吗
0 赞
地铁风回复 张立秋作者
我的工作用机就是 Mac, 所以可以~~
0 赞
可以把函数图像导到Blender里?
0 赞
地铁风回复 Cccmm002作者
不是很明白,你是说导入个矢量图进去么?好像是可以转成 blender 曲线的,不过没试过。
0 赞
Cccmm002回复 地铁风
那你最后那两张图是怎么做出来的?如果从头开始建模的话,Blender的优势相比Maya等在什么地方?
0 赞
地铁风回复 Cccmm002作者
那两个分子是化学软件导进去的,洛伦兹吸引子那个…… 你知道 blender 有 python API 吧~~
0 赞
graphviz为什么属于奇葩级。。。我觉得它和matplotlib是同一级啊。。。
0 赞
地铁风回复 tefx作者
主要是因为 graphviz 是专门用来画图的(图论的图),应用比较窄。嗯。
2 赞
谢谢! 太感谢了! 给paper配图,画图的世界这么广阔啊... 等我忙完考研事项会好好补充计算机相关的事情的。 非常感谢!
0 赞
蛇纹身的程序员
Blender的曲线是生成的?Python吗?
0 赞
地铁风回复 蛇纹身的程序员作者
是 Mathematica 算出来以后 Python 读进去的。
1 赞
蛇纹身的程序员回复 地铁风
可以用命令行调用脚本给blender输入吗
0 赞
答主也是做混沌的吗ᶘ ᵒᴥᵒᶅ
0 赞
地铁风回复 小白熊THU作者
不是,那个倍周期分叉是之前帮某教授判计算物理作业的时候撸的。洛伦兹吸引子是因为我想换个壁纸⋯⋯
0 赞
猪小左的夏天
答主牛逼闪闪放光芒,请收下我的膝盖!
0 赞
请问大牛,画示意图用什么软件比较好?跪谢了
0 赞
地铁风回复 莱因哈特作者
啥样的示意图⋯⋯?
0 赞
莱因哈特回复 地铁风
PRL上面的那种器件示意图,如果要画一个石墨烯然后还有各种符号的那种?
0 赞
地铁风回复 莱因哈特作者
听起来可以用 metapost? 把原件写成宏然后组合起来?
0 赞
莱因哈特回复 地铁风
以前发文章都是用PPT画的。好的,谢谢大牛。学习学习metapost
0 赞
莱因哈特回复 地铁风
还有一个问题,metapost是不是可以直接在latex上就可以编译出图形了?还是要一个专门的编译器?
0 赞
地铁风回复 莱因哈特作者
Meta post 有专门的编译器,我不知道latex 能不能直接写,ConTeXt 可以。
0 赞
莱因哈特回复 地铁风
专门的编译器是什么,求名字,谢谢
0 赞
薛老板的猫
Graphviz画流程图好像不支持中文,我觉得美观还是tikz好些!
0 赞
Blender的小清新分子模型太漂亮了,这个赞同是给它的。
0 赞
比菜鸟更低的是不是细胞级别。。。看来我就是
0 赞
回忆到清晨
楼主,我做生态数据处理的,一般用Spss有没有适合的绘图软件升华下
0 赞
地铁风回复 回忆到清晨作者
嗯⋯⋯ 没用过 spss. 不过你算完以后把数据导出来就可以随便玩了~~
0 赞
我现在若有上 Metapost 的必要时,其实都是写个 python 来生成它的……

话说 Matplotlib 里头 bug 一堆,文档翔一样,它(以及比它还要烂上无数倍的 IDL 之流)还能上位,实在是折射出学界中人在此的懒惰……
3 赞
Luyao Zou回复 王力乐
太对了!matplotlib简直就是一大坨翔,语法混乱不堪,哪有我 gnuplot 轻巧。要不是撸 GUI 用原生的方便一些,才不用呢
0 赞
地铁风作者
嗯,我还是想给维护者稍微洗个地,一个完整的画图 API 实在是太复杂了。实际上通用语言里有完整可用的画图 API 的好像只有 Python. 这种东西实现起来绝对是个体力活,有各种各样的细节需要考虑,比如我刚刚看了一个视频介绍 matplotlib 2 里设计默认 colormap 的过程。这帮人为了提高辨识度,跑到一个诡异的颜色空间(有良好的 linearity)里一阵撸,还要兼顾色弱人群。这样实在是很难再吐槽维护者了⋯⋯ 有 bug 就忍了吧…… 至少现在比 1.0 的时候好太多了…… 至于文档,其实要是搞清楚类结构以后再看也还好了⋯⋯ 毕竟是个 reference. 不过没有好的教程是真的⋯⋯

不过学界对画图程序的用户体验要求很低是真的,我有个同事坚持使用 grace 画图,不知道他是怎么忍受那个界面的⋯⋯ 学界是只要能完成想做的事,用户体验烂到什么的程度都能忍……
8 赞
时间都花错了地方,怪不得中国没什么创新
0 赞
地铁风回复 St Jason作者
噗嗤,你以为画这些图需要很长时间么 2333333
0 赞
乘物游心回复 地铁风
知乎这种人越来越多了,凡事不过脑子,全靠想象力,靠猜测,他自己感觉很难的东西,就以为别人也感觉很难
0 赞
你的很长是多长?
不认为你的学习成本低 即使很短
0 赞
地铁风回复 St Jason作者
这些东西都是在我还没有开始做科研的时候就学会的,然后这些东西当真没什么学习成本。

这些类型的图都是科研的最低要求了,不知道如果不会画这些图的话你怎么做科研。
2 赞
地铁风回复 St Jason作者
画这些图的时间长短不一。比如第三张图,是放在笔记里的,不需要进入文章,所以自己能看懂就好,这张图加上 IO 也就十行代码的样子,五分钟搞定。比较重要需要进入文章里的 money plot 比如第一张,是要和合作者商量着画的,耗时比较长,但是真正用来写代码测试的时间也不会超过半个小时。Metapost 和 Asymptote 的那些从几分钟到半个小时不等吧。最后那些渲染很费时间,但是渲染的时候我在干别的。

这些时间你觉得长还是短呢?
2 赞
吸引子和分子的渲染太棒了。可以具体说以下渲染参数吗?Cycles还是其他渲染器?Material 怎么设的阿?谢谢!
0 赞
地铁风回复 孟伟作者
是 cycles. 我的设置是背后有一个垂下来的白色幕布(像摄影棚里一样),然后头上三盏 area light(请看倒数第二张里的反光)。前两张图主体的材质是 mirror 和泛光材质的 mix~~
0 赞
孟伟回复 地铁风
谢谢。自己试着设了一下,效果远没你渲染的好阿 :P
0 赞
孟伟回复 地铁风
太感谢了,先研究一下。有问题再请教!
0 赞
孟伟回复 地铁风
谢谢你的文件,最近抽空研究了一下,学了不少东西。比如分层渲染(实物层,背景层,背景+阴影层),nodes 里的group,bezier 曲线直接画幕布。自己做出来的效果比原来好多了 :). 另外,为什么分层渲染画面会好这么多呢?我在网上看到很多人也是这么分的。
0 赞
好牛逼好牛逼,虽然看不懂,可是忍不住崇拜
0 赞
大神能给我们做个洛伦兹吸引子的教程么?简单的讲下流程,关键是Blender的操作理念~~这样的话我们上手可以快点啦~ ( •ิ_• ิ)
1 赞
地铁风回复 陈昕作者
嗯,用这个 Mathematica 算吸引子 gist.github.com/MetroWi,然后用这个 Python 在 blender 里转成曲线 gist.github.com/MetroWi
0 赞
jxltom回复 地铁风
请问readCoords("/file/name")是读哪个文件?是要把mathematica里面的data变量存到文件吗?感到好玩,想试试,谢谢啦
0 赞
地铁风回复 jxltom作者
嗯,对,好像是把 data 存下来吧,可能需要手动去掉括号逗号什么的,我忘了……
0 赞
菠萝打几折
我决定了!以后数学作业用 Blender 全彩打印。。!
1 赞
总得有个编辑器,编译器啥的吧?
0 赞
地铁风回复 王木渎作者
用什么编辑器写都行啊…… 写出来就是 PS 文件,可以直接打印,或者用查看器看。
0 赞
画费曼图有什么方便的工具么,最好是支持画图的的LaTeX宏包
0 赞
地铁风回复 mRNA1273改作者
据说有一些所见既所得的程序,但画出来都超难看。所以我还是拿 metapost 了。
0 赞
mRNA1273改回复 地铁风
然而为什么我用feynmf画的图不能加上指标呢?用的是XeTeX
0 赞
地铁风回复 mRNA1273改作者
我也不知道…… 我都是用 metapost…
1 赞
麻烦问下有没有用过Anaconda,使用遇到了一点小问题,就是这个东西怎么卸载啊?我删了之后,在垃圾桶里却删除不了
0 赞
答主,答案的最后蛋白质图很好看!这个图是怎么得到的呢??
0 赞
地铁风回复 Xmacs作者
从化学软件导出到 blender 的~~
0 赞
Xmacs回复 地铁风
好的,谢谢!!!之前一直用pov-ray,感觉效果一般,有时间试试blender
0 赞
算你厉害的NPC
想问下楼主如何这么高效的学习了这么多绘图软件/语言,最近在学latex包括chemfig宏包,准备学gnuplot,虐的是不要不要的……本人大四狗,潜研究生一枚(⊙o⊙),以后可能也需要在图表方面比较熟悉,请大神指教
0 赞
地铁风回复 算你厉害的NPC作者
大神不敢当啊……

不要看太多书,找一个有 deadline 的项目(比如毕业论文?),逼着自己用想学的工具实现。一个项目做下来就学的差不多了。
0 赞
算你厉害的NPC回复 地铁风
嗯嗯,最近刚好在写毕业论文,要好好学学咯
0 赞
请教大神,我的工作一般是用matlab跑算法,得到一些列的数据,然后用matlab直接作图,把变量的变化画出来,并比较比较算法的优劣。感觉matlab画图太丑,有没有什么工具可以让作图美化一点?并不需要画出分子结构这一类图形。。。感谢!
0 赞
地铁风回复 Vanpierce作者
任何数据作图的程序都可以啊。
0 赞
为什么我发现我的blender里面没有layermix这个node??
0 赞
地铁风回复 柳梦璃作者
是没有啊,把两个图叠在一起的 node 是 alpha over.
0 赞
混沌的那个图咋画的?
0 赞
地铁风回复 Yann作者
把点遍历求出来然后画。
0 赞
Jhasiun回复 地铁风
是用的Blender里的Python API做的么?我现在有一条曲线上每个点的坐标,想可视化成3D折线图.
0 赞
这哪里是论文,这都超过课件的标准了!吓得我赶紧收藏
0 赞
metapost可以别搞了,每次要预先编译成ps,然后Include到latex里面太麻烦了。我很早就换成tikz了。另外例如matplotlib,gnuplot,geogebra,matlab等都有export plots为tikz/gpf文件的可能,大大方便了在latex里面插图。postscript...额...很麻烦的语言,而且人工编写很少见,而且当初设计就是作为打印中间语言用的,根本就不是给人读而设计的。
PS: matplotlib画图真丑...=.=...要不是目前主要的几个画图lib都不支持3.*...我早就甩了它了...
0 赞
Cool. 现在有了一门学科可能跟这个比较相关 data visualization 。

还可以推荐一个鄙人比较熟悉的 circos.ca ,你会喜欢的!
0 赞
那个统计的封面很好看 请问是什么意义……
0 赞
地铁风回复 土人作者
没什么意义,就是随机生成的……
0 赞
大神 我可以问下分子那张图的最底下的弯曲的反光板是怎样画出来的呢, 还有能问一下摄像机和光源是怎么样摆放的? 谢谢
0 赞
学习了,好的图表令presentation表意清晰,而且不经意间传达出更多的信息
0 赞
答主的小清新分子渲染的材质参数能方便透露下吗,我用3dsmax制图贴图很头疼。
0 赞
地铁风回复 纸上山水作者
混合 glossy 和亚光材质,调一下混合比例就行了。
0 赞
LdBeth回复 纸上山水
材质渲染可以用 keyshot,简单到直接用鼠标拖就行。
0 赞
石墨烯倒格子和面心立方示意图很漂亮,电滞回线那张好丑...
1 赞
画出这样得花多少工夫啊,学多少语言啊,还要会用?
1 赞
请问那个小清新的分子图~~分子是用什么软件做好再导入的?
0 赞
为什么Pymol打开个文件就崩……真不想再编译一个……
0 赞
地铁风回复 呵呵作者
学术界的玩意就这样,欺负别人没时间写替代品……
1 赞
你这个不用预警,你的这些图压缩比相当高,很省流量
1 赞

你好 请教下 怎么绘制多于3d的图呢 想可视化多维的数据来验证它们的线性相关性

0 赞
地铁风回复 三文鱼作者
显然不管你有几维都得投影到两维,所以……… 选个合适的投影呗~~
0 赞
一名奋斗的青椒
名字都没提到的想必是细胞级的弟弟了
0 赞

妈耶, 我试着画了下Blender那个非fancy的图。。。。貌似还真是没有简单方法。。。。总是会有奇怪事情出现让我不得不考虑multi-layer....试图10min画出来还真是没成功。。。。服了

0 赞

其实我就是想emmmmm能画个三角形加几个圆的那种

1 赞
汁糊又再给我推远古帖子了,但是质量很高[惊喜]
7 赞
里面有一个图,我在论文里面见过
0 赞
地铁风回复 好的好的作者

以前做 QCD 的,后来转行了⋯⋯

0 赞
地铁风回复 好的好的作者

这个就是很普通的倍周期分叉,很多科普里都有的~~

0 赞
好的好的回复 地铁风
我再去看看那篇论文,再来看看你的评论,谢谢你![大笑]
0 赞