# plotdemo
**Repository Path**: wu-xiao-yao/plotdemo
## Basic Information
- **Project Name**: plotdemo
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 1
- **Created**: 2023-10-31
- **Last Updated**: 2023-10-31
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# C++ 数据可视化 MathGL 使用指南
## 效果演示
## 搭建环境与依赖项
- [x] Windows10 **64位**
- [x] VS2017
- [ ] Zlib1.2.11(**已编译好的可用版本已集成在我后面的项目链接里**)
- [ ] libpng1.6.37(**已编译好的可用版本已集成在我后面的项目链接里**)
- [ ] OpenCV3.5(Optional,只是为了显示图像而用,也**可替换成其他的GUI库**)
## VS2017环境搭建
MathGL的官网在[sourceforge](mathgl.sourceforge.net)上,不得不说通过sourceforge下载文件真是等得蛋疼(~~虽然最大同性交友平台*gayhub*也好不到哪去~~)。要命的是,在windows上的Cmake项目管理要比Linux上复杂得多,为了解决Windows上用Cmake编译出最终的可用库,笔者真的是耗尽了心血... ...复杂的血泪史就不详细描述了,我已经把编译成功的库文件及其依赖项放进了工程中以便下载,见后文。下面进行一个测试项目的VS环境搭建。
1. 首先建立空项目。
2. 增加包含目录 OpenCV的、以及`libmathgl/include`这个目录(就在工程中)
3. 增加库文件所在目录 OpenCV的、以及`libmathgl`这个目录(就在工程中)
4. 增加链接器输入文件 `mgl-static.lib`、`opengl32.lib`、`libpng16.lib`、`zlib.lib`、`opencv_world345.lib`,其中`opengl32.lib`的所在目录不用添加,系统自带。如图

5. 在`项目`->`属性`->`C/C++`->`预处理器`中添加预处理器定义`_CRT_STDIO_ISO_WIDE_SPECIFIERS`、`MGL_STATIC_DEFINE`,如图
。
其中`MGL_STATIC_DEFINE`与链接器输入文件`mgl-static.lib`对应,指明以静态方式链接。
6. 添加Cpp文件,编写示例代码如下
```c++
int main(int, char **)
{
using namespace cv;
//创建gr对象,指定图像大小为800x500,kind=0说明不使用OpenGL
mglGraph gr(0,800,500);
//数据准备
std::vector datavec1{ 1,2,3,4,5,6 ,7,};
std::vector 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(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](https://gitee.com/Leowootsi/plotdemo)
以上就是基本的使用过程,除了plot之外,还有bar、mark、surf等等各种数据可视化方式,并且支持设置线形、颜色、Axis、label等等各种属性,与==matlab==以及python的==matplotlib==十分类似。官方的教程在[http://mathgl.sourceforge.net/doc_en/index.html](http://mathgl.sourceforge.net/doc_en/index.html),只有英文版本。
实际上,还有其他可选的C++数据可视化库,比如Qt的QCharts、matplotlib的C++接口,以及SERN的root库(过于学术了,这个太难了,真的太难了)。另外有一个比较有趣的是某位大神在gayhub上分享了一个将QCharts伪装成matplotlib的项目,名为[madplotlib](https://github.com/madplotlib/madplotlib),号称是*looks, tastes and smells like matplotlib*,实际用起来确实挺**mad**的。
如有问题,请留言,欢迎批评指正与交流。邮箱地址:Leowootsi@outlook.com。