plot函数的绘图实验2:
绘制条形图
绘制轮廓
三维图
绘制条形图
bar命令绘制二维条形图,下面举个例子来演示如何使用。
示例
假设有10名学生,这些学生某次考试获得分数是:75,58,90,87,50,85,92,75,60和95,使用这此分数来绘制条形图如下。
创建脚本文件并键入以下代码 -
x = [1:10];
y = [75, 58, 90, 87, 50, 85, 92, 75, 60, 95];
bar(x,y), xlabel('Student'),ylabel('Score'),
title('First Sem:')
print -deps graph.eps
运行文件时,MATLAB显示以下条形图 -
绘制等高线
两个变量的函数的轮廓线是一个曲线,函数有一个恒定值。等高线用于通过连接等于高于某一水平的点(如平均海平面)来创建轮廓图。
MATLAB提供了绘制轮廓图的contour函数。
示例
下面演示如何生成一个轮廓图,显示给定函数g = f(x,y)的轮廓线。该函数有两个变量。 所以,必须生成两个独立的变量,即两个数据集x和y。
这可以通过调用meshgrid命令完成。
meshgrid命令用于生成在每种情况下给出x和y范围以及增量规范的元素矩阵。绘制函数g = f(x,y),其中-5≤x≤5,-3≤y≤3。对于这两个值,递增0.1。变量设置为 -[x,y] = meshgrid(–5:0.1:5, –3:0.1:3);
最后,需要分配这个函数。使用函数为:x^2 + y^2(注:x和y的平方之和)
创建脚本文件并键入以下代码 -
[x,y] = meshgrid(-5:0.1:5,-3:0.1:3); %independent variables g = x.^2 + y.^2; % our function contour(x,y,g) % call the contour function print -deps graph.eps
执行上面示例代码,得到以下结果 -
下面再修改一下代码,使地图上变得有数据标识 -
[x,y] = meshgrid(-5:0.1:5,-3:0.1:3); %independent variables g = x.^2 + y.^2; % our function [C, h] = contour(x,y,g); % call the contour function set(h,'ShowText','on','TextStep',get(h,'LevelStep')*2) print -deps graph.eps
执行上面示例代码,得到以下结果 -
三维图
三维图基本上显示的是由两个变量g = f(x,y)中的函数定义的表面。
像之前一样,要定义g,首先使用meshgrid命令在函数的域上创建一组(x,y)点。 接下来,分配函数本身。 最后,使用surf命令创建一个曲面图。
以下示例演示了这一概念 -
示例
为以下函数创建一个3D曲面图 -
创建脚本文件并键入以下代码 -
[x,y] = meshgrid(-2:.2:2); g = x .* exp(-x.^2 - y.^2); surf(x, y, g) print -deps graph.eps
运行文件时,MATLAB显示以下三维图 -
也可以使用mesh命令生成三维表面。 但是,surf命令显示连接线和表面的颜色,而mesh命令创建一个线框表面,带有连接定义点的彩色线。
=====================================================
1.修改Line对象的属性值
可以直接利用plot函数返回的Line对象,通过向修改对象的XData,YData,ZData等属性,然后利用pause暂停画面,即可实现动态图片。同时,可以利用getframe函数捕获当前plot画面,写入成gif文件
% 画椭圆 x*x/4 + y*y/3 = 1的切线 a = 12*cos(0:2*acos(1/3):200*pi)+9i*sin(0:2*acos(1/3):200*pi); figure(); h = plot(a(1)); axis equal axis([-12,12,-9,9]); [A,map] = rgb2ind(frame2im(getframe),256); imwrite(A,map,'1.gif','LoopCount',65535,'DelayTime',0.1); for ii = 1:length(a) h.XData(ii) = real(a(ii)); h.YData(ii) = imag(a(ii)); [A,map] = rgb2ind(frame2im(getframe),256); imwrite(A,map,'1.gif','WriteMode','append','DelayTime',0.1); pause('on') pause(0.2) end
下面是导出的gif文件,与plot函数的画面一样。
2. animatedline创建动画线条
animatedline是一个动画线条对象,通过addpoints函数向其中添加点数,实现动画效果。
% 阿基米德螺线 theta = 0:0.01:50; y = theta.*exp(1i*theta); figure(); h = animatedline(real(y(1)),imag(y(1))); axis equal; axis([-50,50,-50,50]); axis off [A,map] = rgb2ind(frame2im(getframe),256); imwrite(A,map,'2.gif','LoopCount',65535,'DelayTime',0.01); for k = 2:length(theta) addpoints(h,real(y(k)),imag(y(k))); drawnow if(mod(k,20)==0) [A,map] = rgb2ind(frame2im(getframe),256); imwrite(A,map,'2.gif','WriteMode','append','DelayTime',0.01); end end
第一种形式:
作gif动画要用到getframe、frame2im、rgb2ind和imwrite函数,getframe函数用来抓取当前图形窗口中的图像,frame2im函数和rgb2ind函数用来将抓取的图像转为索引图像,imwrite函数用来将索引图像写入gif格式动画,需要注意的是imwrite函数不能将真彩图像写入gif格式动画。关于这些函数的具体用法,这里不再详述,请版友自行查阅帮助。下面只给出案例。
【例1】绕螺旋线运动的小球
效果图:
filename = 'xiezhh.gif';
z = linspace(0, 10*pi, 100); %产生一个行向量
x = [20*sin(z),zeros(1,10)];
y = [20*cos(z),20*ones(1,10)];
z = [z,linspace(10*pi,0,10)];
plot3(x, y, z, 'r', 'linewidth', 2); %绘制螺旋线
hold on %图形保持
h = plot3(0,20,0, '.' , 'MarkerSize' ,40, 'EraseMode' , 'xor' );
xlabel('X'); ylabel('Y'); zlabel('Z'); %添加坐标轴标签
axis([-25 25 -25 25 0 40]); %设置坐标轴范围
view(-210,30); %设置视角
for i = 1:length(x)
set(h, 'xdata' ,x(i), 'ydata' ,y(i), 'zdata' ,z(i));
drawnow; % 刷新屏幕
pause(0.05)
f = getframe(gcf);
imind = frame2im(f);
[imind,cm] = rgb2ind(imind,256);
if i == 1
imwrite(imind,cm,filename,'gif', 'Loopcount',inf,'DelayTime',0.1);
else
imwrite(imind,cm,filename,'gif','WriteMode','append','DelayTime',0.1);
end
end
第二种形式:
利用moviein和movie函数,现将生成的动画存入一个由movien
函数定义的数组中,每一帧为数组的一个元素,最后用movie重复演示,movie后面的数字代表演示次数。
x=[-30:0.2:30];
y=[-30:0.2:30];
[x,y]=meshgrid(x,y);
n=5;
M = moviein(n);
for i=1:n
z=sin(sqrt(2*(x).^2+2*(y).^2)-2*pi*i/10);
zz=plot3(x,y,z,'parent',gca);
mesh(x,y,z);
grid on;
colormap([0,0.9,0.5]);
light('position',[1,1,2],'style','local','color','white');
material([0.5,0.4,0.3,10,0.3]);
set(gca,'zlim',[-10,10]');
M(i)=getframe(gca);
end
movie(M,20)
创建电影剪辑文件,并存储起来,如下:
aviobj=avifile('文件名.avi','fps',3);%定义一个avi文件,
%AVIOBJ = AVIFILE(FILENAME,'PropertyName',VALUE,'PropertyName',VALUE,...)
%各属性详细说明见matlab帮助
for i=1:n
%在当前窗体上生成一帧图像
frame=getframe(gca); %获得一帧图像
aviobj=addframe(aviobj,frame);%并加到电影剪辑文件中
end
aviobj=close(aviobj);%关闭文件,结束数值仿真模拟过程。
【例2】水波纹动态显示
效果图
filename = '水波纹动态显示.gif';
x=-8:0.5:8;
[XX,YY]=meshgrid(x);
r=sqrt(XX.^2+YY.^2)+eps;
Z=sin(r)./r;
surf(Z);
theAxes=axis;
fmat=moviein(20);
for j=1:20
surf(sin(2*pi*j/20)*Z,Z)
axis(theAxes)
fmat(:,j)=getframe;
%下面语句是将静态图像的每一帧进行叠加存储,并写入到filename文件夹中
f = getframe(gcf);
imind = frame2im(f);
[imind,cm] = rgb2ind(imind,256);
if j == 1
imwrite(imind,cm,filename,'gif', 'Loopcount',inf,'DelayTime',0.1);
else
imwrite(imind,cm,filename,'gif','WriteMode','append','DelayTime',0.1);
end
end
movie(fmat,10)
总结:
%下面语句生成gif动态图的完整子程序。
%%filename = '文件名.gif';
%%f = getframe(gcf);
%%imind = frame2im(f);
%%[imind,cm] = rgb2ind(imind,256);
%%if i == 1
%%imwrite(imind,cm,filename,'gif', 'Loopcount',inf,'DelayTime',0.1);
%%else
%%imwrite(imind,cm,filename,'gif','WriteMode','append','DelayTime',0.1);
%%end
只要将此程序模块插入到,动态循环for语句中,即可生成gif动态太图像。