goldsunC
让我们一起进步吧!
使用Matlab绘图
图像是结果的一种可视化表现,它能直观的体现你的结果,并且能体现你获得结果的准确性,在当前的大数据时代,在做数据分析的时候,将其可视化可以直观多维的展示数据,可以让人们更好的发现并且记住数据的特征,因此很多时候掌握一些绘图方法是非常重要的,而使用MATLAB可以非常简单的进行绘图(当然还有很多其它工具可供使用),下文是我所了解的一些基本绘图方法的整理,其中很多很多内容非常基础,希望对你能有些帮助。二维作图
二维图像是我们在学习过程中经常会接触到的图像,比如在做数学题目时随手画出的一个正弦曲线,这个图像往往是我们根据它的函数做出来的,事实确是这样,在我们学习过程中画出来的每一个图像几乎都是函数,反过来说,每一个函数都对应着它自己的图像,我们能画出来的二维图像往往是一个一元函数即二元方程,在Matlab中做二维图像也是这样,我们根据一个函数来画出它的图像,不过要注意的一点是, 在Matlab画图的过程中,它并不认识你给出的那个函数,它要做的仅仅是把你给出的函数上的点连成线而已。- plot和fplot
plot()
和
fplot()
函数,其中,plot的经常使用的方法有下面三种:
one plot(x)
two plot(x,y,参数)
three plot(x1,y1,x2,y2,...,xn,yn)
y = [5,10,15,20]
z = [100,200,300,400]
x =y+z*i
//这里的x经过此定义将会被认为是一个复数变量
//图像将会以实部即y为横坐标,虚部即z为纵坐标作图
对于第二种形式就更好理解了,往往其中的x、y都为一维数组,其实y也就是x对应的函数值,
后边的参数用于指定曲线的线形、颜色和数据点标记,如下:
x = [0:0.01:10]
y = sin(x)
plot(x,y,'-r*')

-r*
分别为曲线线性、颜色、数据点标记,其中参数的一些具体属性如下表所示:
线形 | 颜色 | 数据点标记 |
---|---|---|
'-' : 实线 | 'k' : 黑色 | * : 星号 |
':' : 虚线 | b : 蓝色 | o : 圆圈 |
'-.' : 点划线 | c : 蓝绿色 | s : 方块 |
'--' : 双划线 | g : 绿色 | p : 五角星 |
m : 洋红色 | ^ : 朝上三角符号 | |
r : 红色 | X : 叉 | |
w : 白色 | + : + | |
y : 黄色 | d : 菱形 | |
v : 朝下三角符号 | ||
< : 朝左三角符号 | ||
> : 朝右三角符号 | ||
H : 六角形 |
hold on
命令就行了,关于它后文会有介绍。而关于fplot,其基本使用方法如下:
one fplot(f,lims,参数)
two fplot(funx,funy,tlims,参数)
fplot(@(x)sin(x),[0,10],'-r')

fplot(@(t)t.*sin(t),@(t)t.*cos(t),[0,10*pi],'-r')

其它形式下的二维曲线图
上文举例说明了最基础最常用的两个做二维曲线的函数,实际上,二维图形的种类还有很多,不光只有一根线构成的曲线图,还有各种统计图、坐标图等等,相应的在Matlab中也有画它们图形的方法,下面是其它几种图形作图方法(非全部):- 对数坐标图
semilogx(x1,y1,'参数',x2,y2,'参数'...)
semilogy(x1,y1,'参数,x2,y2','参数'...)
loglog(x1,y1,'参数',x2,y2,'参数'...)
- 极坐标图
polar(theta,rho,'参数')
- 条形图
bar(y,style)
bar(x,y,style)
x = [2018,2019,2020]
y = [10,20,30,40,50;
10,20,30,40,50;
10,20,30,40,50];
bar(x,y)

'grouped'
:簇状分组,
'stacked'
:堆积分组。第二个,x存储横坐标,y存储数据,y的行数必须与向量x的长度相同。选项style用于指定分组排列模式。具体效果请自行练习查看。
- 直方图
hist(y)
hist(y,x)
rose(theta[],x)
- 面积类图形
pie(x,explode)
score = [10,25,3,18,41]
ex = [0,0,0,0,1]
pie(score,ex)

- 散点类图形
scatter(x,y,选项,'filled')
t = 0:pi/50:2*pi
x = 16*sin(t).^3
y = 13*cos(t)-5*cos(2*t)-2*cos(3*t)-cos(4*t)
scatter(x,y,'rd','filled')

- 矢量类图形
quiver(x,y,u,v)
已知向量A、B,求A+B,并用矢量图表示。
A = [4,5]; B = [-10,0]; C = A+B;
hold on quiver(0,0,A(1),A(2));
quiver(0,0,B(1),B(2));
quiver(0,0,C(1),C(2));
text(A(1),A(2),'A');text(B(1),B(2),'B');
text(C(1),C(2),'C')
axis([-12,6,-1,6])
grid on

- 进阶:双Y轴绘图
plotyy()
x = [0:0.01:20]
y1 = 200*exp(-0.05*x).*sin(x)
y2 = 0.8*exp(-0.5*x).*sin(10*x)
plotyy(x,y1,x,y2)

