阅读前请注意:
1. 该学习笔记是华中师范大学HelloWorld程序设计协会2021年寒假MATLAB培训的学习记录,是基于培训课堂内容的总结归纳、拓展阅读。博客内容由 @K2SO4钾 撰写、编辑,发布于 @K2SO4钾 的个人投稿与华中师范大学HelloWorld程序设计协会CSDN官方账号 @CCNU_HelloWorld 。注意,如需转载需得到作者 @K2SO4钾 的同意与授权!
2. 学习笔记基于 《MATLAB R2018a完全自学一本通》(刘浩, 韩晶) 1 ,笔记中增加了很多程序示例和笔者个人的思考。学习笔记面向刚接触MATLAB的新手,内容偏基础。学习前请自行下载安装MATLAB。笔记中示例用MATLAB版本为MATLAB R2019a。
3. 请谅解笔记可能会出现的错误,欢迎指正讨论;由于MATLAB更新导致的旧代码无法使用的情况,也欢迎讨论交流。
文章目录
5.0 MATLAB笔记:传送门汇总
5.0.1 MATLAB学习笔记:传送门汇总
5.0.2 MATLAB拓展学习:传送门汇总
MATLAB拓展学习T2:程序性能优化技术
MATLAB拓展学习T3:histogram函数详解
MATLAB拓展学习T4:数据导入
5.0.3 MATLAB专题博客:传送门汇总
MATLAB-S1:元胞自动机原理及MATLAB实现
MATLAB-S2:图像处理技术
5.0.4 MATLAB应用实例:传送门汇总
MATLAB应用实例:Floyd算法
MATLAB应用实例:简单数字滤波技术的MATLAB实现
MATLAB应用实例:无限脉冲响应数字滤波器
5.3 图形窗口的调整
5.3.1 创建图形窗口与选定子图位置
5.3.1.1 创建图形窗口:figure函数
figure函数用于创建一个新的图形窗口;以figure(n)的方式调用函数,用于创建或选定编号为n(正整数)的窗口。
需要注意的是,如果需要 创建或选定 图形窗口,应在绘图之前使用figure函数。
☆ 例5-6:创建两个图形窗口。先在第一个图形窗口内绘制函数 y = 1 x , x ∈ [ − 2 , 2 ] y=\frac{1}{x},x\in [-2,2] y=x1,x∈[−2,2],再在第二个图形窗口绘制函数 y = s i n ( 1 x ) , x ∈ [ − 20 , 20 ] y=sin(\frac{1}{x}),x\in [-20,20] y=sin(x1),x∈[−20,20],最后再第一个图形窗口叠绘一个函数 y = 100 s i n ( 3 x ) , x ∈ [ − 2 , 2 ] y=100sin(3x),x\in [-2,2] y=100sin(3x),x∈[−2,2],每次绘图之间使用暂停函数pause(3)暂停三秒观察图形窗口的情况。
clc,clear all,close all;
x1 = -2:0.01:2;
x2 = -20:0.01:20;
figure(1)
plot(x1,1./(x1),'b')
hold on
pause(3)
figure(2)
plot(x2,sin(1./x2));
pause(3)
figure(1)
plot(x1,100*sin(3*x1),'r')
5.3.1.2 选定子图位置:subplot函数
subplot函数用于创建并选中子图的位置。 通常调用方式如下:
subplot(x, y, m) / subplot(xym):创建一个图形窗口,将图形窗口分为x行y列的子图,选中其中第m个子图,并把图形绘制在选中的这个子图上。
clc,clear all,close all;
% 第一部分
subplot(2,3,1)
t=0:4*pi/1000:4*pi;
y=2/3*exp(-t/2).*cos(3/2*t);
plot(t,y,'b')
title('第一张子图')
grid on
% 第二部分
subplot(2,3,2)
x=sin(t);
y=cos(t);
plot(t,x,'b+',t,y,'r-')
text(0,-0.8,'+: y=sinx')
text(0,-0.9,'*: y=cosx')
title('第二张子图')
% 第三部分
subplot(2,3,3)
x=-4*pi:0.1:4*pi;
y=2.*exp(-0.5.*x).*sin(2.*pi.*x);
ymax=2.*exp(-0.5.*x);
ymin=-2.*exp(-0.5.*x);
plot(x,y,'-b',x,ymax,':r',x,ymin,'-.m')
grid on
title('第三张子图,函数及其包络线')
text(4,-1000,'实线:原函数')
text(4,-1200,'虚线线:上包络线')
text(4,-1400,'点划线:下包络线')
% 第四部分
subplot(234)
t=-3:0.1:3;
x=sin(2*t);
y=cos(2*t);
[x,y]=meshgrid(x,y);
z=x.^2+2*y.^2;
mesh(x,y,z)
grid on
title('第四张子图,三维网格曲面图')
xlabel('axis x')
ylabel('axis y')
zlabel('axis z')
subplot(235)
surf(x,y,z)
grid on
title('第五张子图,三维曲面图')
xlabel('axis x')
ylabel('axis y')
zlabel('axis z')
% 第五部分
subplot(236)
x=0:0.01:2;
y=1:0.01:3;
[X,Y]=meshgrid(x,y);
Z=(Y-1).*(Y-1)+(X-2).*(X-2)-1;
mesh(X,Y,Z)
grid on
title('第六张子图,三维网格曲面图')
xlabel('axis x')
ylabel('axis y')
zlabel('axis z')
5.3.2 格栅:grid函数
格栅函数grid函数用于为当前图像窗口添加主栅格,其后通常接on、off。
grid on:为当前图像窗口添加主栅格;
grid off:为当前图像窗口关闭主栅格。
栅格是为了辅助读图者快速获取图像横纵坐标的信息,所以尽量在绘制数据图像的时候使用栅格。
clc,clear all,close all;
t=0:4*pi/1000:4*pi;
y=2/3*exp(-t/2).*cos(3/2*t);
subplot(1,2,1)
plot(t,y,'b')
grid on
subplot(1,2,2)
plot(t,y,'b')
grid off
5.3.3 坐标轴设置与调整:axis函数
axis函数是用于调整二维或三维图像坐标轴的范围以及显示,通常的调用方式如下:
axis([XMIN XMAX YMIN YMAX]):对于二维图像窗口,调整图像坐标轴的范围,横坐标在[XMIN, XMAX],纵坐标在[YMIN YMAX]。
axis([XMIN XMAX YMIN YMAX ZMIN ZMAX]):对于三维图像窗口,调整图像坐标轴的范围,x轴在[XMIN, XMAX],y轴在[YMIN YMAX],z轴在[ZMIN ZMAX]。
axis on / axis off:打开/关闭图像窗口的坐标轴。
例如下面这段代码,绘制的左右两张子图纵坐标范围相同,横坐标范围为左侧-0.5到0.5,右侧-5到5,都是绘制同一个函数 y = s i n ( 1 x ) y=sin(\frac{1}{x}) y=sin(x1)。
clc,clear all,close all;
subplot(1,2,1)
fplot(@(x)sin(1./x))
axis([-0.5,0.5,-1,1])
subplot(1,2,2)
fplot(@(x)sin(1./x))
axis([-5,5,-1,1])
下面是一个三维图像调整坐标轴范围的例子。
clc,clear all,close all;
x=0:0.01:2;
y=1:0.01:3;
[X,Y]=meshgrid(x,y);
Z=(Y-1).*(Y-1)+(X-2).*(X-2)-1;
subplot(1,2,1)
mesh(X,Y,Z)
axis([0 2 0 3 -2 8])
subplot(1,2,2)
mesh(X,Y,Z)
axis([0 2 0 3 0 6])
在图像窗口中,也可以通过对图像滚动鼠标滚轮来调整横纵坐标(老版本MATLAB可能不支持)。
axis如果以axis mode的形式调用,mode的常用取值和对应的功能如下:
mode其它取值请参考帮助文档。
此外,xlim、ylim、zlim也可以用于调整坐标轴范围,其调用方式分别为:
xlim([XMIN, XMAX])
ylim([YMIN, YMAX])
zlim([ZMIN, ZMAX])
例如,如果想要调整一个二维图像的纵坐标刚好贴合数据的最大最小值,而横坐标范围为自定义,即可采用这三个函数。
下例即用于绘制函数 y = s i n ( x ) x , x ∈ [ − 10 , 10 ] y=\frac{sin(x)}{x}, x\in [-10,10] y=xsin(x),x∈[−10,10],其纵坐标贴合数据上下限,横坐标设定为-20到20。
clc,clear all,close all;
x=-10:0.01:10;
y=sin(x)./x;
plot(x,y)
grid on
xlim([-20 20])
ylim([min(y),max(y)]) % 范围在y的最小值和最大值之间
5.3.4 图形叠绘:hold函数
hold函数用于图形的叠绘。如果不使用hold函数,在同一个图像窗口绘图时,新绘制的图形会把原有的图形覆盖。hold函数将保留该图像窗口原有的绘图,并在其上绘制新的图形,保证图像不会刷新。
clc,clear all,close all
x = -3:0.01:3;
%% 第一个图形窗口使用hold函数:叠绘
figure(1)
plot(x,3*sin(2*x),'b')
hold on
plot(x,2*sin(3*x),'r')
axis([-3 3 -3 3])
%% 第二个图形窗口不使用hold函数:刷新
figure(2)
plot(x,3*sin(2*x),'b')
plot(x,2*sin(3*x),'r')
axis([-3 3 -3 3])
5.3.5 添加文本说明、图例
5.3.5.1 添加标题:title函数
title(‘str’):位于图像窗口正中的上端,为当前图像窗口添加一个标题,标题内容为str。
也可以先通过figure函数指定窗口,再为图像窗口添加标题。如下面这段代码所示。
clc,clear all,close all
x1 = 0:0.01:2*pi;
x2 = 0:0.01:4*pi;
y1 = sin(x1).*sin(2*x1);
y2 = sin(x2).*cos(2*x2);
figure(1)
plot(x1,y1,'r-','LineWidth',2)
figure(2)
plot(x2,y2,'b-','LineWidth',2)
figure(1)
title('第一张图:sin(x)sin(2x)')
figure(2)
title('第二张图:sin(x)cos(2x)')
如果需要使用其它颜色的标题,可以调整title属性中的 ‘Color’;如果需要使用希腊字母,则在希腊字符英文符号前加反斜杠“\”;如果需要使用上标,则使用符号“^”;如果需要使用下标,则使用符号“_”;如果需要使用多行标题,则可以使用元胞数组的形式。
☆ 例5-7:分析下面一段代码。
clc,clear all,close all
x1 = 0:0.01:2*pi;
x2 = 0:0.01:4*pi;
y1 = sin(x1).*sin(2*x1);
y2 = sin(x2).*cos(2*x2).*exp(0.1*x2);
figure(1)
plot(x1,y1,'r-','LineWidth',2)
figure(2)
plot(x2,y2,'b-','LineWidth',2)
figure(1)
title({'第一张图:sin(x_1)sin(\lambda x_1)' ; '\lambda = 2'},'Color','g')
figure(2)
title('第二张图:sin(x)cos(2x)e^0^.^1^x','Color','m')
5.3.5.2 添加坐标轴标签:xlabel函数
xlabel、ylabel、zlabel函数分别为当前图像窗口的x、y、z坐标轴添加标签。 下面以xlabel函数为例讲解。
xlabel函数常用的调用方式是:xlabel(‘str’),'str’是一个字符串。
clc,clear all,close all
x1 = 0:0.01:2*pi;
y1 = sin(x1).*sin(2*x1);
figure(1)
plot(x1,y1,'r-','LineWidth',2)
t1 = xlabel('横坐标')
ylabel('纵坐标')
上面这些属性中,常调整的几个是:FontSize——调整字体大小,以双精度数调整;FontWeight——调整字体粗细,以字符串 ‘normal’ 或 ‘bold’ 调整;Color——调整颜色,以颜色符号或 1 ∗ 3 1*3 1∗3矩阵调整。调整时以结构体的方式、在xlabel函数内,或使用set函数进行调整。(老版本MATLAB中不能以结构体的方式进行调整)使用set函数时,应调整当前图像窗口坐标轴,即gca,5.3.8节会讲到。
如果需要使用希腊字母,则在希腊字符英文符号前加反斜杠“\”;如果需要使用上标,则使用符号“^”;如果需要使用下标,则使用符号“_”;如果需要使用多行标题,则可以使用元胞数组的形式。
clc,clear all,close all
x = 2008:1:2021;
y = [48.12 48.53 52.49 55.82 57.42 59.90 60.17 ...
58.35 59.41 63.82 65.46 64.27 41.08 47.67];
plot(x,y,'ro-','LineWidth',2)
grid on
t1 = xlabel('年份');
t1.FontSize = 14;
t1.FontWeight = 'bold';
t1.Color = [0 0.7 0.4];
t2 = ylabel({'销售额(万元)';'仅统计子公司'});
t2.FontSize = 12;
t2.FontWeight = 'normal';
t2.Color = [1 0.5 0.4];
5.3.5.3 添加文本:text函数
text函数用于向数据点添加文本说明。
常用调用方式:
text(x,y,‘str’):'str’是指定文本的字符串,向当前坐标区中(二维图像,三维还需要加入z)的一个或多个点添加文本说明。如果是多个点,x、y为等长数组;如果需要添加几组不同的文本,'str’可以使用元胞数组。(当x、y仅指向一个点时,如果使用元胞数组,则会多行输出文本)
text函数可调整的属性与xlabel函数类似,这里就不再赘述。
clc,clear all,close all
x = 2008:1:2021;
y = [48.12 48.53 52.49 55.82 57.42 59.90 60.17 ...
58.35 59.41 63.82 65.46 64.27 41.08 47.67];
plot(x,y,'ro-','LineWidth',2)
grid on
t = text(2010,60,'添加文本','FontSize',15,'Color',[0.3 0.6 0.2], ...
'FontWeight','bold')
这里补充一下gtext函数。gtext函数可以让用户使用鼠标自行在图像窗口中添加指定的文本,常用调用方式为:gtext(‘str’),其中字符串str即为指定文本。
5.3.5.4 添加图例:legend函数
legend函数用于为当前图像窗口添加图例。 常用的调用方式为:
legend(‘str1’, ‘str2’, …):为图像窗口中每个由数据绘制的图像添加图例,按照图像绘制的先后顺序依次添加图例文本’str1’、‘str2’ … 。
legend(‘str1’, ‘str2’, … , ‘Location’, ‘val’): val是一个字符串,其取值见下表,用于调整图例显示的位置。
对于标签,图例使用数据序列的’DisplayName’属性中的文本。如果’DisplayName’属性为空,则图例使用’dataN’形式的标签。在坐标区上添加或删除数据序列时,图例会自动更新。
图例的位置默认在’NorthEast’,如需修改则调整属性’Location’;图例默认是纵向排布’vertical’,如需横向排布则调整属性’Orientation’至’horizontal’。其余字体属性等的调整请参考5.3.5.2节,或参考帮助文档。
clc,clear all,close all
x = 2008:1:2021;
y1 = [48.12 48.53 52.49 55.82 57.42 59.90 60.17 ...
58.35 59.41 63.82 65.46 64.27 41.08 47.67];
y2 = [37.42 39.69 43.20 43.29 44.12 45.58 47.29 ...
50.19 51.42 52.77 54.63 57.18 31.09 34.55];
plot(x,y1,'ro-','LineWidth',2)
hold on
plot(x,y2,'bo-','LineWidth',2)
grid on
h = legend('子公司A','子公司B','Location','NorthEast', ...
'TextColor',[0.4,0.1,0.6], 'FontSize',10, 'FontWeight','bold', ...
'Orientation','horizontal')
5.3.6 设置绘图线型、标记、颜色
绘图的线型、颜色、标记常用于区分不同的曲线、标记图像中的重要信息、保持图像的美观与可读性。
一个函数绘图图像,例如以plot函数绘制一个图像,这个图像句柄会含有以下参数:
而我们在设置绘图线型、标记、颜色的时候关注的就是该图像句柄的 ‘Color’ (颜色)‘LineStyle’(线型) ‘LineWidth’(线宽) ‘Marker’(标记类型) ‘MarkerSize’(标记大小) ‘MarkerFaceColor’(标记填充颜色) 属性。实际上一个图像句柄的属性不只有这些,我们这一节讲到的只是简单地调节图像句柄的线型、标记、颜色参数。
5.3.6.1 线型
MATLAB给出了五种线型:
调整线型即在调整图像句柄的’LineStyle’属性。一般调整该属性时,在调用绘图函数时直接以字符串的形式给出线型的符号即可,无需标注属性名称’LineStyle’。
’LineWidth’用于调整线的粗细,调用绘图函数时需要标注属性名称’LineWidth’,并在其后跟一个双精度数。该数的值越大,线条越粗。
5.3.6.2 标记
MATLAB给出了14种不同类型的标记:
调整标记即在调整图像句柄的’Marker’属性,一般调整该属性时,在调用绘图函数时直接以字符串的形式给出标记的符号即可,与描述线型的符号放在同一个字符串里,无需标注属性名称’Marker’。
’MarkerSize’用于调整标记的大小,调用绘图函数时需要标注属性名称’MarkerSize’,并在其后跟一个双精度数。该数的值越大,标记越大。
5.3.6.3 颜色
MATLAB中有多种方法调整曲线或符号的颜色。调整曲线的颜色即在调整图像句柄的’Color’属性,调整标记实心填充的颜色即在调整图像句柄的’MarkerFaceColor’属性,调整标记边缘的颜色即在调整图像句柄的’MarkerEdgeColor’属性。('MarkerEdgeColor’的调整方法与’MarkerFaceColor’相同)
MATLAB给出8种以简单符号命名的颜色:
调整曲线的颜色时,在调用绘图函数时直接以字符串的形式给出颜色的符号即可,与描述线型、描述标记的符号放在同一个字符串里,无需标注属性名称’Color’。但调整标记的实心填充颜色时需要注明属性名称’MarkerFaceColor’,并在其后加上对应颜色符号的字符串。
MATLAB同样也可以通过颜色映像的数据结构来调整颜色的RGB值。通常RGB的值存放在一个 1 ∗ 3 1*3 1∗3 的矩阵中,放在属性名称’Color’、'MarkerFaceColor’即可,R、G、B值是 范围在0到1之间的双精度数。
下面这段代码运行的结果展示了上述方法调整曲线和标记RGB的方式:
clc,clear all,close all
x = 0:0.01:2*pi;
y = sin(2*x).*cos(3*x);
plot(x,y,'Color',[0.35,0.15,0.75],'LineWidth',2)
hold on
x1 = 0:pi/4:2*pi;
y1 = sin(x1);
plot(x1,y1,'o','MarkerFaceColor',[0.15,0.65,0.45])
legend('示例曲线','示例标记')
☆ 例5-8:以横坐标范围 [ 0 , 2 π ] [0,2\pi] [0,2π] 绘制函数 y = s i n ( 8 x ) e x y=sin(8x)e^{x} y=sin(8x)ex,要求曲线为红色实线且线宽为2,并且用黑色*号、大小为4的标记标出函数的最大值、最小值、零点,最后以蓝色虚线且线宽为2的曲线绘制该函数的包络线。对图像窗口进行调整,补充其横纵坐标、标题、图例等信息,使得绘制出的图像尽量美观。
clc,clear all,close all;
%% 数据准备
x = 0:0.01:2*pi;
x1 = 0:pi/16:2*pi; % 用于绘制最大值、最小值、零点的标记
y = sin(8*x).*exp(x);
y1 = sin(8*x1).*exp(x1);
%% 作图
plot(x,y,'r-','LineWidth',2)
% 这一行指令完整写法应该是:
% plot(x,y,'Color','r','LineStyle','-','LineWidth',2)
hold on
plot(x1,y1,'k*','MarkerSize',4)
% 这一行指令完整写法应该是:
% plot(x1,y1,'Color','k','Marker','*','LineStyle','none','MarkerSize',4)
hold on
%% 绘制包络线
plot(x,exp(x),'b--','LineWidth',1.5)
% 这一行指令完整写法应该是:
% plot(x,exp(x),'Color','b','LineStyle','--','LineWidth',2)
hold on
plot(x,-exp(x),'b--','LineWidth',1.5)
%% 调整图像窗口其它参数
grid on
title('示例绘图')
xlabel('x')
ylabel('y')
legend('曲线','特征点','包络线')
axis([0 7 -800 800])
5.3.7 返回当前图像窗口图像句柄:gcf函数
gcf函数返回当前图窗的句柄。 如果图窗不存在,则 gcf 将创建一个图窗并返回其句柄。可以使用图窗句柄查询和修改图窗的属性。
例如下面这段代码,这段代码会输出两个图像,figure(1)和figure(2),gcf函数返回最后生成的(即当前的)图像句柄,也就是figure(2)的图像句柄。
clc,clear all,close all
x1 = 1:10;
y1 = [12 15 9 14 7 9 16 8 11 5];
x2 = 0:0.01:2*pi;
y2 = sin(x2);
figure(1)
plot(x1,y1,'b--','LineWidth',2)
figure(2)
plot(x2,y2,'r-','LineWidth',1.5)
h = gcf
gcf函数常用于set函数中,用以调整当前图像窗口的相关信息。其完整的属性及各属性的含义请参考帮助文档。
5.3.8 返回当前窗口坐标轴属性:gca函数
gca函数返回当前图窗的当前坐标区或图以及其属性信息,该图窗通常是最后创建的图窗或用鼠标点击的最后一个图窗。
gca函数常用于set函数中,用以调整当前图像窗口的坐标轴或图的相关信息。其完整的属性及各属性的含义请参考帮助文档。
下面这段代码描述了如何使用set函数调节曲线的绘制方式、坐标轴的显示、图窗的显示。绘制图像的各属性、坐标轴的各属性、图像窗口的各属性都可以使用set函数,按下例方式进行调整。
clc,clear all,close all
t = 0:0.01:2*pi;
h = polarplot(t,3*cos(4*t));
set(h,'LineStyle','-','Color','b','LineWidth',2) % 调整曲线的线型、颜色、粗细
set(gcf,'Color','m') % 调整图窗的颜色
set(gca,'Color',[0.3 0.8 0.1]) % 调整坐标轴的底色
5.3.9 关闭图像窗口:close函数
close指令可以关闭图像窗口。常用调用方式:
close / close(gcf):关闭当前的图像窗口;
close(h):关闭图像句柄名称为h的图像窗口;
close all:关闭所有的图像窗口;
close fig_name:关闭名称为fig_name的图像窗口。
☆ 例5-9:运行下面一段代码。每一次关闭图像窗口时会暂停3秒,分析代码,观察图像窗口关闭的过程。
clc,clear all,close all
x1 = 1:10;
y1 = [12 15 9 14 7 9 16 8 11 5];
x2 = 0:0.01:2*pi;
y2 = sin(x2);
figure(1)
plot(x1,y1,'b--','LineWidth',2)
figure(2)
plot(x2,y2,'r-','LineWidth',1.5)
h = gcf
pause(3)
close(h)
pause(3)
close Figure 1
5.4 特殊坐标轴
5.4.1 双坐标轴
把两个函数同时绘制在同一个图窗时,往往会出现由于两个函数自变量或因变量的数量级不同而导致绘图不美观或不方便,或者两个函数采用的量纲不同,而实际应用中又需要把二者绘制在一起,例如绘制一天的气温和空气湿度图(量纲不同),或是比较某一家科技公司几年来的销售额和所有科技公司几年来的销售额(数量级不同)。双坐标轴在一定程度上可以解决这个问题。
早期版本MATLAB中使用plotyy函数绘制双坐标轴,新版本MATLAB中plotyy函数逐渐被yyaxis函数取代,且二者不兼容。
5.4.1.1 plotyy函数
plotyy函数常用的调用方式如下:
plotyy(X1,Y1,X2,Y2):绘制因变量Y1对应自变量X1的图,在左侧显示y轴标签,并同时绘制因变量Y2对应自变量X2的图,在右侧显示y轴标签;
plotyy(X1,Y1,X2,Y2,function):使用指定的绘图函数生成图形。function是指定的下面几种函数之一:plot、semilogx、semilogy、loglog、stem,且function应写成函数句柄或字符向量(更推荐使用函数句柄)。function也可以是能接受以下语法的任意函数句柄:h = function(x,y);
plotyy(X1,Y1,X2,Y2,function1,function2):使用 function1(X1,Y1) 绘制左轴的数据,使用 function2(X2,Y2) 绘制右轴的数据,function均为指定的五种函数之一,且应写成函数句柄或字符向量。
例如下面一段代码,即是用用户自定义的函数句柄来绘制双坐标轴:
clc,clear all,close all
x = 0:0.01:2*pi;
y1 = sin(2*x);
y2 = cos(4*x).*exp(x);
% 生成绘图的函数句柄
fun1 = @(x,y) plot(x,y,'b-','LineWidth',2);
fun2 = @(x,y) plot(x,y,'r--','LineWidth',1.5);
plotyy(x,y1,x,y2,fun1,fun2)
5.4.1.2 yyaxis函数
yyaxis函数相较于plotyy函数更为灵活。它以“激活”左右侧坐标轴的方式,激活左侧坐标轴时绘制第一组x1-y1图像,激活右侧坐标轴上时绘制第二组x2-y2图像。
常用调用方式如下:
yyaxis left:激活 左侧 坐标轴,后跟绘图程序段;
yyaxis right:激活 右侧 坐标轴,后跟绘图程序段。
clc,clear all,close all
x1 = 0:0.1:2*pi;
y1 = rand(1,length(x1));
x2 = 0:pi/16:2*pi;
y2 = sin(2*x2).*sin(x2);
figure
yyaxis left
plot(x1,y1,'b-','LineWidth',1.5)
yyaxis right
stem(x2,y2,'ro','LineWidth',1,'MarkerFaceColor','r')
5.4.2 对数坐标轴
实际应用中,我们常使用非线性的坐标轴来更好地展示数据,尤其是对于指数型数据,低次幂的数据很容易无法表现。因此这里介绍常用的几种对数坐标轴函数。
5.4.2.1 单对数坐标轴:semilog函数
semilogx和semilogy函数分别用于创建对数坐标轴x与线性坐标轴y、线性坐标轴x和对数坐标轴y对数据进行绘图,其调用方式与plot类似。其可调属性大部分与plot相同,这里不再讲述,如有需要请查看帮助文档或查看其全部属性。
其调用方式为:semilog(x, y)。
clc,clear all,close all
x1 = 0:0.1:10*pi;
y1 = exp(0.5*x1);
x2 = logspace(0,10000,1000);
y2 = log10(x2);
subplot(121)
semilogy(x1,y1,'r-','LineWidth',2)
title('y=e^0^.^5^x')
subplot(122)
semilogx(x2,y2,'b-','LineWidth',2)
title('y=lg(x)')
如果输入的因变量数据包含复数,semilogx、semilogy函数在此函数的其他所有用法中将忽略虚部。一些情况下semilog函数会忽略数据的负数部分,这与semilog绘图的原理有关,例如下面这段代码:
clc,clear all,close all
x1 = 0:0.1:10*pi;
y1 = exp(0.5*x1).*sin(x1);
semilogy(x1,y1,'r-','LineWidth',2)
title('y=e^0^.^5^xsin(x)')
5.4.2.2 双对数坐标轴:loglog函数
loglog函数的调用方式为loglog(x, y),其作用是 使横纵坐标轴均采用对数坐标。其使用方式与semilogx函数相同,这里不再赘述。
clc,clear all,close all
x1 = 0:0.1:1000;
y1 = log10(x1);
y2 = 10.^x1;
subplot(121)
semilogy(x1,y1,'r-','LineWidth',2)
title('y=lg(x)')
subplot(122)
semilogx(x1,y2,'b-','LineWidth',2)
title('y=10^x')
5.4.3 极坐标轴:polarplot函数
polarplot函数用于极坐标绘图,在极坐标中绘制线条。该函数常以 polarplot(theta, rho) 的格式调用,theta表示弧度角,rho表示每个点的半径值。输入必须是长度相等的向量或大小相等的矩阵。如果输入为矩阵,polarplot将绘制rho的列对theta的列的图(即对应的每一列数据作一个图)。也可以一个输入为向量,另一个为矩阵,但向量的长度必须与矩阵的一个维度相等。
polar函数也可以用于绘制极坐标,但是MATLAB不建议使用,而是推荐使用polarplot函数。
从下面这段代码的结果中也能看出,极坐标轴的图像句柄的属性与使用plot绘制图像的图像句柄差不多,调整图像句柄基础属性 ‘Color’ ‘LineStyle’ ‘LineWidth’ ‘Marker’ ‘MarkerSize’ ‘MarkerFaceColor’ 等请参考5.3.6节。
clc,clear all,close all
t = 0:0.01:pi;
h = polarplot(t,cos(8*t))
☆ 例5-10:在同一个图像窗口中任意绘制一个阿基米德螺线 r ( θ ) = a θ r(\theta)=a\theta r(θ)=aθ 和一个玫瑰线 r ( θ ) = a c o s k θ r(\theta)=acosk\theta r(θ)=acoskθ,调整它们的颜色、线型和线宽至合适。
clc,clear all,close all
t = 0:0.01:2*pi;
polarplot(t,3*cos(4*t),'r-','LineWidth',2)
hold on
polarplot(t,0.5*t,'b-','LineWidth',2)
5.4.4 柱坐标系:pol2cart函数
由于MATLAB无法直接使用柱坐标系的参数进行绘图,因此绘图前,应将它们转化为笛卡尔坐标系的参数。因此需要使用pol2cart函数对柱坐标系的参数进行转化,同理,5.4.5节的sph2cart函数是将球坐标系的参数转化为笛卡尔坐标系的参数。转化过后即可使用常规的三维绘图函数进行绘图。
柱坐标系、球坐标系与直角坐标系之间的关系如图:
pol2cart函数将极坐标数组theta和rho的对应元素转换为二维笛卡尔坐标或xy坐标。 换成直角坐标系之后,即可使用mesh、surf等绘图函数进行绘图。常用的调用方式如下:
[x, y] = pol2cart(theta, r)
[x, y, z] = pol2cart(theta, r, z)
字母与上图(柱坐标系、球坐标系与直角坐标系之间的关如图)一致
clc,clear all,close all
theta = 0:0.01:2*pi;
rho = 3*sin(theta);
[theta,rho] = meshgrid(theta,rho);
z = theta.*rho;
[X,Y,Z] = pol2cart(theta,rho,z);
mesh(X,Y,Z) % 绘制网格图(5.5节会讲到)
5.4.5 球坐标系:sph2cart函数
sph2cart函数球面坐标数组azimuth、elevation和r的对应元素转换为笛卡尔坐标,即xyz坐标。 换成直角坐标系之后,即可使用mesh、surf等绘图函数进行绘图。常用的调用方式如下:
[x,y,z] = sph2cart(azimuth,elevation,r)
azimuth为方位角,即5.4.4节中三种坐标系关系图中的 ϕ \phi ϕ;elevation为仰角,即5.4.4节中三种坐标系关系图中的 θ \theta θ;r即为球坐标系中某点距离球心的距离。
clc,clear all,close all
theta = 0:0.01:2*pi;
rho = 3*cos(0.5*theta);
[theta,rho] = meshgrid(theta,rho);
z = theta.*rho;
[X,Y,Z] = sph2cart(theta,rho,z);
mesh(X,Y,Z)
思考题5
☆ 思考题5-6:按顺序完成以下任务:
(1)创建图像窗口1。该图像窗口中绘制函数 y = e x 2 c o s ( 4 x ) y=e^{\frac{x}{2}}cos(4x) y=e2xcos(4x),其中 x ∈ [ 0 , 10 ] x\in[0,10] x∈[0,10],其颜色为绿色,线型为实线,线宽为2;继续绘制该函数的包络线,其颜色为红色,线型为虚线,线宽为1.5;
(2)创建图像窗口2。设置双坐标轴,左侧坐标轴绘制函数 y 1 = e x y_{1}=e^{x} y1=ex, x ∈ [ 0 , 10 ] x\in[0,10] x∈[0,10],右侧坐标轴绘制函数 y 2 = l n ( x ) y_{2}=ln(x) y2=ln(x), x ∈ [ 0 , 10 ] x\in[0,10] x∈[0,10],其颜色分别为蓝色和红色,线型均为实线,线宽均为2;
(3)将图像窗口1添加格栅;设置图像窗口1的坐标轴范围, x ∈ [ − 2 , 12 ] x\in[-2,12] x∈[−2,12], y ∈ [ − 160 , 160 ] y\in[-160,160] y∈[−160,160];将图像窗口2添加格栅;
(4)为图像窗口1横坐标轴添加标签“时间 t 1 t_1 t1”,为图像窗口1纵坐标轴添加标签“幅值 β \beta β”,为图像窗口1命名“幅值-时间 函数图像”;
(5)为图像窗口2添加图例,图例文本依次为“ y = e x y=e^{x} y=ex” “ y = l n ( x ) y=ln(x) y=ln(x)”;在图像的合适位置添加文本“ y = e x y=e^{x} y=ex” “ y = l n ( x ) y=ln(x) y=ln(x)”,字体大小为16;
(6)在图像窗口1的 ( 0 , 50 ) (0,50) (0,50)、 ( 5 , 100 ) (5,100) (5,100)、 ( 10 , 150 ) (10,150) (10,150)绘制散点。设置散点的标记类型为正方形,边缘颜色为红色,内部颜色为绿色;
(7)设置图像窗口1的坐标轴底色为亮蓝色,图像窗口底色为 [ 0.8 , 0.8 , 0.8 ] [0.8,0.8,0.8] [0.8,0.8,0.8]。
☆ 思考题5-7:已知极坐标方程: ρ = e s i n θ − 2 c o s ( 4 t ) + s i n 5 ( t 12 − π 24 ) \rho=e^{sin\theta}-2cos(4t)+sin^{5}(\frac{t}{12}-\frac{\pi}{24}) ρ=esinθ−2cos(4t)+sin5(12t−24π),其中 θ ∈ [ 0 , 8 π ] \theta \in[0,8\pi] θ∈[0,8π]。使用极坐标绘制方程,调整其线宽为0.75。
部分思考题答案
思考题5-6
clc,clear all,close all
%% 第一问
x1 = 0:0.1:10;
y1 = exp(x1/2).*cos(4*x1);
y2 = exp(x1/2);
figure(1)
h1 = plot(x1,y1);
h1.LineWidth = 2;
h1.Color = [0 1 0];
hold on
plot(x1,y2,'r--','LineWidth',1.5)
hold on
plot(x1,-y2,'r--','LineWidth',1.5)
%% 第二问
x2 = 0:0.01:10;
y3 = exp(x2);
y4 = log(x2);
figure(2)
yyaxis left
plot(x2,y3,'b-','LineWidth',2)
yyaxis right
plot(x2,y4,'r-','LineWidth',2)
%% 第三问
figure(1)
grid on
axis([-2 12 -160 160])
figure(2)
grid on
%% 第四问
figure(1)
xlabel('时间t_1')
ylabel('幅值\beta')
title('幅值-时间 函数图像')
%% 第五问
figure(2)
legend('y=e^x','y=ln(x)')
h1 = text(8,0.5,'y=e^x');
h1.FontSize = 16;
h1 = text(2,2,'y=ln(x)');
h1.FontSize = 16;
%% 第六问
figure(1)
h2 = scatter([0 5 10],[50 100 150]);
h2.Marker = 'square';
h2.MarkerEdgeColor = 'r';
h2.MarkerFaceColor = 'g';
%% 第七问
figure(1)
set(gcf,'Color',[0.8 0.8 0.8])
set(gca,'Color','c')
思考题5-7
clc,clear all,close all
t = 0:0.01:8*pi;
h = polarplot(t,exp(sin(t))-2*cos(4*t)+sin(t/12-pi/24).^5);
h.LineWidth = .75;
撰写:邓云泽、林耀
审核:华中师范大学HelloWorld程序设计协会工作人员
刘浩, 韩晶. MATLAB R2018a 完全自学一本通[M]. 北京:电子工业出版社. 2019. ↩︎