Sky Watch

学术绘图工具总结

By mw @

本文为囧乎回答的存档和更新。


有一种科研狗,自己没什么文章,但是会出现在很多文章的感谢桥段里,这种一般就是组里打杂的。没错,我就是这种。作为一个打杂的,基本上所有类型的图我都画过,用来画图的玩意我大多都用过。如果你是刚开始科研的学生,这篇文章可以向你介绍科研中大概会需要画什么样的图,以及可以用什么工具画。

菜鸟级

Matlab, Mathematica 和 R 就不说了。

Matplotlib

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

Roper world plot

3pt/2pt fit

丧病一点可以这样:

variation effective mass plots

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

Hamitonian eigenvalues

这么多点也是没问题的:

Bifurcation

也可以画一些更抽象的~~

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

Gamow window

Statistical TVP

Gnuplot

纯画图方面与 Matplotlib 不相上下,优点是快,超级快。图就不放很多了,画数据图的话和 Matplotlib 差不多。

Roper global compare with Gnuplot

普通级

MetaPost

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

2pt contraction

2pt loops

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

Feynman diagram 0

Feynman diagram 1

Feynman diagram 2

Asymptote

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

Reciprocal lattice

初中几何题都是可以的。

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

Statistical mechanics notes cover

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

FCC lattice cell

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

RGB color space

继续

2-sphere mapped to a plane

Sphere-sphere smooth map

地狱级

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

Percolation on 2D lattice

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

Percolation on 2D lattice, zoomed in

奇葩级

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

Graphviz

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

Disconnected insertion data analysis flow chart

这是我为了玩 DMW 2 生成的怪兽图谱:

DMW 2 breed plan

〔时间旅行更新〕Graphviz 的特点是声明式,使用者只需要指明结点之间的拓扑,程序自动计算出合适的布局并生成图片。这是一个古老的程序,最近几年有一些新的程序和库也实现了同样的功能,并支持更多种类的图,其中比较常用的是 MermaidPlantUML。Mermaid 是一个 JavaScript 库,方便之处在于直接在网页上生成图形,但是功能不如 PlantUML 强大,而且有一些奇怪的限制。比如由于未知的原因,Mermaid 生成图形需要依赖 DOM,而且 bug 似乎较多。PlantUML 是一个 Java 程序,顾名思义原本是用来生成 UML 的,但是现在也支持生成很多其他种类的图,并且有 web assembly binary,似乎也可以在网页上用,但是我没试过。下图为我用 PlantUML 画的网络拓扑。

Home network topology

Blender

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

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

Balls in cubes

画这个图以前我以为在 Blender 里面放几个立方体几个球打开卡通渲染就行了……

……

……

……

我简直就是拿衣服。这货最后用了三个渲染层才搞定…… 如果有人知道更简单的方法请告诉我……

下面放 fancy 图~~ 小清新洛伦兹吸引子:

Lorenz attractor

Lorenz attractor

Lorenz attractor

Lorenz attractor

不懂,帮老婆做的~~

ntam

某种蛋白质的可视化:

Some protein

另外一种蛋白质的可视化:

Some protein

这个完全就是我自由发挥了~~

Some protein

Pov-ray

这是一个场景描述语言 + 渲染器,那个渲染器当年还是能用的,但是现在来看就太老了。这玩意有两种用法:

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

我没怎么用过 Pov-ray,所以没有图,但是这个人是 Pov-ray 大佬:http://www.bugman123.com/index.html