三维作图
在上文的二维作图示例中我们可以知道二维作图的基本方法,而有时候二维的图形满足不了我们的需要,这个时候就需要做一些三维图像了,而三维图像里边除了包含曲线作图之外还包含曲面作图。三维曲线
在二维曲线作图里边我们主要使用的函数是plot
和
fplot
函数,而在三维曲线作图里面我们使用的是
plot3
和
fplot3
函数,其不但长得像,功能也是差不多的,只不过是做了扩展而已。
- plot3和fplot3
one plot3(x,y,z,参数)
two plot(x1,y1,z1,x2,y2,z2,...,xn,yn,zn)
x = [0:0.01:10]
y = x
z = sin(x)
plot3(x,y,z,'-r')

t = [0:0.1:10*pi]
x = sin(t)+t.*cos(t)
y = cos(t)-t.*sin(t)
z = tplot3(x,y,z)

对于plot3函数来讲,它的参数x,y,z不止可以是一维数组,实际上:
- 参数x、y、z是同型矩阵时,以x、y、z对应列元素绘制曲线,曲线条数等于矩阵列数。
- 参数x、y、z中有向量,也有矩阵时,向量的长度与矩阵相符。
fplot3(funx,funy,funz,tlims)
三维曲面
在做三维曲面图的时候,第一步往往是生成一个平面网格,这个平面网格是什么东西呢,其实就是用矩阵X、Y分别存储每一个小矩形顶点的x坐标与y坐标,矩阵X、Y就是该矩形区域的xy平面网格坐标矩阵:
底面
出来,本来x、y都是一维向量,它们也就是只能当两根轴,这个时候用新的两个X、Y矩阵来把空间坐标系的二维地面给表示出来,这样的话每一个[X,Y]就都能对应一个Z了,就是这个意思。在MATLAB中,产生平面区域内网格坐标矩阵有两种方法:
- 1.利用矩阵运算生成:
X = ones(size(y))*x
Y = y*ones(size(x))
- 2.利用meshgrid函数生成:
[X,Y] = meshgrid(x,y)
- 绘制三维曲面的函数
mesh(x,y,z,c)
surf(x,y,z,c)
mesh(z,c)
surf(z,c)
带等高线的三维网格曲面函数meshc
带底座的三维网格曲面函数meshz
具有等高线的曲面函数surfc
具有光照效果的曲面函数surfl
这些函数使用都和mesh还有surf大致相同,可自行练习了解。
//用4种方式绘制函数z=(x-1)^2+(y-2)^2-1的曲面图
//其中,x=[0,2],y=[1,3]
[x,y]=meshgrid(0:0.1:2,1:0.1:3)
z=(x-1).^2+(y-2).^2-1
subplot(2,2,1);meshc(x,y,z)
subplot(2,2,2);meshz(x,y,z)
subplot(2,2,3);surfc(x,y,z)
subplot(2,2,4);surfl(x,y,z)

- 标准三维曲面
[x,y,z]=sphere(n)
[x,y,z]=cylinder(R,n)
peaks(n) >> p1=peaks(10)
peaks >> p2=peakspeaks(V) >> p3=peaks(-3:0.2:3)
peaks(x,y) >> [x,y]=meshgrid(-2:0.1:2,0:0.1:5)
p4=peaks(x,y)
- fmesh函数和fsurf函数用于绘制参数方程定义的曲面
fsurf(funx,funy,funz,uvlims)
fmesh(funx,funy,funz,uvlims)
图形修饰辅助操作
到这里,不管是二维曲线三维曲线还是曲面,大家掌握的方法都差不多了,图大概率是能被我们做出来了哈哈哈,不过能把图做出来固然重要,可更重要的是还能做出美图来,这就离不开我们的图形修饰了,比如给做好的图形加个标题加个注释什么的,我们要做出来图,还要做出来细图,更要做出来美图,接下来文章将列举我们经常使用的并且很有用的图形修饰辅助操作。基础绘图指令
除去上文所述plot等绘图函数命令之外,还有有一些其它修饰图形的常用命令。
指令 | 作用 |
---|---|
figure(num) | 新打开一个图形窗口,num为窗口序号 |
hold on | 从指令开始,将后续所有图形绘制在一个figure窗口中 |
hold off | 和hold on搭配使用,此指令开始,后续图形不再与之前图形绘制在一个窗口中 |
axis on | 显示坐标轴 |
axis off | 不显示坐标轴 |
axis square | 使坐标轴区域为正方形 |
axis normal | 自动调整轴的长宽比和数据单元的相对比例 |
axis equal | 设置纵横比,使数据单元为各方面都一样 |
axis equal tight | 将轴限制设置为数据的范围 |
axis ij | 把坐标系统的原点放在左上角 |
axis xy | 把原点放在左下角 |
图形标注函数
title(图形标题)
xlabel(x轴说明)
ylabel(y轴说明)
text(x,y,文本说明)
legend(图1,图2,...,参数...)
//没有图形标注
x = 0:0.5:4*pi
y1 = sin(x)
y2 = cos(x)
y3 = 1./(1+exp(-x))
y4 = (1/(2*pi)^0.5).*exp(((-1).*(x-2*pi).^2)./(2*2^2))
plot(x,y1,x,y2,x,y3,x,y4)
//加上简单图形标注
title('四条函数图像')
xlabel('横坐标')
ylabel('纵坐标')
text(0,0,'猜猜我在哪')
legend('y1','y2','y3','y4','Location','southwest')

