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 头文件。


致读者: 小时百科一直以来坚持所有内容免费,这导致我们处于严重的亏损状态。 长此以往很可能会最终导致我们不得不选择大量广告以及内容付费等。 因此,我们请求广大读者热心打赏 ,使网站得以健康发展。 如果看到这条信息的每位读者能慷慨打赏 10 元,我们一个星期内就能脱离亏损, 并保证在接下来的一整年里向所有读者继续免费提供优质内容。 但遗憾的是只有不到 1% 的读者愿意捐款, 他们的付出帮助了 99% 的读者免费获取知识, 我们在此表示感谢。

                     

友情链接: 超理论坛 | ©小时科技 保留一切权利