虽然在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也给出了更简单的作图方法——fplot
和ezplot
方法。
ezplot
和fplot
也是作图函数,并且二者均不需要计算函数值,可直接画图。
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
文章来源:https://www.toymoban.com/news/detail-402815.html
也可以通过句柄图形系统实现实时动画制作:文章来源地址https://www.toymoban.com/news/detail-402815.html
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
到了这里,关于MATLAB绘图——加强篇的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!