Skip to content

跨平台多语言科学绘图库初探

跨平台多语言科学绘图库初探 published on No Comments on 跨平台多语言科学绘图库初探

关键词:开源,跨平台,科学绘图,c++画图,plot,MathGL, PLplot

起因

一直以来都是用python配合matplotlib来进行科学绘图。其实所谓的绘图,目前主要用的也就是在坐标轴上描点。python的简洁、优雅让我很喜欢。matplotlib功能也非常强大易用,和matlab比毫不逊色,可惜只支持python。最近突然想用c++来做这样的绘图工作。其实也没有什么特别的需求一定要用c++做这种吃力不讨好的工作。用c/c++来计算,把结果导入python来绘图应该是最好的选择,而且现在也有很多c++/python混合编程的方案。可能我天性喜欢折腾吧,不管怎么说,周末在家无事,多学点东西也是好的。

于是在网上搜了一下相关的信息。Qt应该是可以做这个工作,不过等以后需要做gui了再来学吧。OpenGL,VTK?别开玩笑了,只是画个坐标而已。有一个叫ROOT的库好像可以画图,不过那个库太大了,啥功能都有。找来找去有两个库是比较合适的,就是MathGL和PLplot,它们都可以画出很漂亮的图,并且提供多种语言的绑定(当然也包括python)。可是问题是,对于这两个库,网上的资料太少了,中文资料更是几乎没有(因为确实没必须用它们啊,有matlab和matplotlib为什么不用?)。而且估计库的开发维护人员也少,导致文档写的并不是很好。如果你照着文档来做,估计一个例子都编译通不过。所以就想把自己调试的一些过程记录下来。并不是说以后一定会用到这两个库,但确实通过这次的折腾,让我对linux底下编译又有了一些新的认识。

安装

我先试的是PLplot,进到它的主页:http://plplot.sourceforge.net/index.php,看document,然后安装方法跳到26章,然后一大堆cmake的东西扑面而来,然后我就晕了。我说他们也太高估我们这些菜鸟了吧。然后到处乱转,在一个很不起眼的地方链接到了它的wiki站:http://www.miscdebris.net/plplot_wiki/index.php?title=Main_Page,总算是找到一个教你step by step的地方。找到了Compiling plplot on GNU-Linux,按它的流程做,尼玛根本就不行啊,主要是cmake什么的根本没用过啊。自己摸索了半天,概括出以下可行步骤:

1. 假设当前你的用户名是yourname,准备在/home/yourname/plplot下来编译安装,把下载的程序包拷贝过来,比如当前是5.9.9版本,那么程序包的名字应该是:plplot-5.9.9.tar.gz
2. cd /home/yourname/plplot,进入当前目录
3. tar -zxvf plplot-5.9.9.tar.gz,解压程序包
4. mkdir build_dir,生成编译目录
5. cd build_dir,进入编译目录
6. cmake ../plplot-5.9.9 >& cmake.out,运行cmake,生成makefile文件,并将标准(错误)输出重定向到cmake.out
7. make
8. sudo make install (这两个没什么好说的了)

编译完成后,可以看出plplot把相关的库拷到了/usr/local/lib,而把头文件拷到了/usr/local/include/plplot,注意这里有个local,和linux标准库的位置不一样。

接下来就是编译例子文件了,源程序中给出了好几十个例子文件,文档中居然让我一个make一起编译。我想自己试着一个个编译,不出意外不成功。在网上找了一些办法,都是过期的老黄历了。我很伤心,于是把目光投向了MathGL

MathGL在教怎么安装怎么运行示例的文档上,比PLplot好那么一丁点。按照之前安装PLplot的方法装了一次,成功。然后编译例子程序,显示失败。读了一下文档,发现如果要显示窗口,它是要用到qt或是glut库的,其实这点在安装文档里面说的很清楚了,只是之前没懂是怎么回事,不过坑爹的是文档里面的格式其实是错的,在cmake后面,-D和enable-all之间是没有空格的。重新编译一遍,发现好多依赖库需要装,我现在不用那么多,所以就先试了试:cmake -Denable-qt=on,因为我之前装过qt库,所以很顺利的编译成功。

编译运行例子程序

安装好了,关键是要程序能跑的通。我首先试的是MathGL,在文档中的Basic usage这个section里面,它讲到了几种绘图的方式,目前我需要用要的主要是第一种,采用MathGL windows模式。这种方法需要用到一些辅助库,比如qt或是glut。以qt为例,因为前面编译安装的时候加了enable-qt,所以可以用这种方法。在头文件中需要包含#include <mgl2/qt.h>,如果之前编译安稳的时候没有enable-qt,这里会提示找不到qt.h。最简单的示例程序如下

#include &lt;mgl2/qt.h>
int sample(mglGraph *gr)
{
  gr-&gt;Rotate(60,40);
  gr-&gt;Box();
  return 0;
}
//-----------------------------------------------------
int main(int argc,char **argv)
{
  mglQT gr(sample,"MathGL examples");
  return gr.Run();
}

然后按照文档里面的要求,包含mgl-qt和mgl库,g++ test.cpp -lmgl-qt -lmgl。然后呢?当然不能编译了。琢磨了半天,找到问题所在。也就是我之前所说,编译安装的时候,头文件目录和库目录都位于/usr/local/底下,可是系统默认的是/usr/,所以会找不到。解决办法就是把这两个目录包含进来就可以了

g++ test.cpp -o test -lmgl-qt -lmgl -L/usr/local/lib/ -I/usr/local/include/

总算编译成功,应该可以运行了吧。输入./test,提示找不到运行库。这次就很好理解了,运行库也不在系统默认的目录内。解决方法有两个:1. 配置/etc/ld.so.conf,指定动态库搜索路径(就是添加一行/usr/local/lib),然后运行ldconfig使配置生效。 2. 编译时指定动态库路径。这里采用第二种办法

g++ test.cpp -o test -lmgl-qt -lmgl -L/usr/local/lib/ -I/usr/local/include/ -Wl,-R /usr/local/lib

搞定!用同样的办法可以成功编译运行PLplot的示例文件。

后记:

这篇博文不是使用这两个库的教程,只是做个笔记记录下来如何编译安装以及运行例子程序的一些心得,因为文档实在是有很多问题。看来这个运行起来真的还是挺折腾,不由得感慨,还是matplotlib方便啊……