MATLAB曲線繪製的一些技巧和註解
阿新 • • 發佈:2019-01-27
一。 二維資料曲線圖
1.1 繪製 單根二維曲線
plot 函式的基本呼叫 格式為:
plot(x,y)
其中x和y為長度相同的向量,分別用於儲存x座標 和y座標資料。
例1-1 在0≤x≤2p區間內,繪製曲線
y=2e-0.5xcos(4πx)
程式 如下:
x=0:pi/100:2*pi;
y=2*exp(-0.5*x).*cos(4*pi*x);
plot(x,y)
例1-2 繪製曲線。
程式如下:
t=0:0.1:2*pi;
x=t.*sin(3*t);
y=t.*sin(t).*sin(t);
plot(x,y);
plot函式最簡單的呼叫格式是隻包含一個輸入引數 :
plot(x)
在這種情況下,當x
1.2 繪製多根二維曲線
1.plot函式的輸入引數是矩陣 形式
(1) 當x是向量,y是有一維與x同維的矩陣時,則繪製出多根不同顏色 的曲線。曲線條數等於y矩陣的另一維數,x被作為這些曲線共同的橫座標。
(2) 當x,y是同維矩陣時,則以x,y對應列元素為橫、縱座標分別繪製曲線,曲線條數等於矩陣的列數。
(3) 對只包含一個輸入引數的plot函式,當輸入引數是實矩陣時,則按列繪製每列元素值相對其下標的曲線,曲線條數等於輸入引數矩陣的列數。
當輸入引數是複數矩陣時,則按列分別以元素實部和虛部為橫、縱座標繪製多條曲線。
2.含多個輸入引數的
呼叫格式為:
plot(x1,y1,x2,y2,…,xn,yn)
(1) 當輸入引數都為向量時,x1和y1,x2和y2,…,xn和yn分別組成一組向量對,每一組向量對的長度可以不同。每一向量對可以繪製出一條曲線,這樣可以在同一座標內繪製出多條曲線。
(2) 當輸入引數有矩陣形式時,配對的x,y按對應列元素為橫、縱座標分別繪製曲線,曲線條數等於矩陣的列數。
例1-3 分析下列程式繪製的曲線。
x1=linspace(0,2*pi,100);
x2=linspace(0,3*pi,100);
x3=linspace(0,4*pi,100);
y1=sin(x1);
y2=1+sin(x2);
y3=2+sin(x3);
x=[x1;x2;x3]';
y=[y1;y2;y3]';
plot(x,y,x1,y1-1)
3.具有兩個縱座標標度的圖形
在MATLAB中,如果需要繪製出具有不同縱座標標度的兩個圖形,可以使用plotyy繪圖函式。呼叫格式為:
plotyy(x1,y1,x2,y2)
其中x1,y1對應一條曲線,x2,y2對應另一條曲線。橫座標的標度相同,縱座標有兩個,左縱座標用於x1,y1資料對,右縱座標用於x2,y2資料對。
例1-4 用不同標度在同一座標內繪製曲線y1=0.2e-0.5xcos(4πx) 和y2=2e-0.5xcos(πx)。
程式如下:
x=0:pi/100:2*pi;
y1=0.2*exp(-0.5*x).*cos(4*pi*x);
y2=2*exp(-0.5*x).*cos(pi*x);
plotyy(x,y1,x,y2);
4.圖形保持
hold on/off命令 控制 是保持原有圖形還是重新整理原有圖形,不帶引數的hold命令在兩種狀態之間進行切換。
例1-5 採用圖形保持,在同一座標內繪製曲線y1=0.2e-0.5xcos(4πx) 和y2=2e-0.5xcos(πx)。
程式如下:
x=0:pi/100:2*pi;
y1=0.2*exp(-0.5*x).*cos(4*pi*x);
plot(x,y1)
hold on
y2=2*exp(-0.5*x).*cos(pi*x);
plot(x,y2);
hold off
1.3 設定曲線樣式
MATLAB提供了一些繪圖選項,用於確定所繪曲線的線型、顏色和資料點標記符號,它們可以組合使用。例如,“b-.”表示藍色點劃線,“y:d”表示黃色虛線並用菱形符標記資料點。當選項省略時,MATLAB規定,線型一律用實線,顏色將根據曲線的先後順序依次。
要設定曲線樣式可以在plot函式中加繪圖選項,其呼叫格式為:
plot(x1,y1,選項1,x2,y2,選項2,…,xn,yn,選項n)
例1-6 在同一座標內,分別用不同線型和顏色繪製曲線y1=0.2e-0.5xcos(4πx) 和y2=2e-0.5xcos(πx),標記兩曲線交叉點。
程式如下:
x=linspace(0,2*pi,1000);
y1=0.2*exp(-0.5*x).*cos(4*pi*x);
y2=2*exp(-0.5*x).*cos(pi*x);
k=find(abs(y1-y2)<1e-2); %查詢y1與y2相等點(近似相等)的下標
x1=x(k); %取y1與y2相等點的x座標
y3=0.2*exp(-0.5*x1).*cos(4*pi*x1); %求y1與y2值相等點的y座標
plot(x,y1,x,y2,'k:',x1,y3,'bp');
1.4 圖形標註與座標控制
1.圖形標註
有關圖形標註函式的呼叫格式為:
title(圖形名稱)
xlabel(x軸說明)
ylabel(y軸說明)
text (x,y,圖形說明)
legend(圖例1,圖例2,…)
函式中的說明文字,除使用標準的ASCII字元外,還可使用LaTeX格式的控制字元,這樣就可以在圖形上新增希臘字母、數學符號及公式等內容。例如,text(0.3,0.5,‘sin({\omega}t+{\beta})’)將得到標註效果sin(ωt+β)。
例1-7 在0≤x≤2p區間內,繪製曲線y1=2e-0.5x和y2=cos(4πx),並給圖形新增圖形標註。
程式如下:
x=0:pi/100:2*pi;
y1=2*exp(-0.5*x);
y2=cos(4*pi*x);
plot(x,y1,x,y2)
title('x from 0 to 2{\pi}'); %加圖形標題
xlabel('Variable X'); %加X軸說明
ylabel('Variable Y'); %加Y軸說明
text(0.8,1.5,'曲線y1=2e^{-0.5x}'); %在指定位置新增圖形說明
text(2.5,1.1,'曲線y2=cos(4{\pi}x)');
legend(‘y1’,‘ y2’) %加圖例
2.座標控制
axis函式 的呼叫格式為:
axis([xmin xmax ymin ymax zmin zmax])
axis函式功能豐富,常用的格式還有:
axis equal:縱、橫座標軸採用等長刻度。
axis square:產生正方形座標系(預設為矩形)。
axis auto:使用預設設定。
axis off:取消座標軸。
axis on:顯示 座標軸。
給座標加網格線用grid命令來控制。grid on/off命令控制是畫還是不畫網格線,不帶引數的grid命令在兩種狀態之間進行切換。
給座標加邊框用box命令來控制。box on/off命令控制是加還是不加邊框線,不帶引數的box命令在兩種狀態之間進行切換。
例1-8 在同一座標中,可以繪製3個同心圓,並加座標控制。
程式如下:
t=0:0.01:2*pi;
x=exp(i*t);
y=[x;2*x;3*x]';
plot(y)
grid on; %加網格線
box on; %加座標邊框
axis equal %座標軸採用等刻度
1.5 圖形的視覺化編輯
MATLAB 6.5版本在圖形視窗中提供了視覺化的圖形編輯工具,利用圖形視窗選單欄或工具欄中的有關命令可以完成對視窗中各種圖形物件的編輯處理。
在圖形視窗上有一個選單欄和工具欄。選單欄包含File、Edit、View、Insert、Tools、Window和Help共7個選單項,工具欄包含11個命令按鈕。
1.6 對函式自適應取樣的繪圖函式
fplot函式的呼叫格式為:
fplot(fname,lims,tol,選項)
其中fname為函式名,以字串形式出現,lims為x,y的取值範圍,tol為相對允許誤差,其系統 預設值為2e-3。選項定義與plot函式相同。
例1-9 用fplot函式繪製f(x)=cos(tan(πx))的曲線。
命令如下:
fplot('cos(tan(pi*x))',[ 0,1],1e-4)
1.7 圖形視窗的分割
subplot函式的呼叫格式為:
subplot(m,n,p)
該函式將當前圖形視窗分成m×n個繪圖區,即每行n個,共m行,區號按行優先編號,且選定第p個區為當前活動區。在每一個繪圖區允許以不同的座標系單獨繪製圖形。
例5-10 在圖形視窗中,以子圖形式同時繪製多根曲線。
二。 其他二維圖形
2.1 其他座標系下的二維資料曲線圖
1.對數座標圖形
MATLAB提供了繪製對數和半對數座標曲線的函式,呼叫格式為:
semilogx(x1,y1,選項1,x2,y2,選項2,…)
semilogy(x1,y1,選項1,x2,y2,選項2,…)
loglog(x1,y1,選項1,x2,y2,選項2,…)
2.極座標圖
polar函式用來繪製極座標圖,其呼叫格式為:
polar(theta,rho,選項)
其中theta為極座標極角,rho為極座標矢徑,選項的內容與plot函式相似。
例1-12 繪製r=sin(t)cos(t)的極座標圖,並標記資料點。
程式如下:
t=0:pi/50:2*pi;
r=sin(t).*cos(t);
polar(t,r,'-*');
2.2 二維統計分析圖
在MATLAB中,二維統計分析圖形很多,常見的有條形圖、階梯圖、杆圖和填充圖等,所採用的函式分別是:
bar(x,y,選項)
stairs(x,y,選項)
stem(x,y,選項)
fill(x1,y1,選項1,x2,y2,選項2,…)
例1-13 分別以條形圖、階梯圖、杆圖和填充圖形式繪製曲線y=2sin(x)。
程式如下:
x=0:pi/10:2*pi;
y=2*sin(x);
subplot(2,2,1);bar(x,y,'g');
title('bar(x,y,''g'')');axis([0,7,-2,2]);
subplot(2,2,2);stairs(x,y,'b');
title('stairs(x,y,''b'')');axis([0,7,-2,2]);
subplot(2,2,3);stem(x,y,'k');
title('stem(x,y,''k'')');axis([0,7,-2,2]);
subplot(2,2,4);fill(x,y,'y');
title('fill(x,y,''y'')');axis([0,7,-2,2]);
MATLAB提供的統計分析繪圖函式還有很多,例如,用來表示各元素佔總和的百分比的餅圖、複數的相量圖等等。
例1-14 繪製圖形:
(1) 某企業全年各季度的產值(單位:萬元)分別為:2347,1827,2043,3025,試用餅圖作統計分析。
(2) 繪製複數的相量圖:7+2.9i、2-3i和-1.5-6i。
程式如下:
subplot(1,2,1);
pie([2347,1827,2043,3025]);
title('餅圖');
legend('一季度','二季度','三季度','四季度');
subplot(1,2,2);
compass([7+2.9i,2-3i,-1.5-6i]);
title('相量圖');
三。 隱函式繪圖
MATLAB提供了一個ezplot函式繪製隱函式圖形,下面介紹其用法。
(1) 對於函式f = f(x),ezplot函式的呼叫格式為:
ezplot(f):在預設區間-2π<x<2π繪製f = f(x)的圖形。
ezplot(f, [a,b]):在區間a<x<b繪製f = f(x)的圖形。
(2) 對於隱函式f = f(x,y),ezplot函式的呼叫格式為:
ezplot(f):在預設區間-2π<x<2π和-2π<y<2π繪製f(x,y) = 0的圖形。
ezplot(f, [xmin,xmax,ymin,ymax]):在區間xmin<x<xmax和ymin<y<ymax繪製f(x,y) = 0的圖形。
ezplot(f, [a,b]):在區間a<x<b和a<y< b繪製f(x,y) = 0的圖形。
(3) 對於引數方程 x = x(t)和y = y(t),ezplot函式的呼叫格式為:
ezplot(x,y):在預設區間0<t<2π繪製x=x(t)和y=y(t)的圖形。
ezplot(x,y, [tmin,tmax]):在區間tmin < t < tmax繪製x=x(t)和y=y(t)的圖形。
例1-15 隱函式繪圖應用 舉例。
程式如下:
subplot(2,2,1);
ezplot('x^2+y^2-9');axis equal
subplot(2,2,2);
ezplot('x^3+y^3-5*x*y+1/5')
subplot(2,2,3);
ezplot('cos(tan(pi*x))',[ 0,1])
subplot(2,2,4);
ezplot('8*cos(t)','4*sqrt(2)*sin(t)',[0,2*pi])
四。三維圖形
4.1 三維曲線
plot3函式與plot函式用法十分相似,其呼叫格式為:
plot3(x1,y1,z1,選項1,x2,y2,z2,選項2,…,xn,yn,zn,選項n)
其中每一組x,y,z組成一組曲線的座標引數,選項的定義和plot函式相同。當x,y,z是同維向量時,則x,y,z 對應元素構成一條三維曲線。當x,y,z是同維矩陣時,則以x,y,z對應列元素繪製三維曲線,曲線條數等於矩陣列數。
例1-16 繪製三維曲線。
程式如下:
t=0:pi/100:20*pi;
x=sin(t);
y=cos(t);
z=t.*sin(t).*cos(t);
plot3(x,y,z);
title('Line in 3-D Space');
xlabel('X');ylabel('Y');zlabel('Z');
grid on;
4.2 三維曲面
1.產生三維資料
在MATLAB中,利用meshgrid函式產生平面區域內的網格座標矩陣。其格式為:
x=a:d1:b; y=c:d2:d;
[X,Y]=meshgrid(x,y);
語句執行後,矩陣X的每一行都是向量x,行數等於向量y的元素的個數,矩陣Y的每一列都是向量y,列數等於向量x的元素的個數。
2.繪製三維曲面的函式
surf函式和mesh函式的呼叫格式為:
mesh(x,y,z,c)
surf(x,y,z,c)
一般情況下,x,y,z是維數相同的矩陣。x,y是網格座標矩陣,z是網格點上的高度矩陣,c用於指定在不同高度下的顏色範圍。
例1-17 繪製三維曲面圖z=sin(x+sin(y))-x/10。
程式如下:
[x,y]=meshgrid(0:0.25:4*pi);
z=sin(x+sin(y))-x/10;
mesh(x,y,z);
axis([0 4*pi 0 4*pi -2.5 1]);
此外,還有帶等高線的三維網格曲面函式meshc和帶底座的三維網格曲面函式meshz。其用法與mesh類似,不同的是meshc還在xy平面上繪製曲面在z軸方向的等高線,meshz還在xy平面上繪製曲面的底座。
例1-18 在xy平面內選擇區域[-8,8]×[-8,8],繪製4種三維曲面圖。
程式如下:
[x,y]=meshgrid(-8:0.5:8);
z=sin(sqrt(x.^2+y.^2))./sqrt(x.^2+y.^2+eps);
subplot(2,2,1);
mesh(x,y,z);
title('mesh(x,y,z)')
subplot(2,2,2);
meshc(x,y,z);
title('meshc(x,y,z)')
subplot(2,2,3);
meshz(x,y,z)
title('meshz(x,y,z)')
subplot(2,2,4);
surf(x,y,z);
title('surf(x,y,z)')
3.標準三維曲面
sphere函式的呼叫格式為:
[x,y,z]=sphere(n)
cylinder函式的呼叫格式為:
[x,y,z]= cylinder(R,n)
MATLAB還有一個peaks 函式,稱為多峰函式,常用於三維曲面的演示。
<!--[if !supportEmptyParas]--> <!--[endif]-->
例1-19 繪製標準三維曲面圖形。
程式如下:
t=0:pi/20:2*pi;
[x,y,z]= cylinder(2+sin(t),30);
subplot(2,2,1);
surf(x,y,z);
subplot(2,2,2);
[x,y,z]=sphere;
surf(x,y,z);
subplot(2,1,2);
[x,y,z]=peaks(30);
surf(x,y,z);
<!--[if !supportEmptyParas]--> <!--[endif]-->
4.3 其他三維圖形
在介紹二維圖形時,曾提到條形圖、杆圖、餅圖和填充圖等特殊圖形,它們還可以以三維形式出現,使用的函式分別是bar3、stem3、pie3 和fill3。
bar3函式繪製三維條形圖,常用格式為:
bar3(y)
bar3(x,y)
stem3函式繪製離散序列資料的三維杆圖,常用格式為:
stem3(z)
stem3(x,y,z)
pie3函式繪製三維餅圖,常用格式為:
pie3(x)
fill3函式等效於三維函式fill,可在三維空間內繪製出填充過的多邊形,常用格式為:
fill3(x,y,z,c)
<!--[if !supportEmptyParas]--> <!--[endif]-->
例1-20 繪製三維圖形:
(1) 繪製魔方陣的三維條形圖。
(2) 以三維杆圖形式繪製曲線y=2sin(x)。
(3) 已知x=[2347,1827,2043,3025],繪製餅圖。
(4) 用隨機的頂點座標值畫出五個黃色三角形。
程式如下:
subplot(2,2,1);
bar3(magic(4))
subplot(2,2,2);
y=2*sin(0:pi/10:2*pi);
stem3(y);
subplot(2,2,3);
pie3([2347,1827,2043,3025]);
subplot(2,2,4);
fill3(rand(3,5),rand(3,5),rand(3,5), 'y' )
例1-21 繪製多峰函式的瀑布圖和等高線圖。
程式如下:
subplot(1,2,1);
[X,Y,Z]=peaks(30);
waterfall(X,Y,Z)
xlabel('X-axis'),ylabel('Y-axis'),zlabel('Z-axis');
subplot(1,2,2);
contour3(X,Y,Z,12,'k'); %其中12代表高度的等級數
xlabel('X-axis'),ylabel('Y-axis'),zlabel('Z-axis');
<!--[if !supportEmptyParas]-->
五。 圖形修飾處理
5.1 視點處理
MATLAB提供了設定視點的函式view,其呼叫格式為:
view(az,el)
其中az為方位角,el為仰角,它們均以度為單位。系統預設的視點定義為方位角-37.5°,仰角30°。
例5-22 從不同視點觀察三維曲線。
5.2 色彩處理
1.顏色的向量表示
MATLAB除用字元表示顏色外,還可以用含有3個元素的向量表示顏色。向量元素在[0,1]範圍取值,3個元素分別表示紅、綠、藍3種顏色的相對亮度,稱為RGB三元組。
<!--[if !supportEmptyParas]--> <!--[endif]-->
2.色圖
色圖(Color map)是MATLAB系統引入的概念。在MATLAB中,每個圖形視窗只能有一個色圖。色圖是m×3 的數值矩陣,它的每一行是RGB三元組。色圖矩陣可以人為地生成,也可以呼叫MATLAB提供的函式來定義色圖矩陣。
3.三維表面圖形的著色
三維表面圖實際上就是在網格圖的每一個網格片上塗上顏色。surf函式用預設的著色方式對網格片著色。除此之外,還可以用shading命令來改變著色方式。
shading faceted命令將每個網格片用其高度對應的顏色進行著色,但網格線仍保留著,其顏色是黑色。這是系統的預設著色方式。
shading flat命令將每個網格片用同一個顏色進行著色,且網格線也用相應的顏色,從而使得圖形表面顯得更加光滑。
shading interp命令在網格片內採用顏色插值處理,得出的表面圖顯得最光滑。
例1-23 3種圖形著色方式的效果展示。
程式如下:
[x,y,z]=sphere(20);
colormap(copper);
subplot(1,3,1);
surf(x,y,z);
axis equal
subplot(1,3,2);
surf(x,y,z);shading flat;
axis equal
subplot(1,3,3);
surf(x,y,z);shading interp;
axis equal
5.3 光照處理
MATLAB提供了燈光設定的函式,其呼叫格式為:
light('Color',選項1,'Style',選項2,'Position',選項3)
<!--[if !supportEmptyParas]--> <!--[endif]-->
例5-24 光照處理後的球面。
程式如下:
[x,y,z]=sphere(20);
subplot(1,2,1);
surf(x,y,z);axis equal;
light('Posi',[0,1,1]);
shading interp;
hold on;
plot3(0,1,1,'p');text(0,1,1,' light');
subplot(1,2,2);
surf(x,y,z);axis equal;
light('Posi',[1,0,1]);
shading interp;
hold on;
plot3(1,0,1,'p');text(1,0,1,' light');
5.4 圖形的裁剪處理
例5-25 繪製三維曲面圖,並進行插值著色處理,裁掉圖中x和y都小於0部分。
程式如下:
[x,y]=meshgrid(-5:0.1:5);
z=cos(x).*cos(y).*exp(-sqrt(x.^2+y.^2)/4);
surf(x,y,z);shading interp;
pause %程式暫停
i=find(x<=0&y<=0);
z1=z;z1(i)=NaN;
surf(x,y,z1);shading interp;
為了展示裁剪效果,第一個曲面繪製完成後暫停,然後顯示裁剪後的曲面。
六。影象處理 與動畫製作
6.1 影象處理
1.imread和imwrite函式
imread和imwrite函式分別用於將影象檔案 讀入MATLAB工作空間,以及將影象資料和色圖資料一起寫入一定格式的影象檔案。MATLAB支援多種影象檔案格式,如.bmp、.jpg、.jpeg、.tif等。
2.image和imagesc函式
這兩個函式用於影象顯示。為了保證影象的顯示效果,一般還應使用colormap函式設定影象色圖。
例1-26 有一影象檔案flower.jpg,在圖形視窗顯示該影象。
程式如下:
[x,cmap]=imread('flower.jpg'); %讀取影象的資料陣和色圖陣
image(x);colormap(cmap);
axis image off %保持寬高比並取消座標軸
6.2 動畫製作
MATLAB提供getframe、moviein和movie函式進行動畫製作。
1.getframe函式
getframe函式可擷取一幅畫面資訊(稱為動畫中的一幀),一幅畫面資訊形成一個很大的列向量。顯然,儲存 n幅圖面就需一個大矩陣。
2.moviein函式
moviein(n)函式用來建立一個足夠大的n列矩陣。該矩陣用來儲存n幅畫面的資料,以備播放。之所以要事先建立一個大矩陣,是為了提高程式執行 速度。
3.movie函式
movie(m,n)函式播放由矩陣m所定義的畫面n次,預設時播放一次。
例1-27 繪製了peaks函式曲面並且將它繞z軸旋轉。
程式如下
[X,Y,Z]=peaks(30);
surf(X,Y,Z)
axis([-3,3,-3,3,-10,10])
axis off;
shading interp;
colormap(hot);
m=moviein(20); %建立一個20列大矩陣
for i=1:20
view(-37.5+24*(i-1),30) %改變視點
m(:,i)=getframe; %將圖形儲存到m矩陣
end
movie(m,2); %播放畫面2次