C++数据可视化MathGL使用简示

C++ 数据可视化 MathGL 使用指南

效果演示

搭建环境与依赖项

  • Windows10 64位
  • VS2017
  • Zlib1.2.11(已编译好的可用版本已集成在我后面的项目链接里
  • libpng1.6.37(已编译好的可用版本已集成在我后面的项目链接里
  • OpenCV3.5(Optional,只是为了显示图像而用,也可替换成其他的GUI库

VS2017环境搭建

MathGL的官网在sourceforge上,不得不说通过sourceforge下载文件真是等得蛋疼(虽然最大同性交友平台gayhub也好不到哪去)。要命的是,在windows上的Cmake项目管理要比Linux上复杂得多,为了解决Windows上用Cmake编译出最终的可用库,笔者真的是耗尽了心血… …复杂的血泪史就不详细描述了,我已经把编译成功的库文件及其依赖项放进了工程中以便下载,见后文。下面进行一个测试项目的VS环境搭建。

  1. 首先建立空项目。

  2. 增加包含目录 OpenCV的、以及libmathgl/include这个目录(就在工程中)

  3. 增加库文件所在目录 OpenCV的、以及libmathgl这个目录(就在工程中)

  4. 增加链接器输入文件 mgl-static.libopengl32.liblibpng16.libzlib.libopencv_world345.lib,其中opengl32.lib的所在目录不用添加,系统自带。如图

    ]

  5. 项目->属性->C/C++->预处理器中添加预处理器定义_CRT_STDIO_ISO_WIDE_SPECIFIERSMGL_STATIC_DEFINE,如图

    其中MGL_STATIC_DEFINE与链接器输入文件mgl-static.lib对应,指明以静态方式链接。

  6. 添加Cpp文件,编写示例代码如下

    int main(int, char **)
    {
        using namespace cv;
        //创建gr对象,指定图像大小为800x500,kind=0说明不使用OpenGL
        mglGraph gr(0,800,500);
        
        //数据准备
        std::vector<float> datavec1{ 1,2,3,4,5,6 ,7,};
        std::vector<float> datavec2{ 2,4,9,1,6,8, 8,};
        mglData x(datavec1);
        mglData y(datavec2);
    
        //通过给定数据计算合适的显示范围
        auto minx = *std::min_element(datavec1.begin(), datavec1.end());
        auto miny = *std::min_element(datavec2.begin(), datavec2.end());
        auto maxx = *std::max_element(datavec1.begin(), datavec1.end());
        auto maxy = *std::max_element(datavec2.begin(), datavec2.end());
        auto x_margin = (maxx - minx) / datavec1.size();
        auto y_margin = (maxy - miny) / datavec2.size();
        
        gr.SetRanges(minx - x_margin, maxx + x_margin, miny - y_margin, maxy + y_margin);
        //显示坐标轴
        gr.Axis();
        //显示图片框
        gr.Box();
        //Plot、Barh、Mark等等可选
        gr.Plot(x, y, "y+");
    
        //用OpenCV显示图片
        Mat pic(gr.GetHeight(), gr.GetWidth(), CV_8UC3);
        pic.data = const_cast<uchar*>(gr.GetRGB());
        imshow("test", pic);
    
        //保存图片
        std::cout << "write image as \"test.png\"." << std::endl;
        gr.WritePNG("test.png");  // Don't forget to save the result!
        
        waitKey();
        return 0;
    }
  7. 在确认编译选项为Release 、 x64的情况下编译,即可看到示例效果。

一些说明

本项目发布到gitee,避免了百度云的贫穷限速与某hub的科学上网。链接:https://gitee.com/Leowootsi/plotdemo

以上就是基本的使用过程,除了plot之外,还有bar、mark、surf等等各种数据可视化方式,并且支持设置线形、颜色、Axis、label等等各种属性,与matlab以及python的matplotlib十分类似。官方的教程在http://mathgl.sourceforge.net/doc_en/index.html,只有英文版本。

实际上,还有其他可选的C++数据可视化库,比如Qt的QCharts、matplotlib的C++接口,以及SERN的root库(过于学术了,这个太难了,真的太难了)。另外有一个比较有趣的是某位大神在gayhub上分享了一个将QCharts伪装成matplotlib的项目,名为madplotlib,号称是looks, tastes and smells like matplotlib,实际用起来确实挺mad的。

如有问题,请留言,欢迎批评指正与交流。邮箱地址:Leowootsi@outlook.com。

  • 3
    点赞
  • 62
    收藏
    觉得还不错? 一键收藏
  • 17
    评论
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值