使用Matlab繪圖
- 圖像是結果的一種可視化表現,它能直觀的體現你的結果,並且能體現你獲得結果的準確性,在當前的大數據時代,在做數據分析的時候,將其可視化可以直觀多維的展示數據,可以讓人們更好的發現並且記住數據的特徵,因此很多時候掌握一些繪圖方法是非常重要的,而使用MATLAB可以非常簡單的進行繪圖(當然還有很多其它工具可供使用),下文是我所瞭解的一些基本繪圖方法的整理,其中很多很多內容非常基礎,希望對你能有些幫助。
二維作圖
二維圖像是我們在學習過程中經常會接觸到的圖像,比如在做數學題目時隨手畫出的一個正弦曲線,這個圖像往往是我們根據它的函數做出來的,事實確是這樣,在我們學習過程中畫出來的每一個圖像幾乎都是函數,反過來說,每一個函數都對應着它自己的圖像,我們能畫出來的二維圖像往往是一個一元函數即二元方程,在Matlab中做二維圖像也是這樣,我們根據一個函數來畫出它的圖像,不過要注意的一點是,在Matlab畫圖的過程中,它並不認識你給出的那個函數,它要做的僅僅是把你給出的函數上的點連成線而已。
- plot和fplot
在Matlab裏面做二維圖像最基礎也是最常用的兩個函數:plot()
和fplot()
函數,其中,plot的經常使用的方法有下面三種:
one
plot(x)
twoplot(x,y,參數)
threeplot(x1,y1,x2,y2,...,xn,yn)
首先,第一種方法裏面若x爲一維數組,則作出的圖像是以其數組長度爲橫座標,間隔爲1,以數組中的具體值爲縱座標的。而其也可以爲複數變量,如下:
y = [5,10,15,20]
z = [100,200,300,400]
x =y+z*i
//這裏的x經過此定義將會被認爲是一個複數變量
//圖像將會以實部即y爲橫座標,虛部即z爲縱座標作圖
對於第二種形式就更好理解了,往往其中的x、y都爲一維數組,其實y也就是x對應的函數值,後邊的參數用於指定曲線的線形、顏色和數據點標記,如下:
x = [0:0.01:10]
y = sin(x)
plot(x,y,'-r*')
可以看到,x是一個長度爲1001的一維數組,y是和x等長的在sin(x)上的一維數組,後邊的-r*
分別爲曲線線性、顏色、數據點標記,其中參數的一些具體屬性如下表所示:
線形 | 顏色 | 數據點標記 |
---|---|---|
'-' : 實線 |
'k' : 黑色 |
* : 星號 |
':' : 虛線 |
b : 藍色 |
o : 圓圈 |
'-.' : 點劃線 |
c : 藍綠色 |
s : 方塊 |
'--' : 雙劃線 |
g : 綠色 |
p : 五角星 |
m : 洋紅色 |
^ : 朝上三角符號 |
|
r : 紅色 |
X : 叉 |
|
w : 白色 |
+ : + |
|
y : 黃色 |
d : 菱形 |
|
v : 朝下三角符號 |
||
< : 朝左三角符號 |
||
> : 朝右三角符號 |
||
H : 六角形 |
這些就是基本的繪圖參數指令,搭配使用效果更佳。關於參數的使用是在每種方法中都可以添加,三種常用示例只是簡單示例。關於第三種使用方法,意思是把n個圖像做出在一個窗口中,同時也少敲了幾個plot,當然,如果你想把代碼分開寫也可以,只需要加上hold on
命令就行了,關於它後文會有介紹。
而關於fplot,其基本使用方法如下:
one
fplot(f,lims,參數)
twofplot(funx,funy,tlims,參數)
在第一種方法中,f代表一個函數,通常採用函數句柄的形式。lims爲x軸的取值範圍,用二元向量[xmin,xmax]描述,默認值爲[-5,5]。參數定義與plot函數相同。例如使用fplot函數繪製sin(x)圖像如下:
fplot(@(x)sin(x),[0,10],'-r')
在第二種方法中,funx、funy代表函數,通常採用函數句柄的形式。tlims爲參數函數funx和funy的自變量的取值範圍,用二元向量[tmin,tmax]描述。如繪製參數方程(x=tsint,y=tcost)曲線如下:
fplot(@(t)t.*sin(t),@(t)t.*cos(t),[0,10*pi],'-r')
其它形式下的二維曲線圖
上文舉例說明了最基礎最常用的兩個做二維曲線的函數,實際上,二維圖形的種類還有很多,不光只有一根線構成的曲線圖,還有各種統計圖、座標圖等等,相應的在Matlab中也有畫它們圖形的方法,下面是其它幾種圖形作圖方法(非全部):
- 對數座標圖
semilogx(x1,y1,'參數',x2,y2,'參數'...)
semilogy(x1,y1,'參數,x2,y2','參數'...)
loglog(x1,y1,'參數',x2,y2,'參數'...)
其中,semilogx函數x軸爲常用對數刻度,y軸爲線性刻度;semilogy函數x軸爲線性刻度,y軸爲常用對數刻度;loglog函數x軸和y軸均採用常用對數刻度。
- 極座標圖
polar(theta,rho,'參數')
其中,theta爲極角,rho爲極徑,參數內容與plot相同。
- 條形圖
bar(y,style)
bar(x,y,style)
x = [2018,2019,2020]
y = [10,20,30,40,50;
10,20,30,40,50;
10,20,30,40,50];
bar(x,y)
第一個,參數y是數據,選項style用於指定分組排列模式,模式有兩種供選擇,分別爲:'grouped'
:簇狀分組,'stacked'
:堆積分組。
第二個,x存儲橫座標,y存儲數據,y的行數必須與向量x的長度相同。選項style用於指定分組排列模式。
具體效果請自行練習查看。
- 直方圖
hist(y)
hist(y,x)
其中,y是要統計的數據,x用於指定區間的劃分方式。若x是標量,則統計區間均分成x個小區間;若x是向量,則向量x中的每一個數指定分組中心值,元素的個數爲數據分組數。x缺省時,默認按10個等分區間進行統計。
rose(theta[],x)
其中,參數theta用於確定每一區間與原點的角度,選項x用於指定區間的劃分方式。
- 面積類圖形
pie(x,explode)
其中,參數x存儲待統計數據,選項explode控制圖塊的顯示模式。使用如下,可以試着改下參數或者help一下看看。
score = [10,25,3,18,41]
ex = [0,0,0,0,1]
pie(score,ex)
- 散點類圖形
scatter(x,y,選項,'filled')
其中,x、y用於定位數據點,選項用於指定線型、顏色、數據點標記。如果數據點標記是封閉圖形,可以用選項’filled’指定填充數據點標記。該選項省略時,數據點是空心的。
一顆心:
t = 0:pi/50:2*pi
x = 16*sin(t).^3
y = 13*cos(t)-5*cos(2*t)-2*cos(3*t)-cos(4*t)
scatter(x,y,'rd','filled')
- 矢量類圖形
quiver(x,y,u,v)
其中,(x,y)指定矢量起點,(u,v)指定矢量終點。x、y、u、v是同樣大小的向量或同型矩陣,若省略x、y,則在x-y平面上均勻取若干個作爲起點。
已知向量A、B,求A+B,並用矢量圖表示。
A = [4,5]; B = [-10,0]; C = A+B;
hold on
quiver(0,0,A(1),A(2));
quiver(0,0,B(1),B(2));
quiver(0,0,C(1),C(2));
text(A(1),A(2),'A');text(B(1),B(2),'B');
text(C(1),C(2),'C')
axis([-12,6,-1,6])
grid on
- 進階:雙Y軸繪圖
plotyy()
示例代碼:
x = [0:0.01:20]
y1 = 200*exp(-0.05*x).*sin(x)
y2 = 0.8*exp(-0.5*x).*sin(10*x)
plotyy(x,y1,y2)
三維作圖
在上文的二維作圖示例中我們可以知道二維作圖的基本方法,而有時候二維的圖形滿足不了我們的需要,這個時候就需要做一些三維圖像了,而三維圖像裏邊除了包含曲線作圖之外還包含曲面作圖。
三維曲線
在二維曲線作圖裏邊我們主要使用的函數是plot
和fplot
函數,而在三維曲線作圖裏面我們使用的是plot3
和fplot3
函數,其不但長得像,功能也是差不多的,只不過是做了擴展而已。
- plot3和fplot3
關於plot3函數,其基本用法如下:
one
plot3(x,y,z,參數)
twoplot(x1,y1,z1,x2,y2,z2,...,xn,yn,zn)
是不是似曾相識,沒錯,它和plot功能確實非常像,只是多了一維數據而已。如要畫出sin(x)的三維圖,只需這樣就好:
x = [0:0.01:10]
y = x
z = sin(x)
plot3(x,y,z,'-r')
怎麼樣,是不是非常簡單,假如要繪製個空間的螺旋線,其參數方程爲:x=sint+tcost,y=cost-tsint,z=t,只需這樣就好:
t = [0:0.1:10*pi]
x = sin(t)+t.*cos(t)
y = cos(t)-t.*sin(t)
z = t
plot3(x,y,z)
對於plot3函數來講,它的參數x,y,z不止可以是一維數組,實際上:
- 參數x、y、z是同型矩陣時,以x、y、z對應列元素繪製曲線,曲線條數等於矩陣列數。
- 參數x、y、z中有向量,也有矩陣時,向量的長度與矩陣相符。
對於其不止一組數據的方法2,其作用與plot類似,每一組x、y、z向量構成一組數據點的座標,繪製一條曲線。
而plot3函數的後面線型、顏色和數據點標記的參數則與plot完全一致。
對於fplot3函數,其基本引用方法如下:
fplot3(funx,funy,funz,tlims)
其中,funx、funy、funz代表定義曲線x、y、z座標的函數,通常採用函數句柄的形式。tlims爲參數函數自變量的取值範圍,用二元向量[tmin,tmax]描述,默認爲[-5,5],與fplot是幾乎完全一致的,不再舉例。
三維曲面
在做三維曲面圖的時候,第一步往往是生成一個平面網格,這個平面網格是什麼東西呢,其實就是用矩陣X、Y分別存儲每一個小矩形頂點的x座標與y座標,矩陣X、Y就是該矩形區域的xy平面網格座標矩陣:
說的簡單些,就是給我們要用的空間座標系做個底面出來,本來x、y都是一維向量,它們也就是隻能當兩根軸,這個時候用新的兩個X、Y矩陣來把空間座標系的二維地面給表示出來,這樣的話每一個[X,Y]就都能對應一個Z了,就是這個意思。在MATLAB中,產生平面區域內網格座標矩陣有兩種方法:
- 1.利用矩陣運算生成:
X = ones(size(y))*x
Y = y*ones(size(x))
- 2.利用meshgrid函數生成:
[X,Y] = meshgrid(x,y)
- 繪製三維曲面的函數
mesh(x,y,z,c)
surf(x,y,z,c)
mesh(z,c)
surf(z,c)
其中,x、y是網格座標矩陣,z是網格點上的高度矩陣,c用於指定在不同高度下的曲面顏色。c省略時,顏色的設定正比於圖形的高度。
當x、y省略時,z矩陣的第2維下標當作x軸座標,z矩陣的第一維下標當作y軸座標。
另外還有一些其它的繪製三維曲面的函數:
帶等高線的三維網格曲面函數meshc
帶底座的三維網格曲面函數meshz
具有等高線的曲面函數surfc
具有光照效果的曲面函數surfl
這些函數使用都和mesh還有surf大致相同,可自行練習瞭解。
//用4種方式繪製函數z=(x-1)^2+(y-2)^2-1的曲面圖
//其中,x=[0,2],y=[1,3]
[x,y]=meshgrid(0:0.1:2,1:0.1:3)
z=(x-1).^2+(y-2).^2-1
subplot(2,2,1);meshc(x,y,z)
subplot(2,2,2);meshz(x,y,z)
subplot(2,2,3);surfc(x,y,z)
subplot(2,2,4);surfl(x,y,z)
- 標準三維曲面
[x,y,z]=sphere(n)
產生3個(n+1)階的方陣,採用這3個矩陣可以繪製出圓心位於原點、半徑爲1的單位球體。
[x,y,z]=cylinder(R,n)
其中,參數R是一個向量,存放柱面各個等間隔高度上的半徑,n表示在圓柱圓周上有n個間隔點,默認有20個間隔點。
peaks函數
調用格式:
peaks(n) >> p1=peaks(10)
peaks >> p2=peaks
peaks(V) >> p3=peaks(-3:0.2:3)
peaks(x,y) >> [x,y]=meshgrid(-2:0.1:2,0:0.1:5)
p4=peaks(x,y)
- fmesh函數和fsurf函數
用於繪製參數方程定義的曲面
fsurf(funx,funy,funz,uvlims)
fmesh(funx,funy,funz,uvlims)
其中,funx、funy、funz代表定義曲面x、y、z座標的函數,通常採用函數句柄的形式。uvlims爲funx、funy和funz的自變量的取值範圍,用4元向量[umin,umax,vmin,vmax]描述,默認爲[-5,5,-5,5]。
圖形修飾輔助操作
到這裏,不管是二維曲線三維曲線還是曲面,大家掌握的方法都差不多了,圖大概率是能被我們做出來了哈哈哈,不過能把圖做出來固然重要,可更重要的是還能做出美圖來,這就離不開我們的圖形修飾了,比如給做好的圖形加個標題加個註釋什麼的,我們要做出來圖,還要做出來細圖,更要做出來美圖,接下來文章將列舉我們經常使用的並且很有用的圖形修飾輔助操作。
基礎繪圖指令
除去上文所述plot等繪圖函數命令之外,還有有一些其它修飾圖形的常用命令。
指令 | 作用 |
---|---|
figure(num) | 新打開一個圖形窗口,num爲窗口序號 |
hold on | 從指令開始,將後續所有圖形繪製在一個figure窗口中 |
hold off | 和hold on搭配使用,此指令開始,後續圖形不再與之前圖形繪製在一個窗口中 |
axis on | 顯示座標軸 |
axis off | 不顯示座標軸 |
axis square | 使座標軸區域爲正方形 |
axis normal | 自動調整軸的長寬比和數據單元的相對比例 |
axis equal | 設置縱橫比,使數據單元爲各方面都一樣 |
axis equal tight | 將軸限制設置爲數據的範圍 |
axis ij | 把座標系統的原點放在左上角 |
axis xy | 把原點放在左下角 |
這些呢是一些常用的輔助繪圖指令,沒有參數,直接在腳本輸入就行,功能已經列在表中非常明確,大家可以自行練習查看實用效果。
接下來是一些帶參數的繪圖指令,它們可以幫你進行圖形標註、座標控制等等一系列功能,非常實用,記得好好學習。
圖形標註函數
title(圖形標題)
xlabel(x軸說明)
ylabel(y軸說明)
text(x,y,文本說明)
legend(圖1,圖2,...,參數...)
值得一提的是,上面這些函數的使用方法遠不及示例這麼簡單,它們都有非常多的參數可供選擇使用,示例只是列出最簡單、最常用的方法,下面是兩段代碼:
//沒有圖形標註
x = 0:0.5:4*pi
y1 = sin(x)
y2 = cos(x)
y3 = 1./(1+exp(-x))
y4 = (1/(2*pi)^0.5).*exp(((-1).*(x-2*pi).^2)./(2*2^2))
plot(x,y1,x,y2,x,y3,x,y4)
//加上簡單圖形標註
title('四條函數圖像')
xlabel('橫座標')
ylabel('縱座標')
text(0,0,'猜猜我在哪')
legend('y1','y2','y3','y4','Location','southwest')
- 圖形窗口分割函數subplot
subplot(m,n,p)
其中,m和n指定將窗口分成mXn個繪圖區,p指定的是當前圖像所在區域,如m=2,n=3,則一個figure窗口被分成2行三列供6個繪圖區,可以容納6個圖形。若p=3,說明當前圖像要被畫進第三個窗口,也就是第二行第一列的窗口內。p小於等於mXn,如:
x = [0:0.1:10]
y1 = sin(x)
y2 = cos(x)
subplot(1,2,1)
plot(x,y1)
subplot(1,2,2)
plot(x,y2)
圖形修飾處理
前面寫了一些基本繪圖指令,可以對我們的圖形進行簡單的修整,讓其變得更完備更好看,接下來是一些對圖形修飾的方法。
視點處理
- 方位角:視點與原點連線在xy平面上的投影與y軸負方向形成的角度,正值表示逆時針,負值表示順時針。
- 仰角:視點與原點連線與xy平面的夾角,正值表示視點在xy平面上方,負值表示視點在xy平面下方。
- view函數
view(az,el)
其中az爲方位角,el爲仰角。系統默認的視點定義爲方位角-37.5°,仰角30°。
//繪製函數z=(x-1)^2+(y-2)^2-1的曲面圖,並從不同視點展示曲面
[x,y] = meshgrid(0:0.1:2,1:0.1:3)
z =(x-1).^2+(y-2).^2-1
subplot(2,2,1); mesh(x,y,z)
subplot(2,2,2); mesh(x,y,z);view(0,90)
subplot(2,2,3); mesh(x,y,z);view(90,0)
subplot(2,2,4); mesh(x,y,z);view(-45,-60)
色彩處理
默認的,向量元素在[0,1]範圍內取值,3個元素一次表示紅、綠、藍三種顏色的相對亮度,稱爲RGB三元組即[R G B],如[0 0 1]是藍色,[1 0 0]是紅色,[1 1 1]是白色,[0 0 0]是黑色。(當然,也有在[0,255]內取值的,不再介紹)
- 色圖(Colormap)
首先,創建一個色圖矩陣方法如下:
cmap = colormap(parula(5))
其中,parula是內建色圖中包含的一個種類,其中參數5可以是任何一個數值,它關係着色圖矩陣的範圍,一般來說使用的時候省略就好。內建色圖如下:
- 指定當前圖形使用的色圖
//以peaks爲例,先渲染圖形,後緊跟色圖種類即可
surf(peaks)
colormap hot
我們也可以不使用系統的色圖矩陣,可以自定義任何色圖矩陣。如創建一個灰色系列的色圖矩陣:
c = [0,0.2,0.4,0.6,0.8,1.0]'
cmap = [c,c,c] //這樣創建的矩陣和 cmap=gray(6)是一樣的
surf(peaks)
colormap(cmap)
- 用shading函數來改變着色方式
參數如下:
名稱 | 作用 |
---|---|
shading faceted | 每個網格片用其高度對應的顏色進行着色,默認網格線是黑色 |
shading flat | 每個網格片用同一個顏色進行着色,網格線也用此顏色 |
shading interp | 網格片內採用顏色插值處理 |
示例:使用同一色圖,以不同着色方式繪製圓錐體
[x,y,z] =cylinder(pi:-pi/5:0,10)
colormap(lines)
subplot(1,3,1)
surf(x,y,z);
shading flat
subplot(1,3,2)
surf(x,y,z);
shading interp
subplot(1,3,3)
surf(x,y,z)
圖形的裁剪處理
將圖形中需要裁剪部分對應的函數值設置成NaN,這樣在繪製圖形時,函數值爲NaN的部分將不顯示出來,從而達到對圖形進行裁剪的目的。
示例如下:
//繪製3/4圓
t = linspace(0,2*pi,100)
x = sin(t)
y = cos(t)
p = y>0.5
y(p) = NaN
plot(x,y)
axis([-1.1,1.1,-1.1,1.1])
axis square
grid on
其它
- 其實在Matlab中還有兩個非常重要的函數:
set
和get
,它們兩個能非常方便的創建、修改圖形的各種屬性,如改變座標軸範圍、設置字體和刻度點、設定線條風格等等,不過它們涉及到的使用更深入,在這裏不再展開敘述,而事實上,對於我們非常熟知的figure
,它也能加上參數來對窗格進行設置,這都是我們經常使用的,但也是經常忽略它們其它功能的函數,如果有興趣,你可以繼續的深入探索下去,更深入的學習能更方便的爲我們所用。
總結
好了,感謝你能看到這裏,對於這篇文章,它可能的側重點不是完全教會我們怎麼作圖,而更多的也可能是提醒我們在Matlab裏面可以進行如此操作,對於新手而言,很多沒有系統的學習過Matlab的使用,可能裏面的很多東西不是我們不會用,而是根本不知道,所以這篇文章大致列出來了很多非常常用的函數方法等,其中的示例僅僅是個示例,它們的用法還有很多,希望大家能夠進行再次開拓,深入的瞭解每個方法的使用。最後,如果你覺得本篇文章對你有用,請點個贊,謝謝!