贡献者: addis
MatPlot 是笔者写的一个轻量的 C++ 科学绘图函数库,可以在 Windows 系统下使用,尤其是 Visual Studio Code。其函数与 Matlab 中的画图函数相似,目前主要提供的函数有例如 figure()
,close()
,plot()
,scatter()
,clf()
,axis()
等,暂时不支持 3D 画图。GitHub 页面点这里。
我们先介绍用法,安装说明见最后。
注意 MatPlot 的所有函数都具有 namespace MatPlot
。MatPlotInit()
和 MatPlotClose()
分别是初始化和退出 MatPlot 的命令,在程序中分别只能使用一次。所有画图函数必须在调用 MatPlotInit()
之后调用 MatPlotClose()
之前使用。为了让程序不立即终止,可以用 Sleep()
函数暂停程序,输入的数字是暂停的毫秒数。
plot()
函数的完整格式为
plot(double *px, double *py, int N, char color = 'a');
其中 px
和 py
既可以是数组也可以是指针,N
是 px
和 py
的长度,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);
运行结果如下
注意散点的颜色变成了橙色。
figure()
函数用于生成新的画图框,其的格式为
figure(int FigNo = -1);
默认值 -1
的情况下 figure()
按照顺序给画图框编号。如果输入 FigNo
,则生成编号为 FigNo
的画图框。figure()
函数的另一个功能是指定当前画图框(Current Figure)为 FigNo
。plot()
,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);
其中 xmin
,xmax
分别为 x 轴的最小和最大值,ymin
和 ymax
分别为 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
是显示的小数位数(目前还不支持科学计数法)。
目前坐标点和坐标显示的规划功能并不像 Matlab 中的那么完善。先来看一段画正弦函数的代码
可以发现 x 轴的坐标点安排不合理。我们可以用 xticks()
函数重新设置。在 plot()
函数下方插入
xticks(0, 6.2, 32, 0, 5, 1);
即设置最小的坐标点为 0,最大的为 6.2,共有 32 个坐标点,从第一个开始,每隔五个打印一个坐标,并保留 1 位小数。运行结果变为
为提供更友好的用户界面,MatPlot 在初始化的时候生成并隐藏了控制面板,可以用于临时调用 MatPlot 的常用函数。用 show_control()
函数可以显示控制面板。用 hide_control()
可以将其再次隐藏。为了使用控制面板,可以在程序中用 Sleep()
函数。
控制面板中标有函数名的按钮用于调用对应的函数,按钮旁的文本框用于输入对应函数的参数。其中 plot(...)
和 scatter(...)
按钮分别绘制 DataNo*sin(x)
的函数图和散点图。选择或取消 autoaxis(...)
选项相当于调用 axis_auto()
和 axis_manual()
函数。CurrentFig
显示当前画图框的编号(注意 0 代表 figure1,1 代表 figure2)按 OK 或 Cancel 退出 MatPlot。
这里介绍如何在 Visual Studio 2017 中 “安装” MatPlot.
首先用 Desktop Wizard 新建一个控制台工程
在 Wizard 中取消预编译(Precompiled Header)选项,选择空项目(Empty Project)按确定生成控制台程序(Console Application)。
生成工程以后,我们把 MatPlot.h, MatPlot.lib 和 MatPlot.dll(注意这些文件有 32bit 和 64bit 两个版本)复制到工程文件夹(...\ MatPlotTest\ MatPlotTest)中。然后在菜单栏打开工程,属性
在属性对话框中的 Linker,Input,Additional Dependencies 的右边按下拉按钮
编辑,添加 MatPlot.lib; 确定。
在 Solution Explorer 中对 “头文件” 文件夹按右键添加已存在项目
选择刚才复制的 MatPlot.h 头文件。我们再在 “源文件” 文件夹中添加一个新项目,在弹出的对话框中选择 .cpp,输入文件名为 MatPlotTest.cpp
现在就可以在 cpp 文件中输入上文的例程代码并编译运行了。注意使用 MatPlot 的源文件中必须添加 Windows.h
和 MatPlot.h
头文件。