MATLAB绘图——加强篇

本文深入探讨MATLAB绘图,包括结合矩阵作图绘制sin(x)和sin(4x),利用函数表达式fplot和ezplot简化作图,实现交互式作图以计算Maxwell分布律,介绍四维数据作图展示温度场,以及复数作图和GIF动画制作,展示了MATLAB在数据可视化方面的强大功能。
摘要由CSDN通过智能技术生成

虽然在MATLAB绘图/数据可视化中介绍了绘图函数并给出了可直接使用的代码,但如果仅掌握这些,还远做不到随心所欲的绘图,因此,本篇博客将在上篇的基础上进一步深入讲解绘图方法。

结合矩阵作图

例如,我们在上一篇介绍了plot函数。plot(list0)为以列表list0中元素下标为横坐标,元素值为纵坐标的点所组成的折线图;plot(list_x,list_y)是以list_x为横坐标,list_y为纵坐标的点所组成的折线图;plot(list_x1,list_y1,list_x2,list_y2,...)则可在同一窗口中绘制多条二维曲线。但如果使用多个列表分别储存list_x1,list_y1,… 的值则过于繁琐,因此我们可以将其与矩阵的知识结合。

例:绘制 sin(x), sin(4x) 的函数。

x=0:0.1:6;
A=[x; 4*x];
B=sin(A);
plot(x,B(1,:), x,B(2,:))

通过实例我们可以发现,矩阵有同时储存多个列表减少变量数目的优势,而且我们可以通过类似B=sin(A)的操作对A内所有元素进行统一处理,同时在plot(x,B(1,:), x,B(2,:))形式简洁,不会造成混乱。

利用函数表达式作图

在使用plot函数作图时,我们需要先将记录点横纵坐标的列表给出,这样必然是比较麻烦的,MATLAB也给出了更简单的作图方法——fplotezplot方法。

ezplotfplot也是作图函数,并且二者均不需要计算函数值,可直接画图。

ezplot的优势在于其可以完成 f ( x , y ) = 0 f(x,y)=0 f(x,y)=0 (例: x 2 + y 2 = 1 x^2+y^2=1 x2+y2=1) 这样的隐函数图形;而fplot由于其自适应取点的特点,可以对有奇点的函数进行绘图。

clear all; clc; close all
%% plot函数
x=0:0.01:2*pi;
y=sin(x);
plot(x,y);

%% ezplot函数
ezplot('x*x+y*y=1',[-1,1]);

%% fplot函数
fplot(@(x)sin(1/x), [0 2*pi]);

交互式作图

在Python中我们可以通过print函数以及input函数实现简单的交互功能,而在MATLAB作图过程中我们同样可以做到交互式作图。

clear all;clc;close all
disp('该程序计算室温下Maxwell分布律')
y=input('请输入一种分子名称(N/O):','s')
switch y
	case ('N')
		mu=28e-3;
	case('O')
		mu=32e-3;
	otherwise
	warning('只能输入大写N,O')
end

T=300;		v=0:1500;
k=1.38e-23;		NA=6.02e23;
m=mu/NA;
f=4*pi*(m/(2*pi*k*T))^(3/2)*exp(-m*v.^2./(2*k*T)).*v.^2;
plot(v,f)

在这里插入图片描述

在这里插入图片描述

四维数据作图

我们前面已介绍了利用二维数据的平面作图以及利用三维数据的空间作图的方法,但有些读者可能不大清楚,我们的空间就是三维空间,三维数据作图难道还不够吗,为什么还要讨论四维数据作图的情况呢?

对此,必须要先说明,三维数据确实不够。例如我们要描述一个房间内的温度场,光有三维空间坐标可什么都做不了,必须引入第四维数据表示温度。类似的情况还有很多,如果只有三维坐标那我们只能表示空间中的位置,而做不到物理量的表示,因此,我们必须引入第四维数据。

那么这个第四维数据应当如何表示呢,在空间作图时我们好像已经把xyz三个坐标都使用到了,如果来表示这个第四维的数据呢?

答案是颜色,如果有玩过热成像仪的朋友应该明白,我们在空间坐标之外还有颜色可以用来表示物理量!我们只要在一般的三维作图基础上加上不同的颜色加以区分就可以利用四维数据作图。
一张可以生动地表示温度的热成像图片
好了,铺垫已经够多了,我们开始动手吧。

