Linux 上用来实现数据的图形可视化的应用程序有很多,从简单的 2-D 绘图到 3-D 制图,再到科学图形编程和图形模拟。幸运的是,这方面的工具有很多开放源码实现,包括 gnuplot、GNU Octave、Scilab、MayaVi、Maxima 等。每个工具都有自己的优缺点,并且都是针对不同的应用程序而设计的。对这些开放源码图形可视化工具进行一下探索,有助于我们更好地决定哪个工具最适合我们的应用程序。
![f8638a50df953f8ecf6e9527dc8a95bc.png](https://i-blog.csdnimg.cn/blog_migrate/f99625e1981e738a07451c9909ed34f5.jpeg)
可视化工具的简短列表
在本文中,将对很多流行的 Linux 数据可视化工具进行一下调查,并对其中一些工具进行更深入的探讨。例如,某个工具是否为进行数值计算而提供了一种语言?这个工具是交互式的还是提供了一种批处理模式来单独进行操作?可以使用这个工具进行图像或数字信号处理吗?这个工具是否提供了语言绑定来支持与用户应用程序的集成(例如 Python、Tcl、Java 编程语言等)?另外还将展示一些工具的图形化处理能力。最后,将分析每个工具的长处,从而帮助我们确定哪个工具最适合完成计算任务或数据可视化。
在本文中所探索的开放源码工具包括(同时还给出了每个工具所使用的许可证):
- Gnuplot(GPL)
- GNU Octave(GPL)
- Scilab(Scilab)
- MayaVi(BSD)
- Maxima(GPL)
Gnuplot
Gnuplot 是一个非常好的可视化工具,它从 1986 年开始就存在了。如果没有 gnuplot 的图,就很难阅读论文。尽管 gnuplot 是命令行驱动的,但是它也在不断发展,现在也可以支持很多非交互式的应用程序了,例如它可以作为一个 GNU Octave 的绘图引擎使用。
gnuplot 具有很好的可移植性,可以在 UNIX®、Microsoft® Windows®、 Mac OS® X 和很多其他平台上运行。它可以支持从 postscript 到新近的 PNG 等极为广泛的输出格式。
gnuplot 可以以批处理模式进行操作,提供了一个命令脚本来生成一个图形,也是以非交互式模式来运行的,这让我们可以尝试一下它的特性来了解它们绘图的效果。
在 gnuplot 中有一个对应于 UNIX 的数学库的标准的数学库可以使用。函数的参数支持整型、实型和复型。可以将数学库配置成弧度或角度(默认为弧度)。
为了进行绘图,gnuplot 可以使用plot命令生成 2-D 图形,或使用 splot 命令生成 3-D 图形(作为 2-D projection)。使用plot 命令,gnuplot 可以在直角二维坐标系中进行操作。splot命令默认使用的是笛卡儿坐标系,不过也可以支持球面或柱面坐标系。也可以在图形中绘制等高线(如下面的图 1 所示)。有一种新风格的绘图pm3d可以支持绘制使用调色板进行映射的 3-D 和 4D 数据作为地图或地表图来使用。
下面是一个简单的 gnuplot 例子,它给出了一个具有等高线和隐线消除的 3-D 图形。清单 1 给出了所使用的 gnuplot 命令,图 1 给出了所生成的图形结果。
清单 1. 简单的 gnuplot 函数图
set samples 25set isosamples 26set title "Test 3D gnuplot"set contour baseset hidden3d offset 1splot [-12:12.01] [-12:12.01] sin(sqrt(x**2+y**2))/sqrt(x**2+y**2)
清单 1 充分显示了 gnuplot 的命令集是多么简单。采样速度和绘图密度是由 samples 和 isosamples 决定的,标题是由 title 参数为图形提供的。同时还启用了基本的等高线和隐线消除特性,最终的绘图是利用splot命令使用数学库内部的函数来创建的。结果如图 1 所示。
图 1. gnuplot 的一个简单绘图
![1cedcac0ef314f8a876f4ed2da697831.png](https://i-blog.csdnimg.cn/blog_migrate/4224857a2a3e94891848eea56b3ce8c4.jpeg)
除了创建函数图之外,gnuplot 还可以很好地对文件中包含的图形进行绘图。考虑如清单 2 所示的 x/y 数据对(这个文件的一个简短版本)。这个文件中给出的数据对表示一个两维空间中的 x 和 y 轴的数据。
清单 2. gnuplot 的示例数据文件(data.dat)
88 9979 9876 8960 85...60 22
如果希望在两维空间中绘制这些数据,并将每个数据点使用一条线连接起来,就可以使用清单 3 给出的 gnuplot 脚本。
清单 3. 对清单 2 中的数据进行绘图所使用的 Gnuplot 脚本
set title "Sample data plot"plot 'data.dat' using 1:2 t 'data points', "data.dat" using 1:2 t "lines" with lines
结果如图 2 所示。注意 gnuplot 自动给出了轴的刻度,但是如果需要标注图形的位置,就可以对其进行控制。
图 2. 在 gnuplot 中使用数据文件进行简单的绘图
![6f10411c92c242c3ef25d767b1f4ba15.png](https://i-blog.csdnimg.cn/blog_migrate/cc14d00574584615a0d4a4ab3c72b85a.jpeg)
Gnuplot 是一个很好的可视化工具,它非常出名,是很多 GNU/Linux 发行版的一部分。然而,如果希望进行基本的数据可视化和数值计算,那么 GNU Octave 可能是我们希望寻找的工具。
GNU Octave
GNU Octave 是一种高级语言,主要设计用来进行数值计算,它是 MathWorks 出品的 Matlab 商业软件的一个强有力的竞争产品。除了 gnuplot 所提供的简单命令集之外,Octave 还为进行数学编程提供了一种丰富的语言。我们甚至可以使用 C 或 C++ 语言编写自己的应用程序,然后与 Octave 进行交互。
Octave 最初是在 1992 年作为化学反应堆设计教科书的一个辅助软件而编写的。其作者希望能够帮助学生解决反应堆的设计问题,而不用调试 Fortran 程序。结果获得了一种非常有用的语言,并为解决数值问题提供了交互式环境。
Octave 可以以一种脚本化模式非交互地进行操作,或者通过 C 和 C++ 语言绑定进行操作。Octave 本身就有一种非常丰富的语言,该语言看起来与 C 语言非常类似,并有一个很大的数学库,包括信号和图像处理、音频处理以及控制理论所使用的一些特殊函数。
由于 Octave 使用了 gnuplot 作为其后端实现,因此使用 gnuplot 可以绘制的所有东西都可以使用 Octave 进行绘制。Octave 的确有一种更丰富的语言来进行计算,它有很多明显的优点,但是仍然有 gnuplot 的一些限制。
在下面这个 Octave-Forge Web 站点上提供的例子中(SimpleExamples),绘制了一个 Lorentz Strange Attractor。清单 4 给出了在使用 Cygwin 的 Windows 平台上 Octave 所使用的交互式对话框。这个例子展示了 lsode 的用法,这是一个常见的微分方程解算器。
清单 4. 使用 Octave 呈现 Lorentz Strange Attractor
GNU Octave, version 2.1.50Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 John W. Eaton.This is free software; see the source code for copying conditions.There is ABSOLUTELY NO WARRANTY; not even for MERCHANTIBILITY orFITNESS FOR A PARTICULAR PURPOSE. For details, type `warranty'.Please contribute if you find this software useful.For more information, visit http://www.octave.org/help-wanted.htmlReport bugs to .>> function y = lorenz( x, t )y = [10 * (x(2) - x(1));x(1) * (28 - x(3));x(1) * x(2) - 8/3 * x(3)];endfunction>> x = lsode("lorenz", [3;15;1], (0:0.01:25)');>> gset parametric>> gsplot x>>
图 3 给出的图是清单 4 中 Octave 代码的输出结果。
图 3. 使用 Octave 绘制的 Lorentz 图
![a451aa6d774f3d60c17040d6b4eb2655.png](https://i-blog.csdnimg.cn/blog_migrate/10c62496e6b4e67625e616934bffdd2d.jpeg)
GNU Octave(与 gnuplot 一致)可以使用 multiplot 特性在一个页面上呈现多个图形。使用这个特性,就可以定义要创建多少图形,然后使用subwindow 命令来定制特定的图形。在定义好子窗口之后,就可以正常地生成自己的图形,然后再跳到下一个子窗口中(如清单 5 所示)。
清单 5. 在 Octave 中生成多个图形
>> multiplot(2,2)>> subwindow(1,1)>> t=0:0.1:6.0>> plot(t, cos(t))>> subwindow(1,2)>> plot(t, sin(t))>> subwindow(2,1)>> plot(t, tan(t))>> subwindow(2,2)>> plot(t, tanh(t))
所生成的多图页面如图 4 所示。这是将相关图形搜集在一起进行比较和对比的一种很好的特性。
图 4. 使用 GNU Octave 绘制多图
![e7a2fabd3bf32b20373013496f64152d.png](https://i-blog.csdnimg.cn/blog_migrate/1199a91eb1b97caefe0fcbc3bd434d91.jpeg)
我们可以认为 Octave 是一种使用 gnuplot 作为后台实现来进行可视化的高级语言。它提供了丰富的数学库,是 Matlab 的一个很好的免费替换产品。可以很容易利用用户开发的用来进行语音处理、优化、符号计算等的包对它进行扩展。Octave 在某些 GNU/Linux 的发行版中都有,例如 Debian,也可以在使用 Cygwin 的 Windows 和 Mac OS X 上使用。
Scilab
Scilab 在启用数值计算和可视化方面都与 GNU Octave 非常类似。Scilab 是世界上广泛存在的工程和科学应用程序所使用的一种解释器和高级语言。
Scilab 诞生于 1994 年,它是由法国的https://mp.weixin.qq.com/cgi-bin/appmsg?t=media/appmsg_edit&action=edit&type=10&appmsgid=503170341&token=183721230&lang=zh_CN INRIA(Institut national de recherche en informatique et en automatique)和 ENPC(École Nationale des Ponts et Chaussées)设计的。从 2003 年开始 Scilab 开始由 Scilab Consortium 进行维护。
Scilab 包括一个很大的数学函数库,可以利用使用 C 和 Fortran 之类的高级语言编写的程序进行扩充。它还有重载数据类型和操作的能力。它包括一个集成的高级语言,不过这种语言与 C 语言稍微有些区别。
Scilab 中有很多工具包提供了 2-D 和 3-D 的图形动画、优化、统计、图标和网络、信号处理、混合动态系统模拟和仿真以及其他许多由社区所贡献的功能。
在大部分 UNIX 系统上都可以使用 Scilab,在较新的 Windows 操作系统上也可以使用。与 GNU Octave 一样, Scilab 也有很好的文档。由于它是一个欧洲的项目,因此还可以找到很多使用除英语之外的其他语言所编写的文档和文章。
在启动 Scilab 之后,就会显示一个窗口让我们可以与之进行交互(如图 5 所示)。
图 5. 与 Scilab 进行交互
![6bfb0037ff1fd7493e7f5dce0bef7eb3.png](https://i-blog.csdnimg.cn/blog_migrate/03157ee8e7bbcfefbe414b4084bc181c.jpeg)
在这个例子中,先是创建了一个向量(t),其值的范围从 0 到 2PI(步进大小为 0.2)。然后生成了一个 3-D 图形(使用 z=f(x,y), 或者说是 xi,yi 点处的一个表面)。图 6 给出了所生成的图形。
图 6. 图 5 中的命令所生成的 Scilab 图
![72e04ddd6fed5de3a9ef7e915613eba8.png](https://i-blog.csdnimg.cn/blog_migrate/84d5227e0e0e5271eb1a2dfbbbae6c08.jpeg)
Scilab 中包括很多库和函数,它们可以使用最少的复杂性来绘制图形。下面是一个生成简单三维柱状图的例子:
-->hist3d(5*(rand(5,5));
首先,rand(5,5) 会构建一个 5,5 大小的矩阵,其中包含了一些随机值(其最大值为 5)。这个矩阵被传递给函数 hist3d。所生成的柱状图如图 7 所示。
图 7. 生成随机的三维柱状图
![4f213a4cdf6245a1cd54a5d03ca42197.png](https://i-blog.csdnimg.cn/blog_migrate/a1f012654248d3887d2643de61886785.jpeg)
Scilab 和 Octave 非常类似。它们都具有很大的社区参与基础。Scilab 是使用 Fortran 77 编写的,而 Octave 则是使用 C++ 编写的。Octave 使用 gnuplot 来实现可视化;Scilab 则提供了自己的库。如果非常熟悉 Matlab,那么 Octave 就是一个很好的选择,因为它努力实现了与 Matlab 的兼容性。Scilab 包括了很多数学函数,因此非常适合进行信号处理。如果仍然不确定要使用哪个工具,可以全部尝试一下。它们都是很好的工具,可以使用它们来完成不同的任务。
MayaVi
MayaVi 在梵语中的意思是魔术师,它是一种数据可视化工具,绑定了具有强大可视化工具包(VTK)的 Python 来进行图形化显示。MayaVi 还提供了一个使用 Tkinter 模块开发的图形用户界面(GUI)。Tkinter 是一个 Tk 界面,通常都与 Tcl 一起使用。
MayaVi 最初是为 Computational Fluid Dynamics(CFD)作为一个可视化工具而开发的。当人们认识到它在其他领域中的效用之后,它就作为一种通用科学数据可视化工具重新进行了设计。
MayaVi 背后的魔力来自于 VTK。VTK 是一个用来进行数据可视化和图像处理的开放源码系统,它在科学社区中被广泛地使用。VTK 通过为 Tcl/Tk、Java 编程语言以及 Python 加上 C++ 库所提供的脚本化接口而封装了很多功能。VTK 在很多操作系统上都是可移植的,包括 UNIX、Windows 和 MAC OS X。
围绕 VTK 的 MayaVi 外壳可以作为一个 Python 模块从其他 Python 程序中导入,并通过 Python 解释器来编写脚本。MayaVi 所提供的 tkinter GUI 允许进行过滤器的配置和应用,以及在可视化基础上渲染一些灯光效果。
图 8 是在 Windows 平台上使用 MayaVi 进行可视化的一个例子。
图 8. 使用 MayaVi/VTK 显示的 3-D 可视化(心脏 CT 扫描图)
![e325e5ff0dd1809357e4e010592f0e32.png](https://i-blog.csdnimg.cn/blog_migrate/4e2699b663a7d917e853a9868a15dc83.jpeg)
MayaVi 是在 Python 脚本语言中扩展 VTK 的一个有趣例子。
Maxima
Maxima 是一个符号和数值计算程序,它是 Octave 和 Scilab 的血液。Maxima 最初的开发团队开始于 19 世纪 70 年代的 MIT(麻声理工学院),现在还继续在维护。最初的版本(一个计算机代数系统)名为 DOE Macsyma,它开辟了后来开发的更知名的应用程序(例如 Mathematica)的道路。
Maxima 提供了一组所期望的功能集(例如微积分、解析线性系统和非线性等式集)以及符号计算能力。在 Maxima 中还可以找到 Lisp 的一些线索(从引用之类的函数、map 和 apply 中)。Maxima 是使用 Lisp 编写的,可以在 Maxima 会话中执行 Lisp 代码。
Maxima 具有很好的在线帮助系统,它是基于超文本的。例如,如果希望了解某个特定的 Maxima 函数是如何工作的,那么就可以简单地输入example(desolve),然后它会提供很多样例用法。
Maxima 还有一些有趣的特性,例如规则和模式。这些规则和模式都是由用来简化表达式的程序所使用的。规则可以用于交换和非交换代数。
Maxima 与 Octave 和 Scilab 非常类似:其中解释器都可以用来与用户进行交互,结果都会直接在同一个窗口中提供,或者也可以在另外一个窗口中进行显示。在图 9 中,请求绘制一个简单的 3-D 图形。
图 9. 与 Maxima 进行交互
![5246db8ea1b273c07fa871075bf43060.png](https://i-blog.csdnimg.cn/blog_migrate/86a764aa741c59aeaa1621e4cb5a343c.jpeg)
所生成的图形如图 10 所示。
图 10. 图 9 的命令所生成的 Maxima 图形
![04ec8d30e9eab6d858ff86ed7646a60d.png](https://i-blog.csdnimg.cn/blog_migrate/57209c37df6ff625290f77893163cc90.jpeg)
展望
在本文中介绍了几个开放源码 GNU/Linux 可视化工具。其他有用的工具还包括 Gri、PGPLOT、SciGraphica、plotutils、NCAR Graphics 和 ImLib3D。这些都是开放源码的,也就是说您可以看到它们是如何工作的;如果愿意,也可以对它们进行修改。另外,如果您正在寻找一个很好的图形仿真环境,那就请查看一下与 OpenGL 一起使用的 Open Dynamics Engine(ODE)。
具体的需要决定了哪种工具最适合使用。如果希望使用一个具有很多可视化算法的强大的可视化系统,那么 MayaVi 就是所要寻找的工具。对于具有可视化功能的数值计算来说,GNU Octave 和 Scilab 都非常适合。如果需要符号计算能力,那么 Maxima 就是一个非常好的选择。最后(但并非不重要),如果所需要的只是一些基本的绘图功能,那么 gnuplot 就可以很好地满足这一需求。