Matlab基础知识六

Matlab 3D画图


这几天一直在b站学习matlab,想和大家分享一下学习笔记,一起进步呀~

1.Special Plots

loglog:对x,y求对数

semilogx:对x求对数

semilogy:对y求对数

plotyy:双坐标轴

hist:频数直方图

https://ww2.mathworks.cn/help/matlab/ref/timetable.html

bar:条形图

pie:饼图

polar:极坐标中绘制线条

具体用法可参考Mathworks帮助中心:
https://ww2.mathworks.cn/help/matlab/ref/bar.html

下面通过一个例子来熟悉这些方法(loglog、semilogx、semilogy):

>> x=logspace(-1,1,100);
y=x.^2;
subplot(2,2,1);
plot(x,y);
title('Plot');
subplot(2,2,2);
semilogx(x,y);
title('Semilogx');
subplot(2,2,3);
semilogy(x,y);
title('Semilogy');
subplot(2,2,4);
loglog(x,y);
title('Loglog');

在这里插入图片描述

如果画log图,加上网格,表示的更清晰一点。

set(gca,‘Xgrid’,‘on’);

在这里插入图片描述

plotyy(),双坐标轴,不同的图

>> x=0:0.01:20;
y1=200*exp(-0.05*x).*sin(x);
y2=0.8*exp(-0.5*x).*sin(10*x);
[AX,H1,H2]=plotyy(x,y1,x,y2);
set(get(AX(1),'Ylabel'),'String','Left Y-axis');
set(get(AX(2),'Ylabel'),'String','Right Y-axis');
title('Labeling plotyy');
set(H1,'LineStyle','--');set(H2,'LineStyle',':');

在这里插入图片描述

Histogram统计图

hist()直方图,看局部

>> y=randn(1,1000);
subplot(2,1,1);
hist(y,10);
title('Bins=10');
subplot(2,1,2);
hist(y,50);
title('Bins=50');

在这里插入图片描述

bar:条形图,看整体

>> x=[3 2 4 8 6 7 5];y=[x;1:7];
subplot(1,3,1);bar(x);title('A bargraph of vector x');
 subplot(1,3,2);bar(y);title('A bargraph of vector Y');
subplot(1,3,3);bar3(y);title('C 3D bargraph');

在这里插入图片描述

其中y函数表示的是两行七列的矩阵

stacked(堆叠),barh(水平条形图)

>> x=[3 2 4 8 7 6 9];y=[x;1:7];
subplot(1,2,1);bar(y,'stacked');title('Stacked');
subplot(1,2,2);barh(y);title('Horizontal');

在这里插入图片描述

pie:饼状图。

>> a=[20 50 90 60];
subplot(1,3,1);pie(a);
subplot(1,3,2);pie(a,[0,1,0,0]);
subplot(1,3,3);pie3(a,[0,0,0,1]);

在这里插入图片描述

polar Chart:极坐标图

>> x=1:100;theta=x/10;r=log10(x);
subplot(1,4,1);polar(theta,r);
theta=linspace(0,2*pi);r=cos(4*theta);
subplot(1,4,2);polar(theta,r);
theta=linspace(0,2*pi,6);r=ones(1,length(theta));
subplot(1,4,3);polar(theta,r);
theta=linspace(0,2*pi);r=1-sin(theta);
subplot(1,4,4);polar(theta,r);

在这里插入图片描述

Stairs and Stem Charts

stairs 绘制阶梯图

Stem 绘制离散序列数据

>> x=linspace(0,4*pi,40);y=sin(x);
subplot(1,2,1);stairs(y);
subplot(1,2,2);stem(y);

在这里插入图片描述

Box Plot() and Error Bar

Box Plot() 用箱线图可视化汇总统计量

errorbar 含误差条的线图

>> load carsmall
boxplot(MPG,Origin);

在这里插入图片描述

>> x=0:pi/10:pi;y=sin(x);
e=std(y)*ones(size(x));
errorbar(x,y,e);

在这里插入图片描述

注解:

errorbar(x,y,e); e表示bar的大小;

fill() 填充

封闭图形,带有颜色

Stop sign

例,画一个八边形,中间部分填充为红色,字样为STOP,效果图如下:

>> t=(1:2:15)'*pi/8;x=sin(t);y=cos(t);
fill(x,y,'r');axis square off;
text(0,0,'STOP','Color','w','FontSize',80,...
'FontWeight','bold','HorizontalAlignment','center');

在这里插入图片描述

注解:

