MATLAB05:繪製高級圖表

學習一門技術最好的方式就是閱讀官方文檔,可以查看MATLAB官方文檔

二維圖表

折線圖

函數 圖形描述
loglog() x軸和y軸都取對數座標
semilogx() x軸取對數座標,y軸取線性座標
semilogy() x軸取線性座標,y軸取對數座標
plotyy() 帶有兩套y座標軸的線性座標系
ploar() 極座標系

對數座標系圖線

下面例子演示對數座標系圖線:

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'); 

對數座標系

對數座標系可以加上網格,以區分線性座標系與對數座標系.

set(gca, 'XGrid','on');

對數座標加網格的重要性

雙y軸圖線

plotyy()的返回值爲數組[ax,hlines1,hlines2],其中:

  • ax爲一個向量,保存兩個座標系對象的句柄.
  • hlines1hlines2分別爲兩個圖線的句柄.
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',':');

雙y軸圖線

極座標圖線

% 螺旋線
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);

極座標圖線

統計圖表

函數 圖形描述
hist() 直方圖
bar() 二維柱狀圖
pie() 餅圖
stairs() 階梯圖
stem() 針狀圖

直方圖

使用hist()繪製直方圖,語法如下:

hist(x,nbins)

其中:

  • x表示原始數據
  • nbins表示分組的個數
x = randn(1,1000);
subplot(2,1,1);
hist(x,10);
title('Bins = 10');
subplot(2,1,2);
hist(x,50);
title('Bins = 50');

直方圖

柱狀圖

  • 使用bar()bar3()函數分別繪製二維和三維直方圖

    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');
    

    在這裏插入圖片描述

    hist主要用於查看變量的頻率分佈,而bar主要用於查看分立的量的統計結果.

  • 使用barh()函數可以繪製縱向排列的柱狀圖

    x = [1 2 5 4 8];
    y = [x;1:5];
    barh(y);
    title('Horizontal');
    

    縱向排列的柱狀圖

  • bar()傳入'stack'參數可以讓柱狀圖以堆棧的形式畫出.

    x = [1 2 5 4 8];
    y = [x;1:5];
    bar(y,'stacked');
    title('Stacked');
    

    堆棧式柱狀圖

餅圖

使用pie()pie3()可以繪製二維和三維的餅圖.向其傳入一個bool向量表示每一部分扇區是否偏移.

a = [10 5 20 30];
subplot(1,3,1); pie(a);
subplot(1,3,2); pie(a, [0,0,0,1]);
subplot(1,3,3); pie3(a, [0,0,0,1]);

餅圖

階梯圖和針狀圖:繪製離散數字序列

stairs()stem()函數分別用來繪製階梯圖和針狀圖,用於表示離散數字序列.

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

在這裏插入圖片描述

其它統計圖表

  • boxplot()

    load carsmall
    boxplot(MPG, Origin);
    

boxplot

  • errorbar()

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

在這裏插入圖片描述

繪製圖形

MATLAB也可以繪製簡單的圖形,使用fill()函數可以對區域進行填充.

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');

在這裏插入圖片描述

三維圖表

二維圖與三維圖間的關係

二維圖轉爲三維圖

在MATLAB中,所有的圖都是三維圖,二維圖只不過是三維圖的一個投影.點擊圖形窗口的Rotate 3D按鈕,即可通過鼠標拖拽查看該圖形的三維視圖.

在這裏插入圖片描述

三維圖轉換爲二維圖

使用imagesc()函數可以將三維圖轉換爲二維俯視圖,通過點的顏色指示高度.

[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命令可以改變配色方案.具體細節請參考官方文檔

在這裏插入圖片描述

三維圖的繪製

繪製三維圖前的準備工作:使用meshgrid()生成二維網格

我們對一個二維網格矩陣應用函數z=f(x,y)z=f(x,y)才能得到三維圖形,因此在得到三維數據之前我們應當使用meshgrid()函數生成二維網格矩陣.

meshgrid()函數將輸入的兩個向量進行相應的行擴充和列擴充以得到兩個增廣矩陣,對該矩陣可應用二元函數.

x = -2:1:2;
y = -2:1:2;
[X,Y] = meshgrid(x,y)
Z = X.^2 + Y.^2

我們得到了生成的二維網格矩陣如下:

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
     
Z =
     8     5     4     5     8
     5     2     1     2     5
     4     1     0     1     4
     5     2     1     2     5
     8     5     4     5     8

繪製三維線

使用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');

三維曲線

下面例子繪製了兩個螺旋線:

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

subplot(1, 2, 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;

在這裏插入圖片描述

繪製三維面

使用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()函數可以繪製三維圖形的等高線,前者不會填充網格而後者會.

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);

subplot(1,3,1); contour(Z,[-.45:.05:.45]); axis square;
subplot(1,3,2); [C,h] = contour(Z); clabel(C,h); axis square;
subplot(1,3,3); 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()函數可以調整視角,view()函數接受兩個浮點型參數,分別表示兩個方位角azimuthelevation.

在這裏插入圖片描述

sphere(50); shading flat;
material shiny;
axis vis3d off;
view(-45,20);

在這裏插入圖片描述

調整打光

使用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, 'Position', [-1, -1, 1]);
set(L1, 'Color', 'g');

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章