MATLAB学习(五):进阶绘图
加油!
二维图表
对数坐标系图像
- logspace:生成对数间距向量
y = logspace(a,b) 生成一个由在 10^a 和 10^b(10 的 N 次幂)之间的 50 个对数间距点组成的行向量 y。logspace 函数对于创建频率向量特别有用。该函数是 linspace 和“:”运算符的对数等价函数。
示例
y = logspace(a,b,n) 在 10 的幂 10^a 和 10^b(10 的 N 次幂)之间生成 n 个点。
y = logspace(a,pi) 在 10^a 和 pi 之间生成点,这对于在区间 [10^a,pi] 中创建对数间距频率的数字信号处理很有用。
`
- plot(x,y):使用线性坐标系画图
- semilogx(x,y);x轴取对数坐标,y轴取线性坐标
- semilogy(x,y);y轴取对数坐标,x轴取线性坐标
- loglog(x,y)x轴和y轴都取对数坐标
- grid on打开网格
set(gca, ‘XGrid’,‘on’)是只加x轴的网格 - 加了网格后就能清晰感受到图像的差异,画有关log的图时要记得加网格
x=logspace(-1,1,100);
y=x.^2;
subplot(2,2,1);
plot(x,y);
title('plot');
grid on;
subplot(2,2,2);
semilogx(x,y);
title('semilogx');
grid on;
subplot(2,2,3);
semilogy(x,y);
title('semilogy');
grid on;
subplot(2,2,4);
loglog(x,y);
title('loglog');
grid on;
极坐标图像polar chart
- polar极坐标系
- theta角度
- ones(m,n)产生一个m*n的元素全为1的矩阵
双y轴图像
- Plotyy() 带有两套y坐标轴的线性坐标系
- set(get(AX(1),‘Ylabel’),‘string’,‘Left Y-axis’)表示改变y坐标轴
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',':');
直方图hist
- randn(1,1000):产生1000个随机数
- hist(y,n)绘制有n个矩形的直方图
- 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
- bar()绘制2维柱状图
- bar3()绘制3维柱状图
- bar主要看分量的量的统计结果
x=[1 2 5 4 8];y=[x;1:5];
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('a 3d bargraph ');
- 将bar(y)改为bar(y,‘stacked’)可以绘制纵向排列的条形图
- 将bar(y)改为barh(y)可以绘制堆积排列的条形图
x=[1 2 5 4 8];y=[x;1:5];
subplot(2,1,1);bar(y,'stacked');title('stacked');
subplot(2,1,2);barh(y);title('horizontal');
饼状图pie
- pie()用来画饼状图
- 若向pie中传入一个布尔向量,则会使饼状图裂开,其中0是合并,1是裂开
- pie3()表示画3维饼状图
a=[10,5,20,30];
subplot(2,2,1);pie(a);
subplot(2,2,2);pie(a,[0,0,0,1]);
subplot(2,2,3);pie3(a,[0,0,0,1]);
subplot(2,2,4);pie3(a,[1,1,1,1]);
阶梯图stairs和茎线图stem
- stairs()绘制阶梯图
- stem()绘制茎线图
x=linspace(0,4*pi,40);y=sin(x);
subplot(1,2,1);stairs(y);
subplot(1,2,2);stem(y);
- 将茎线图与普通图像相结合
clear
t=linspace(0,10,50);%在0和10之间(包括)等距取了50个数
s=linspace(0,10,1000);%1000只是为了图像更平滑而取的
y1=sin(pi*t.^2/4);
y2=sin(pi*s.^2/4);
hold on
plot(s,y2);
stem(t,y1);
hold off
盒型图boxplot
- boxplot()这个需要导入文件,所以是截的别人的图
load carsmall
boxplot(MPG, Origin);
置信区间图(误差的上下限)
- errorbar(x,y,e):e可以是标准差也可以是方差的置信区间,下图代码用的是标准差置信区间
x=0:pi/10:pi;y=sin(x);
e=std(y)*ones(size(x));
errorbar(x,y,e);
填充图像
- fill()画出函数图像并且将其填满
- 当要画多边形时,派除以几就画几边形
- axis square off:将当前坐标轴系图形设置为方形,横轴及纵轴比为1:1,且关闭所有坐标轴线、刻度标记和标签
t=(1:2:15)'*pi/8;%将【1,3,5……】转置成列向量(这样计算更快),然后×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');
三维图象
三维与二维相互转化
-
在MATLAB中,所有的图都是三维图,二维图只不过是三维图的一个投影.点击图形窗口的**Rotate 3D(三维旋转)**按钮,即可通过鼠标拖拽查看该图形的三维视图.
-
imagesc():将三维图转换为二维俯视图,通过点的颜色指示高度.
-
surf():绘制曲面图
surf(X,Y,Z) 创建一个三维曲面图。该函数将矩阵 Z 中的值绘制为由 X 和 Y 定义的 x-y 平面中的网格上方的高度。函数还对颜色数据使用 Z,因此颜色与高度成比例。
此外,surf(X,Y,Z,C) 还指定曲面的颜色。 -
**meshgrid()**二维和三维网络
[X,Y] = meshgrid(x,y) 基于向量 x 和 y 中包含的坐标返回二维网格坐标。X 是一个矩阵,每一行是 x 的一个副本;Y 也是一个矩阵,每一列是 y 的一个副本。坐标 X 和 Y 表示的网格有 length(y) 个行和 length(x) 个列。
[X,Y] = meshgrid(x) 与 [X,Y] = meshgrid(x,x) 相同,并返回网格大小为 length(x)×length(x) 的方形网格坐标。
[X,Y,Z] = meshgrid(x,y,z) 返回由向量 x、y 和 z 定义的三维网格坐标。X、Y 和 Z 表示的网格的大小为 length(y)×length(x)×length(z)。
[X,Y,Z] = meshgrid(x) 与 [X,Y,Z] = meshgrid(x,x,x) 相同,并返回网格大小为 length(x)×length(x)×length(x) 的三维网格坐标。
[x, y] = meshgrid(-3:.2:3,-3:.2:3); z = x.^2 + x.*y + y.^2;
subplot(1, 2, 1)
surf(x, y, z);
subplot(1, 2, 2)
imagesc(z);
- 使用colorbar命令可以在生成的二维图上增加颜色与高度间对应关系的图例,使用colormap命令可以改变配色方案
绘制三维线
-使用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');
绘制三维面
- 使用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);
绘制三维图的等高线
- 使用contour()和contourf()函数可以绘制三维图形的等高线,前者不会填充网格而后者会.
- contour(Z,[-.45:.05:.45]):画出的等高线按照[-.45:.05:.45]排列
- clabel(C,h)标出等高线数值
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(2,2,1);mesh(X,Y,Z);axis square;
subplot(2,2,2); contour(Z,[-.45:.05:.45]); axis square;
subplot(2,2,3); [C,h] = contour(Z); clabel(C,h); axis square;
subplot(2,2,4); contourf(Z); axis square;
- 使用meshc()和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);
subplot(1,2,2); surfc(X,Y,Z);
绘制三维多边形
- patch()创建一个或多个填充多边形
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
调整图像的视角与光线
- view():调整视角
- light():设置光线
- 在想要修改光线时,一定要用set(),若是直接用light(),则会另设一个光源