t=(1:2:15)’*pi/8

()’ *表示,多行一列

t=

0.3927
1.1781
1.9635
2.7489
3.5343
4.3197
5.1051
5.8905

t=(1:2:15)*pi/8

()*表示,一行多列

t =

  1 至 7 列
  0.3927    1.1781    1.9635    2.7489    3.5343    4.3197    5.1051
  8 列
  5.8905

练习:画一个菱形,中间部分填充为黄色,字样WAIT,效果如下:

在这里插入图片描述

>> t=(0:3)'*pi/2;x=sin(t);y=cos(t);
fill(x,y,'y','Linewidth',3);axis square off;
text(0,0,'WAIT','Color','k','FontSize',60,...
'FontWeight','bold','HorizontalAlignment','center');

在这里插入图片描述

Color Space 配色

([R G B])

  1. 0 is minimum
  2. 1 is maximum
  3. 8-bit equivalence:

在这里插入图片描述

[0…0]…[1…255] 全黑到全白

配色表

>> G=[46 38 29 24 13];S=[29 27 17 26 8];
B=[29 23 19 32 7];h=bar(1:5,[G' S' B']);
title('Medal count for top 5 countries in 2012 Olympics');
ylabel('Number of medals');xlabel('Country');
legend('Gold','Silver','Bronze');

在这里插入图片描述

对于金牌、银牌、铜牌,设置相应的颜色:

>> G=[46 38 29 24 13];S=[29 27 17 26 8];
B=[29 23 19 32 7];h=bar(1:5,[G' S' B']);
title('Medal count for top 5 countries in 2012 Olympics');
ylabel('Number of medals');xlabel('Country');
legend('Gold','Silver','Bronze');
set(gca,'XTickLabel',{'USA','CHI','GBR','RUS','KOR'});
set(h(1), 'FaceColor', [225,215,0]/256);
set(h(2), 'FaceColor', [204,204,204]/256);
set(h(3), 'FaceColor', [217,83,25]/256);

在这里插入图片描述

imagesc()使用缩放颜色显示图像

>> [x,y]=meshgrid(-3:.2:3,-3:.2:3);
z=x.^2+x.*y+y.^2;surf(x,y,z);box on;
set(gca,'FontSize',16);zlabel('z');
xlim([-4 4]);xlabel('x');ylim([-4 4]);ylabel('y');

在这里插入图片描述

注解:

meshgrid() 表示二维和三维网格

surf 曲面图

从z轴往下看的图像

>> imagesc(z);axis square;xlabel('x');ylabel('y');

在这里插入图片描述

colorbar: 显示色阶的颜色栏。

如果上图加上颜色条,效果如下:

 imagesc(z);axis square;xlabel('x');ylabel('y');colorbar;

在这里插入图片描述

colormap(),查看并设置当前颜色图。a=colormap(prism);可以查看color中具体的数值

colormap(hot); 暖色系

>> imagesc(z);axis square;xlabel('x');ylabel('y');colormap(hot);colorbar;

在这里插入图片描述

colormap(cool); 冷色系

>> imagesc(z);axis square;xlabel('x');ylabel('y');colormap(cool);colorbar;

在这里插入图片描述

colormap(gray); 灰色系

imagesc(z);axis square;xlabel('x');ylabel('y');colormap(gray);colorbar;

在这里插入图片描述

最近,在b站上学习Matlab视频,有的图片来源课件;

在这里插入图片描述

2.3D Plots

3D画图

plot3:三维点或线图

surf:曲面图

surfc:曲面图下的等高线图

surface:基本曲面图

meshc:网格曲面图下的等高线图

contour:矩阵的等高线图

contourf:填充的二维等高线图

在所有画图效果显示窗口,点击这个按钮,就可得到一个3D的图形,那么用代码怎么操作呢?

在这里插入图片描述

plot3(); 三维点或线图

>> x=0:0.1:3*pi;z1=sin(x);z2=sin(2*x);z3=sin(3*x);
y1=zeros(size(x));y3=ones(size(x));y2=y3./2;
plot3(x,y1,z1,'r',x,y2,z2,'b',x,y3,z3,'g');grid on;
xlabel('x-axis');ylabel('y-axis');zlabel('z-axis');

在这里插入图片描述

注解:

grid:显示或隐藏坐标区网格线

More 3D Line Plots 更多3D线性图

例1:

>> t=0:pi/50:10*pi;plot3(sin(t),cos(t),t);
grid on;axis square;

在这里插入图片描述

例2:

>> turns=40*pi;
t=linspace(0,turns,4000);
x=cos(t).*(turns-t)./turns;
y=sin(t).*(turns-t)./turns;
z=t./turns;
plot3(x,y,z);grid on;

在这里插入图片描述

3D Surface Plots 三维曲面图

>> x=-2:1:2;
y=-2:1:2;
[x,y]=meshgrid(x,y)

x =

    -2    -1     0     1     2
    -2    -1     0     1     2
    -2    -1     0     1     2
    -2    -1     0     1     2
    -2    -1     0     1     2


y =

    -2    -2    -2    -2    -2
    -1    -1    -1    -1    -1
     0     0     0     0     0
     1     1     1     1     1
     2     2     2     2     2

mesh()和surf(),有何不同?下面通过一个例子来解释:

>>x=-3.5:0.2:3.5;
y=-3.5:0.2:3.5;
[X,Y]=meshgrid(x,y);
Z=X.*exp(-X.^2-Y.^2);
subplot(1,2,1);mesh(X,Y,Z);
subplot(1,2,2);surf(X,Y,Z);

在这里插入图片描述

总结:

  1. mesh和surf命令都可以绘出空间内的完整曲面,使用方法也类似,不同的是surf命令绘制得到的是着色的三维曲面(黑色线,彩色面);

  2. mesh命令绘制的图形是一个一排排的彩色曲线组成的网格图(彩色线,白色面)。

  3. 如果画的图由非常紧密的’‘线条’‘构成的话,则surf画出的图形就是黑色的,而mesh画出的图形就是彩色的。

contour();

>> x=-3.5:0.2:3.5;
y=-3.5:0.2:3.5;
[X,Y]=meshgrid(x,y);
Z=X.*exp(-X.^2-Y.^2);
subplot(1,2,1);mesh(X,Y,Z);axis square;
subplot(1,2,2);contour(X,Y,Z);axis square;

在这里插入图片描述

contour(),矩阵的等高线图

>> x=-3.5:0.2:3.5;
y=-3.5:0.2:3.5;
[X,Y]=meshgrid(x,y);
Z=X.*exp(-X.^2-Y.^2);
%紧密的图,在contour中加范围,大小按照等差进行画
subplot(1,3,1);contour(Z,[-.45:.05:.45]);axis square;
%带数字的图
subplot(1,3,2);[C,h]=contour(Z);clabel(C,h);axis square;
%带颜色的图,contourf()
subplot(1,3,3);contourf(Z);axis square;

在这里插入图片描述

注解:

clabel为等高线图添加高程标签

clabel(c,h),举例:

>> [x,y,z] = peaks;
[C,h] = contour(x,y,z);   
clabel(C,h)

在这里插入图片描述

peaks函数:

​ 1.返回坐标

Z = peaks 返回在一个 49×49 网格上计算的 peaks 函数的 z 坐标。

Z = peaks(n) 返回在一个 n×n 网格上计算的 peaks 函数。如果将 n 指定为长度为 k 的向量,则 MATLAB® 将在一个 k×k 网格上计算该函数。

Z = peaks(Xm,Ym) 返回在 XmYm 指定的点上计算的 peaks 函数。XmYm 的大小必须相同或兼容。例如,您可以将 XmYm 指定为 meshgrid 格式的矩阵。

[X,Y,Z] = peaks(___) 返回 peaks 函数的 x、y 和 z 坐标。

​ 2.创建曲面图

peaks(___) 将 peaks 函数绘制为一个三维曲面图。您可以使用以前语法中的任意输入参数组合。

具体用法可参考下方帮助文档:

https://ww2.mathworks.cn/help/matlab/ref/peaks.html?searchHighlight=peaks&s_tid=srchtitle_peaks_1

—————————————————————————————————————————————————

学着后面的,忘着前面的,该怎么办呀!!!!

又忘记subplot具体用法是什么了?

subplot 在各个分块位置创建坐标区

https://ww2.mathworks.cn/help/matlab/ref/subplot.html

subplot(m,n,p);就是在当前窗格中划分出mxn个的坐标系,p是坐标系的位置;即m行,n列,第p个。
—————————————————————————————————————————————————

练习:

画出下方图示的图形;

在这里插入图片描述

>> x=-3.5:0.2:3.5;
y=-3.5:0.2:3.5;
[X,Y]=meshgrid(x,y);
Z=X.*exp(-X.^2-Y.^2);
[C,h]=contourf(Z,[-.45:.05:.45]);clabel(C,h);axis square;

meshc() and surfc()

就是在原有的基础上加上等高线图

例如:

x=-3.5:0.2:3.5;
y=-3.5:0.2:3.5;
[X,Y]=meshgrid(x,y);
Z=X.*exp(-X.^2-Y.^2);
subplot(1,2,1);meshc(X,Y,Z);axis square;
subplot(1,2,2);surfc(X,Y,Z);axis square;

在这里插入图片描述

View Angle:view() 可从不同角度,观察图形

相机视线

view(az,el) 为当前坐标区设置相机视线的方位角和仰角。

view(v) 根据 v(二元素或三元素数组)设置视线:

  • 二元素数组 - 其值分别是方位角和仰角。
  • 三元素数组 - 其值是从图框中心点到相机位置所形成向量的 x、y 和 z 坐标。MATLAB® 使用指向同一方向的单位向量计算方位角和仰角。

view(dim) 对二维或三维绘图使用默认视线。对默认二维视图,将 dim 指定为 2,对于默认三维视图,指定为 3

view(ax,___) 指定目标坐标区的视线。

[caz,cel] = view(___) 分别将方位角和仰角返回为 cazcel。指定上述任一语法中的输入参数,以获得新视线的角度。或者,不指定输入参数以获得当前视线的角度。

举例:view 通过不同的视角观察图形

>> sphere(50);shading flat;
light('Position',[1 3 2]);
light('Position',[-3 -1 3]);
material shiny;
axis vis3d off;
set(gcf,'Color',[1 1 1]);
view(-45,20);

在这里插入图片描述

**Light : light() ** 可从不同光线观察图形

light 在当前坐标区中创建一个光源。光源仅影响补片和曲面图对象。

light('PropertyName',propertyvalue,...) 使用给定属性的指定值创建一个 Light 对象。有关上述属性的说明,请参阅 Light 属性。MATLAB® 软件将该光源指定为当前坐标区的父级,除非您使用 Parent 属性指定了其他坐标区。

light(ax,...) 将在由 ax 指定的坐标区中而不是在当前坐标区 (gca) 中创建光源对象。选项 ax 可以位于前面的语法中的任何输入参数组合之前。

handle = light(...) 返回创建的 Light 对象。

举例:

>> [X,Y,Z]=sphere(64);h=surf(X,Y,Z);
axis square vis3d off;
reds=zeros(256,3);reds(:,1)=(0:256.-1)/255;
colormap(reds);shading interp;lighting phong;
set(h,'AmbientStrength',0.75,'DiffuseStrength',0.5);
L1=light('Position',[-1,-1,-1]);

在这里插入图片描述

如果再加一个光源,也可以改变颜色,则呈现出来的效果如下:

set(L1,'Color','g');
L2=light('Position',[-6,-1,-1]);
set(L2,'Color','y');

在这里插入图片描述

注解:

1.sphere 创建球面。

2.shading 设置颜色着色属性

shading 函数控制曲面和补片图形对象的颜色着色。

shading flat每个网格线段和面具有恒定颜色,该颜色由该线段的端点或该面的角边处具有最小索引的颜色值确定。

shading faceted具有叠加的黑色网格线的单一着色。这是默认的着色模式。

shading interp通过在每个线条或面中对颜色图索引或真彩色值进行插值来改变该线条或面中的颜色。

shading(axes_handle,...)将着色类型应用于 axes_handle 指定的坐标区而非当前坐标区中的对象。使用函数形式时,可以使用单引号。

3.lighting phong 光照是使用定向光源照亮对象的技术。

4.AmbientStrength - 环境光的强度 0.3 (默认)

DiffuseStrength — 散射光的强度

Patch 属性

Patch 属性控制 Patch 对象的外观和行为。通过更改属性值,您可以修改该补片的特定方面。使用圆点表示法查询和设置属性。

p = patch;
c = p.CData;
p.CDataMapping = 'scaled';

可参考帮助文档:

https://ww2.mathworks.cn/help/matlab/ref/matlab.graphics.primitive.patch-properties.html?searchHighlight=AmbientStrength&s_tid=srchtitle_AmbientStrength_1

patch()

绘制一个或多个填充多边形区域

patch(X,Y,C) 使用 XY 的元素作为每个顶点的坐标,以绘制一个或多个填充多边形区域。patch 以您指定顶点的顺序连接这些顶点。要创建一个多边形,请将 XY 指定为向量。要创建多个多边形,请将 XY 指定为矩阵,其中每一列对应于一个多边形。C 决定多边形的颜色。

patch(X,Y,Z,C) 使用 XYZ 在三维坐标中创建多边形。要在三维视图中查看这些多边形,请使用 view(3) 命令。C 确定多边形的颜色。

patch('XData',X,'YData',Y) 类似于 patch(X,Y,C),不同之处在于您不需要为二维坐标指定颜色数据。

patch('XData',X,'YData',Y,'ZData',Z) 类似于 patch(X,Y,Z,C),不同的是不需要为三维坐标指定颜色数据。

patch('Faces',F,'Vertices',V) 创建一个或多个多边形,其中 V 指定顶点的值,F 定义要连接的顶点。当有多个多边形时,仅指定唯一顶点及其连接矩阵可以减小数据大小。为 V 中的每个行指定一个顶点。要创建一个多边形,请将 F 指定为向量。要创建多个多边形,请将 F 指定为矩阵,其中一行对应于一个多边形。不要求每个面都具有相同的顶点数。要指定不同数量的顶点,请以 NaN 值填充 F

patch(S) 使用结构体 S 创建一个或多个多边形。结构体字段对应于补片属性名称,字段值对应于属性值。例如,S 可以包含字段 FacesVertices

patch(___,Name,Value) 创建多边形,并使用名称-值对组参数指定一个或多个补片属性。补片是包含所有已创建多边形的数据的对象。您可以使用上述语法中的任意输入参数组合指定补片属性。例如,'LineWidth',2 将所有多边形的轮廓宽度设置为 2 磅。

patch(ax,___) 将在由 ax 指定的坐标区中,而不是当前坐标区 (gca) 中创建补片。选项 ax 可以位于前面的语法中的任何输入参数组合之前。

p = patch(___) 返回包含所有多边形的数据的补片对象。使用 p 可在创建补片对象后查询并修改其属性。

举例:

>> v=[0 0 0;1 0 0;1 1 0;0 1 0;0.25 0.25 1;...
0.75 0.25 1;0.75 0.75 1;0.25 0.75 1];
f=[1 2 3 4;5 6 7 8;1 2 6 5;2 3 7 6;3 4 8 7;4 1 5 8];
subplot(1,2,1);patch('Vertices',v,'Faces',f,...
'FaceVertexCData',hsv(6),'FaceColor','flat');
view(3);axis square tight;grid on;
subplot(1,2,2);patch('Vertices',v,'Faces',f,...
'FaceVertexCData',hsv(8),'FaceColor','interp');
view(3);axis square tight;grid on;

在这里插入图片描述

注解:

hsv 颜色图数组

c = hsv 以三列数组形式返回 hsv 颜色图,其中包含的行数与当前图窗的颜色图相同。如果不存在图窗,则行数等于默认长度 256。数组中的每一行包含一种特定颜色的红、绿、蓝强度。强度介于 [0,1] 范围内,颜色方案如下图所示。

在这里插入图片描述

c = hsv(m) 返回包含 m 种颜色的颜色图。

练习一下:山水图

>> load cape
X=conv2(ones(9,9)/81,cumsum(cumsum(randn(100,100)),2));
surf(X,'EdgeColor','none','EdgeLighting','Phong',...
'FaceColor','interp');
colormap(map);caxis([-10,300]);
grid off;axis off;

在这里插入图片描述

注解:

conv2是二维卷积,C = conv2(u,v,A) 首先求 A 的各列与向量 u 的卷积,然后求每行结果与向量 v 的卷积。

cumsum累积和

cummax累积最大值

cummin累积最小值

caxis,(clim设置颜色图范围,R2022a从caxis更名为现在的名称clim)

clim(limits) 设置当前坐标区的颜色图范围。limits[cmin cmax] 形式的二元素向量。颜色图索引数组中小于或等于 cmin 的所有值映射到颜色图的第一行。大于或等于 cmax 的所有值映射到颜色图的最后一行。介于 cmincmax 之间的所有值以线性方式映射到颜色图的中间各行。

EdgeLighting - 光源对象对边缘的影响 ‘none’ (默认) | ‘flat’ | ‘gouraud’ 光源对象对边缘的影响,指定为下列值之一: ‘flat’ - 将光源均匀地应用于每个边缘上。 ‘none’ - 不将来自光源对象的光源应用于各个边。 ‘gouraud’ - 计算顶点处的光源,然后以线性方式插入各个边缘中。

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

言沫dl

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

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

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

打赏作者

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

抵扣说明:

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

余额充值