上机实验一 图形绘制
一、实验目的:
掌握二维图形的绘制,基本图形的绘制、多个窗口的创建、图形的标注;
掌握特殊二维图形的绘制,柱状图、火柴杆图、饼图的绘制;
掌握三维图形的绘制,三维曲线、三维网格、三维曲面图等;
掌握常用图形对象及其属性。
二、实验平台:
MATLAB R2020a(填写自己软件的版本)。
三、实验要求及步骤:
方法1:数组求解方式
clf
L=[0.2,0.4,0.6,0.8]';
b=sqrt(1-L.^2);
Th=atan((1-L.^2)./2.*L);
t=linspace(0,18,101);
y1=1-1/b*exp(-L*t).*sin(2*b*t+Th);
plot(t,y1)
hold on
text(t(12),y1(1,12),['\leftarrow\lambda=','0.2'])
text(t(12),y1(2,12),['\leftarrow\lambda=','0.4'])
text(t(12),y1(3,12),['\leftarrow\lambda=','0.6'])
text(t(12),y1(4,12),['\leftarrow\lambda=','0.8'])
T=title('$y=1-\frac{1}{\beta}e^{-{\lambda}t}sin(2{\beta}t+{\theta})$');
set(T,'interpreter','latex','FontName','黑体','FontSize',20)
xlabel('t')
ylabel('y')
方法2:for循环方式
clf
for L=[0.2,0.4,0.6,0.8];
b=sqrt(1-L^2);
Th=atan((1-L^2)/2*L);
t=linspace(0,18,101);
y2=1-1/b*exp(-L*t).*sin(2*b*t+Th);
plot(t,y2)
hold on
text(t(12),y2(12),['\leftarrow\lambda=',num2str(L)])
end
T=title('$y=1-\frac{1}{\beta}e^{-{\lambda}t}sin(2{\beta}t+{\theta})$');
set(T,'interpreter','latex','FontName','黑体','FontSize',20)
xlabel('t')
ylabel('y')
方法3:直接编程方式,这种最直观,但是代码最冗长
L=0.2;
b=sqrt(1-L^2);
Th=atan((1-L^2)/2*L);
t=linspace(0,18,101);
y2=1-1/b*exp(-L*t).*sin(2*b*t+Th);
plot(t,y2)
hold on
text(t(12),y2(12),['\leftarrow\lambda=',num2str(L)])
L=0.4;
b=sqrt(1-L^2);
Th=atan((1-L^2)/2*L);
t=linspace(0,18,101);
y2=1-1/b*exp(-L*t).*sin(2*b*t+Th);
plot(t,y2)
hold on
text(t(12),y2(12),['\leftarrow\lambda=',num2str(L)])
L=0.6;
b=sqrt(1-L^2);
Th=atan((1-L^2)/2*L);
t=linspace(0,18,101);
y2=1-1/b*exp(-L*t).*sin(2*b*t+Th);
plot(t,y2)
hold on
text(t(12),y2(12),['\leftarrow\lambda=',num2str(L)])
L=0.8;
b=sqrt(1-L^2);
Th=atan((1-L^2)/2*L);
t=linspace(0,18,101);
y2=1-1/b*exp(-L*t).*sin(2*b*t+Th);
plot(t,y2)
hold on
text(t(12),y2(12),['\leftarrow\lambda=',num2str(L)])
T=title('$y=1-\frac{1}{\beta}e^{-{\lambda}t}sin(2{\beta}t+{\theta})$');
set(T,'interpreter','latex','FontName','黑体','FontSize',20)
xlabel('t')
ylabel('y')

x=-4:0.25:4;
y=x;
[X,Y]=meshgrid(x,y);
Z=-X.^4+Y.^4-X.^2-Y.^2-2*X.*Y;
subplot(221),plot3(X,Y,Z),title('plot3')
subplot(222),mesh(X,Y,Z),title('mesh')
subplot(223),surf(X,Y,Z),title('surf')
subplot(224),meshc(X,Y,Z),title('meshc')

三维曲线meshgrid的讲解
任务3:绘制班级成绩分布图
已知学生成绩表格“student_inf.xls”,请读取表格中信息,并显示大班总成绩优秀、良好、中等、及格和不及格区间分布图、学生成绩区间分布详细图、小班成绩区间分布图。
(一)绘制柱状图、饼状图