clear all;clc;close all
[x,y,z]=meshgrid(-2:.2:2);	% .2=0.2,,meshgrid生成三维空间网格
v=x.*exp(-x.^2-y.^2-z.^2);	% 生成物理场
slice(v,[5 15],15,10)			% v所对应物理场的切片,分别在x=5,x=15,y=15,z=10处切片
axis([0 21 0 21 0 21]);		% 设置xyz坐标范围
hold on
colorbar('horiz')	% 在竖直方向显示温度表
colorbar('vert')		% 在水平方向显示温度表
view([-25 65])		% 通过方位角和俯仰角,设置观察角度

在这里插入图片描述
怎么样,是不是看着很清晰,我们可以很容易看出, v v v所代表的物理场在空间中有一个“热源”和一个“冷源”,在其他地区则比较“稳定”。

我们来回看一下绘图所用的代码。[x,y,z]=meshgrid(-2:.2:2)生成了一个三维的表示空间坐标的数组,接下来使用v=x.*exp(-x.^2-y.^2-z.^2)生成了一个物理场v,然后我们使用了切片函数slice选取了物理场v的空间剖面图,然后根据剖面图上v值的大小对剖面图上色。

如何选取合适的剖面是四维数据绘图中最重要的一步。

复数作图

使用复数作图的优点:可以对复变函数进行作图;可以通过乘 e i k π e^{ik\pi} eikπ 项旋转或加一个复数进行平移。

plot函数会使用两个列表画出折线图,而我们知道,复数列表自带一个实数列表和一个虚数列表,因此仅对一个复数列表作图,就可以得到以其实数为x轴,虚数为y轴的图形。plot(z)即为plot(real(z), imag(z))

clear all;clc;close all
t = 0: pi/10: 2*pi;
plot(exp(i*t), '-o')
axis equal

在这里插入图片描述

如果对两个复数列表使用plot函数,则只会利用两个复数的实数作图,即plot(z1,z2)=plot(real(z1), real(z2))

MATLAB提供了多种对复变函数绘图的函数。cplxgrid(m)在复变量平面的单位圆内绘制 ( m + 1 ) × ( 2 m + 1 ) (m+1)\times (2m+1) (m+1)×(2m+1) 极坐标的数据网格,cplxmap(u,f(u))绘制复变函数图形,cplxroot(n)绘制复数n次方根的图形。

复数complex的简写为cplx

以复数的平方 u 2 u^2 u2为例:

clear all;clc;close all
u=cplxgrid(20);
cplxmap(u,u.^2)
colormap('winter')
colorbar

在这里插入图片描述

再以复数方根 u 1 / 2 u^{1/2} u1/2为例:

clear all;clc;close all
u=cplxgrid(20);
cplxroot(2)
colormap('winter')
colorbar

在这里插入图片描述

GIF制作

虽然图片很直观,但对于类似驻波、干涉条纹变化这样的概念,仅有静态图片还是不够的,我们还需要学会制作GIF。

下面给出行波的动画程序

pic_num = 1;
t=0:pi/20:4*pi; x=0:0.1*pi:4*pi;    % 不会在循环中改变的变量可以放在循环之外
for i=1:40
    f=figure(1);    % 令f为当前图形窗口
    
    y=sin(x-t(i));
    plot(x,y);
    axis([0,12,-1,1]);

    F=getframe(gcf);    % getframe函数将图形作为影片帧,gcf为获取当前图窗的句柄
    I=frame2im(F);      % 返回与影片帧关联的图像数据
    [I,map]=rgb2ind(I,256);     % 将 RGB 图像转换为索引图像
    if pic_num == 1
        imwrite(I,map,'test2.gif','gif','Loopcount',inf,'DelayTime',0.2);   % imwrite函数可将图像写入图形文件
    else
        imwrite(I,map,'test2.gif','gif','WriteMode','append','DelayTime',0.2);
    end
    pic_num = pic_num + 1;
end

在这里插入图片描述

也可以通过句柄图形系统实现实时动画制作:

t=0:pi/20:4*pi; x=0:0.1*pi:6*pi; y=sin(x);

h=plot(x,y);
axis([0,12,-1,1]);
set(h,'EraseMode','xor')
for i=2:60
    y=sin(x-t(i));
    set(h,'XData',x,'YData',y)
    drawnow
    pause(0.2)
end
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

力语

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值