Visual C++ 的简单画图库 MatPlot

                     

贡献者: addis

图
图 1:MatPlot 图标

   MatPlot 是笔者写的一个轻量的 C++ 科学绘图函数库,可以在 Windows 系统下使用,尤其是 Visual Studio Code。其函数与 Matlab 中的画图函数相似,目前主要提供的函数有例如 figure()close()plot()scatter()clf()axis() 等,暂时不支持 3D 画图。GitHub 页面点这里

   我们先介绍用法,安装说明见最后。

1. 例 1:最简单的例子

图
图 2:最简单的例子(控制台程序)
图
图 3:结果 1

   注意 MatPlot 的所有函数都具有 namespace MatPlotMatPlotInit()MatPlotClose() 分别是初始化和退出 MatPlot 的命令,在程序中分别只能使用一次。所有画图函数必须在调用 MatPlotInit() 之后调用 MatPlotClose() 之前使用。为了让程序不立即终止,可以用 Sleep() 函数暂停程序,输入的数字是暂停的毫秒数。

   plot() 函数的完整格式为 plot(double *px, double *py, int N, char color = 'a'); 其中 pxpy 既可以是数组也可以是指针,Npxpy 的长度,color 是颜色,默认值 'a' 代表自动颜色,这种模式下每使用一次 plot()(或 scatter),颜色就会改变一次。color 可选 'r'(red), 'g'(green), 'b'(blue), 'y'(yellow), 'm'(magenta), 'c'(cyan), 'k'(black), 'w'(white)。 plot() 默认在 “当前画图框”(见下文)上绘制,如果没有画图框,则自动生成画图框 figure1。

   scatter() 函数用于画散点图,使用格式与 plot() 完全相同。如果在例 1 中的 plot() 下面加上代码 scatter(x, y, N); 运行结果如下

图
图 4:结果 2

   注意散点的颜色变成了橙色。

   figure() 函数用于生成新的画图框,其的格式为 figure(int FigNo = -1); 默认值 -1 的情况下 figure() 按照顺序给画图框编号。如果输入 FigNo,则生成编号为 FigNo 的画图框。figure() 函数的另一个功能是指定当前画图框(Current Figure)为 FigNoplot()scatter() 以及其他许多函数都是对当前画图框进行操作。

   close() 函数用于关闭画图框,其格式为 close(int FigNo = -1); 默认值 -1 的情况下,close() 关闭当前画图框,指定 FigNo 时关闭指定的画图框。如果 close() 关闭的是当前画图框(无论指定 FigNo 与否),则当前画图框自动变为下一个编号更大的画图框,如果不存在,则自动变为下一个编号更小的画图框。另外,单击画图框右上角的 x 按钮与使用 close() 效果相同。

   close_all() 函数用于关闭所有画图框。

   clf() 函数(clean figure)用于清空当前画图框,并把坐标范围设为 0 到 1。

   axis() 函数用于调整坐标范围,格式为 axis(double xmin, double xmax, double ymin, double ymax); 其中 xminxmax 分别为 x 轴的最小和最大值,yminymax 分别为 y 轴的最小和最大值。

   axis_auto() 用于设置坐标轴为自动调节(新生成的画图框默认为自动调节),如果 plot() 或者 scatter() 函数的数据点超出当前的坐标范围,坐标轴会自动调整以包含所有数据点。

   axis_manual() 用于设置坐标范围固定不变。

   xticks()yticks() 函数用于设置 x 轴和 y 轴的坐标点,格式都为 xticks(double tickmin, double tickmax, int Nticks = 26, int txtstart = 0, int txtspace = 5, int Ndigits = 2); 其中 tickmin 是和 tickmax 分别是最小和最大坐标点的坐标,Nticks 是坐标点的个数,txtspace 是每几个坐标点下方显示坐标,txtstart 是从第几个坐标点开始显示坐标,Ndigits 是显示的小数位数(目前还不支持科学计数法)。

2. 例 2:设置坐标

   目前坐标点和坐标显示的规划功能并不像 Matlab 中的那么完善。先来看一段画正弦函数的代码

图
图 5:例 2
图
图 6:运行结果为

   可以发现 x 轴的坐标点安排不合理。我们可以用 xticks() 函数重新设置。在 plot() 函数下方插入 xticks(0, 6.2, 32, 0, 5, 1); 即设置最小的坐标点为 0,最大的为 6.2,共有 32 个坐标点,从第一个开始,每隔五个打印一个坐标,并保留 1 位小数。运行结果变为

图
图 7:运行结果 2

   为提供更友好的用户界面,MatPlot 在初始化的时候生成并隐藏了控制面板,可以用于临时调用 MatPlot 的常用函数。用 show_control() 函数可以显示控制面板。用 hide_control() 可以将其再次隐藏。为了使用控制面板,可以在程序中用 Sleep() 函数。

图
图 8:控制面板

   控制面板中标有函数名的按钮用于调用对应的函数,按钮旁的文本框用于输入对应函数的参数。其中 plot(...)scatter(...) 按钮分别绘制 DataNo*sin(x) 的函数图和散点图。选择或取消 autoaxis(...) 选项相当于调用 axis_auto()axis_manual() 函数。CurrentFig 显示当前画图框的编号(注意 0 代表 figure1,1 代表 figure2)按 OK 或 Cancel 退出 MatPlot。

3. 安装说明

   这里介绍如何在 Visual Studio 2017 中 “安装” MatPlot.

   首先用 Desktop Wizard 新建一个控制台工程

图
图 9

   在 Wizard 中取消预编译(Precompiled Header)选项,选择空项目(Empty Project)按确定生成控制台程序(Console Application)。

图
图 10

   生成工程以后,我们把 MatPlot.h, MatPlot.lib 和 MatPlot.dll(注意这些文件有 32bit 和 64bit 两个版本)复制到工程文件夹(...\ MatPlotTest\ MatPlotTest)中。然后在菜单栏打开工程,属性

图
图 11

   在属性对话框中的 Linker,Input,Additional Dependencies 的右边按下拉按钮

图
图 12

   编辑,添加 MatPlot.lib; 确定。

图
图 13

   在 Solution Explorer 中对 “头文件” 文件夹按右键添加已存在项目

图
图 14

   选择刚才复制的 MatPlot.h 头文件。我们再在 “源文件” 文件夹中添加一个新项目,在弹出的对话框中选择 .cpp,输入文件名为 MatPlotTest.cpp

图
图 15

   现在就可以在 cpp 文件中输入上文的例程代码并编译运行了。注意使用 MatPlot 的源文件中必须添加 Windows.hMatPlot.h 头文件。

                     

© 小时科技 保留一切权利