1、清除工作空间和图形
clc;clear;clf
2、用"readtable"读取表格数据给变量“dataTabel”,并用“disp”显示数据内容
filename='G:\matlabcode\student_inf.xls'; %根据实际位置修改
dataTabel=readtable(filename);
disp(dataTabel)
3、用CLASS、STU_NO、NAME和CODE分别存储Datatable数据中的班级、学号、姓名和分数数据。
CODE=dataTabel.Code;
NAME=dataTabel.Name;
STU_NO=dataTabel.Student_number;
CLASS=dataTabel.Class;
4、找到成绩优秀、良好、中等、及格和不及格的同学序号(在表格中的位置),分别存在“A_Code_xuhao”、“B_Code_xuhao”、“C_Code_xuhao”、“D_Code_xuhao”、“E_Code_xuhao”中。
A_Code_xuhao=find(CODE>=90);
B_Code_xuhao=find((CODE>=80)&(CODE<90));
C_Code_xuhao=find((CODE>=70)&(CODE<80));
D_Code_xuhao=find((CODE>=60)&(CODE<70));
E_Code_xuhao=find(CODE<60);
5、将成绩优秀、良好、中等、及格和不及格的总人数按顺序存放在变量“Zongshu"中
Zongshu=[length(A_Code_xuhao);length(B_Code_xuhao);length(C_Code_xuhao);length(D_Code_xuhao);length(E_Code_xuhao)];
6、用bar显示柱状分布图,并添加图名“2023年MATLAB课程学生成绩区间分布图”,
subplot(1,2,1)
bar(Zongshu,'grouped','g');
title('2023年MATLAB课程学生成绩区间分布图')
7、用“xticklabels”设置X轴刻度标签,将对应的位置设置为优秀、良好、中等、及格和不及格。
xticklabels({'优秀','良好','中等','及格','不及格'})
8、在柱状图上显示区间总人数
text(1,Zongshu(1)+1,num2str(Zongshu(1)))
text(2,Zongshu(2)+1,num2str(Zongshu(2)))
text(3,Zongshu(3)+1,num2str(Zongshu(3)))
text(4,Zongshu(4)+1,num2str(Zongshu(4)))
text(5,Zongshu(5)+1,num2str(Zongshu(5)))
axis([0,6,0,46])
box off
9、绘制饼状图,并添加图例
subplot(1,2,2)
pie(Zongshu);
legend({'优秀','良好','中等','及格','不及格'})
(二)绘制火柴杆图,显示每个区间学生成绩信息
1、用“sort”对学生成绩排序,用火柴杆图画出学生成绩分布图,成绩从高到低显示,并添加90、80、70、60分的分割线
[~,Shengxu]=sort(CODE);
Jiangxu=Shengxu(end:-1:1);
figure
stem(CODE(Jiangxu),'*')
hold on
plot([0,120],[90,90],'r--')
plot([0,120],[80,80],'r--')
plot([0,120],[70,70],'r--')
plot([0,120],[60,60],'r--')
text(110,95,'优秀','color','r')
text(110,85,'良好','color','b')
text(110,75,'中等','color','b')
text(110,65,'及格','color','b')
text(110,55,'不及格','color','k')
title('2023年MATLAB课程学生成绩区间分布图')
xlabel('学生人数')
ylabel('学生成绩')
box off
grid on
2、用axis([xmin,xmax,ymin,ymax])分区间显示学生成绩,并将学生名字,分数,班级信息标注在曲线上。用xtick是坐标轴刻度,xticklabel设置刻度标签。
(1)显示优秀学生成绩分布
subplot(5,1,1),stem(CODE(Jiangxu),'rp')
axis([0,length(A_Code_xuhao),85,100])
title('学生优秀成绩分布')
set(gca,'XTick',1:length(A_Code_xuhao)) %设置坐标轴刻度为1,2,3,...
set(gca,'XTicklabel',Jiangxu(1:length(A_Code_xuhao))) %将对应的坐标轴刻度改为字符标签
box off
hold on
for n=1:length(A_Code_xuhao)
str=[CLASS{Jiangxu(n)}(3:end),NAME{Jiangxu(n)},num2str(CODE(Jiangxu(n)))];
text(n+0.3,87,str,'fontsize',8,'Rotation',90)
end
(2)显示良好学生成绩分布
subplot(5,1,2),
a=length(A_Code_xuhao)+1;
b=length(A_Code_xuhao)+length(B_Code_xuhao);
stem(CODE(Jiangxu(a:b)),'rp')
hold on
for n=a:b
str=[CLASS{Jiangxu(n)}(3:end),NAME{Jiangxu(n)},num2str(CODE(Jiangxu(n)))];
text(n-a+0.3,CODE(Jiangxu(n))-2,str,'fontsize',8,'Rotation',90)
end
axis([0,b-a+2,80-5,80+10])
title('学生良好成绩分布')
set(gca,'XTick',1:b-a+1) %设置坐标轴刻度为1,2,3,...
set(gca,'XTicklabel',Jiangxu(a:b)) %将对应的坐标轴刻度改为字符标签
box off
hold off
(3)显示中等学生成绩分布
subplot(5,1,3),
a=length(A_Code_xuhao)+length(B_Code_xuhao)+1;
b=length(A_Code_xuhao)+length(B_Code_xuhao)+length(C_Code_xuhao);
stem(CODE(Jiangxu(a:b)),'rp')
hold on
for n=a:b
str=[CLASS{Jiangxu(n)}(3:end),NAME{Jiangxu(n)},num2str(CODE(Jiangxu(n)))];
text(n-a+0.3,CODE(Jiangxu(n))-2,str,'fontsize',8,'Rotation',90)
end
axis([0,b-a+2,70-5,70+10])
title('学生中等成绩分布')
set(gca,'XTick',1:b-a+1) %设置坐标轴刻度为1,2,3,...
set(gca,'XTicklabel',Jiangxu(a:b)) %将对应的坐标轴刻度改为字符标签
box off
hold off
(4)显示学生及格成绩分布
subplot(5,1,4),
a=length(A_Code_xuhao)+length(B_Code_xuhao)+length(C_Code_xuhao)+1;
b=length(A_Code_xuhao)+length(B_Code_xuhao)+length(C_Code_xuhao)+length(D_Code_xuhao);
stem(CODE(Jiangxu(a:b)),'rp')
hold on
for n=a:b
str=[CLASS{Jiangxu(n)}(3:end),NAME{Jiangxu(n)},num2str(CODE(Jiangxu(n)))];
text(n-a+0.3,CODE(Jiangxu(n))-2,str,'fontsize',8,'Rotation',90)
end
axis([0,b-a+2,60-5,60+10])
title('学生及格成绩分布')
set(gca,'XTick',1:b-a+1) %设置坐标轴刻度为1,2,3,...
set(gca,'XTicklabel',Jiangxu(a:b)) %将对应的坐标轴刻度改为字符标签
box off
hold off
(5)显示学生不及格成绩分布
subplot(5,1,5),
a=length(A_Code_xuhao)+length(B_Code_xuhao)+length(C_Code_xuhao)+length(D_Code_xuhao)+1;
b=length(A_Code_xuhao)+length(B_Code_xuhao)+length(C_Code_xuhao)+length(D_Code_xuhao)+length(E_Code_xuhao);
stem(CODE(Jiangxu(a:b)),'rp')
hold on
for n=a:b
str=[CLASS{Jiangxu(n)}(3:end),NAME{Jiangxu(n)},num2str(CODE(Jiangxu(n)))];
text(n-a+0.3,CODE(Jiangxu(n))-2,str,'fontsize',8,'Rotation',90)
end
axis([0,b-a+2,0,50+10])
title('学生不及格成绩分布')
set(gca,'XTick',1:b-a+1) %设置坐标轴刻度为1,2,3,...
set(gca,'XTicklabel',Jiangxu(a:b)) %将对应的坐标轴刻度改为字符标签
box off
hold off
(三)用plot和bar绘制三个班级成绩优秀、良好、中等、及格和不及格的分布。
(1)计算三个班级的分数区间人数
Class1=find(ismember(CLASS,{'电气2101'})); %ismember(a,b) 查看b是不是a中的数,是的话,相应位置上返回1
Class2=find(ismember(CLASS,{'电气2102'})); %存储同一个班的学生序号
Class3=find(ismember(CLASS,{'电气2103'}));
Class=Class1;
Class_Code(1,:)=[length(find(CODE(Class)>=90)),length(find((CODE(Class)>=80)&(CODE(Class)<90))),length(find((CODE(Class)>=70)&(CODE(Class)<80))),length(find((CODE(Class)>=60)&(CODE(Class)<70))),length(find(CODE(Class)<60))];
Class=Class2;
Class_Code(2,:)=[length(find(CODE(Class)>=90)),length(find((CODE(Class)>=80)&(CODE(Class)<90))),length(find((CODE(Class)>=70)&(CODE(Class)<80))),length(find((CODE(Class)>=60)&(CODE(Class)<70))),length(find(CODE(Class)<60))];
Class=Class3;
Class_Code(3,:)=[length(find(CODE(Class)>=90)),length(find((CODE(Class)>=80)&(CODE(Class)<90))),length(find((CODE(Class)>=70)&(CODE(Class)<80))),length(find((CODE(Class)>=60)&(CODE(Class)<70))),length(find(CODE(Class)<60))];
Class_Code(4,:)=Zongshu/3;
(2)用plot绘制三个班级的分数分布曲线
subplot(1,2,1),plot(1:5,Class_Code(1:3,:),'*-','LineWidth',2)
hold on
plot(1:5,Class_Code(4,:),'o:')
legend('电气2101','电气2102','电气2103','班级平均数')
xticklabels({'优秀','良好','中等','及格','不及格'})
hold off
(3)用bar绘制三个班级的分数分布
subplot(1,2,2),bar(Class_Code')
xticklabels({'优秀','良好','中等','及格','不及格'})
legend('电气2101','电气2102','电气2103','班级平均数')