- 图形窗口分割函数subplot
subplot(m,n,p)
x = [0:0.1:10]
y1 = sin(x)
y2 = cos(x)
subplot(1,2,1)
plot(x,y1)
subplot(1,2,2)
plot(x,y2)

图形修饰处理
前面写了一些基本绘图指令,可以对我们的图形进行简单的修整,让其变得更完备更好看,接下来是一些对图形修饰的方法。视点处理
- 方位角:视点与原点连线在xy平面上的投影与y轴负方向形成的角度,正值表示逆时针,负值表示顺时针。
- 仰角:视点与原点连线与xy平面的夹角,正值表示视点在xy平面上方,负值表示视点在xy平面下方。

- view函数
view(az,el)
其中az为方位角,el为仰角。系统默认的视点定义为方位角-37.5°,仰角30°。
//绘制函数z=(x-1)^2+(y-2)^2-1的曲面图,并从不同视点展示曲面
[x,y] = meshgrid(0:0.1:2,1:0.1:3)
z =(x-1).^2+(y-2).^2-1
subplot(2,2,1); mesh(x,y,z)
subplot(2,2,2); mesh(x,y,z);view(0,90)
subplot(2,2,3); mesh(x,y,z);view(90,0)
subplot(2,2,4); mesh(x,y,z);view(-45,-60)

色彩处理
默认的,向量元素在[0,1]范围内取值,3个元素一次表示红、绿、蓝三种颜色的相对亮度,称为RGB三元组即[R G B],如[0 0 1]是蓝色,[1 0 0]是红色,[1 1 1]是白色,[0 0 0]是黑色。(当然,也有在[0,255]内取值的,不再介绍)- 色图(Colormap)首先,创建一个色图矩阵方法如下:
cmap = colormap(parula(5))
其中,parula是内建色图中包含的一个种类,其中参数5可以是任何一个数值,它关系着色图矩阵的范围,一般来说使用的时候省略就好。内建色图如下:

- 指定当前图形使用的色图
//以peaks为例,先渲染图形,后紧跟色图种类即可
surf(peaks)
colormap hot
我们也可以不使用系统的色图矩阵,可以自定义任何色图矩阵。如创建一个灰色系列的色图矩阵:
c = [0,0.2,0.4,0.6,0.8,1.0]
cmap = [c,c,c] //这样创建的矩阵和 cmap=gray(6)是一样的
surf(peaks)
colormap(cmap)

- 用shading函数来改变着色方式参数如下:
名称 | 作用 |
---|---|
shading faceted | 每个网格片用其高度对应的颜色进行着色,默认网格线是黑色 |
shading flat | 每个网格片用同一个颜色进行着色,网格线也用此颜色 |
shading interp | 网格片内采用颜色插值处理 |
[x,y,z] =cylinder(pi:-pi/5:0,10)
colormap(lines)
subplot(1,3,1)
surf(x,y,z);
shading flatsubplot(1,3,2)surf(x,y,z);
shading interpsubplot(1,3,3)surf(x,y,z)

图形的裁剪处理
将图形中需要裁剪部分对应的函数值设置成NaN,这样在绘制图形时,函数值为NaN的部分将不显示出来,从而达到对图形进行裁剪的目的。示例如下: //绘制3/4圆
t = linspace(0,2*pi,100)
x = sin(t)
y = cos(t)
p = y>0.5
y(p) = NaNplot(x,y)axis([-1.1,1.1,-1.1,1.1])
axis square
grid on

其它
- 其实在Matlab中还有两个非常重要的函数:
set
和get
,它们两个能非常方便的创建、修改图形的各种属性,如改变坐标轴范围、设置字体和刻度点、设定线条风格等等,不过它们涉及到的使用更深入,在这里不再展开叙述,而事实上,对于我们非常熟知的figure
,它也能加上参数来对窗格进行设置,这都是我们经常使用的,但也是经常忽略它们其它功能的函数,如果有兴趣,你可以继续的深入探索下去,更深入的学习能更方便的为我们所用。
总结
好了,感谢你能看到这里,对于这篇文章,它可能的侧重点不是完全教会我们怎么作图,而更多的也可能是提醒我们在Matlab里面可以进行如此操作,对于新手而言,很多没有系统的学习过Matlab的使用,可能里面的很多东西不是我们不会用,而是根本不知道,所以这篇文章大致列出来了很多非常常用的函数方法等, 其中的示例仅仅是个示例,它们的用法还有很多,希望大家能够进行再次开拓,深入的了解每个方法的使用。最后,如果你觉得本篇文章对你有用,请点个赞,谢谢!• end •
走在路上
goldsunC
