你好,我是
goldsunC
讓我們一起進步吧!
使用Matlab繪圖
圖像是結果的一種可視化表現,它能直覺的展現你的結果,并且能展現你獲得結果的準确性,在目前的大資料時代,在做資料分析的時候,将其可視化可以直覺多元的展示資料,可以讓人們更好的發現并且記住資料的特征,是以很多時候掌握一些繪圖方法是非常重要的,而使用MATLAB可以非常簡單的進行繪圖(當然還有很多其它工具可供使用),下文是我所了解的一些基本繪圖方法的整理,其中很多很多内容非常基礎,希望對你能有些幫助。
二維作圖
二維圖像是我們在學習過程中經常會接觸到的圖像,比如在做數學題目時随手畫出的一個正弦曲線,這個圖像往往是我們根據它的函數做出來的,事實确是這樣,在我們學習過程中畫出來的每一個圖像幾乎都是函數,反過來說,每一個函數都對應着它自己的圖像,我們能畫出來的二維圖像往往是一個一進制函數即二進制方程,在Matlab中做二維圖像也是這樣,我們根據一個函數來畫出它的圖像,不過要注意的一點是,
在Matlab畫圖的過程中,它并不認識你給出的那個函數,它要做的僅僅是把你給出的函數上的點連成線而已。- plot和fplot
在Matlab裡面做二維圖像最基礎也是最常用的兩個函數:
plot()
和
fplot()
函數,其中,plot的經常使用的方法有下面三種:
one
plot(x)
two
plot(x,y,參數)
three
plot(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*
分别為曲線線性、顔色、資料點标記,其中參數的一些具體屬性如下表所示:
這些就是基本的繪圖參數指令,搭配使用效果更佳。
關于參數的使用是在每種方法中都可以添加,三種常用示例隻是簡單示例。關于第三種使用方法,意思是把n個圖像做出在一個視窗中,同時也少敲了幾個plot,當然,如果你想把代碼分開寫也可以,隻需要加上
hold on
指令就行了,關于它後文會有介紹。 而關于fplot,其基本使用方法如下:
one
fplot(f,lims,參數)
two
fplot(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,x,y2)
三維作圖
在上文的二維作圖示例中我們可以知道二維作圖的基本方法,而有時候二維的圖形滿足不了我們的需要,這個時候就需要做一些三維圖像了,而三維圖像裡邊除了包含曲線作圖之外還包含曲面作圖。
三維曲線
在二維曲線作圖裡邊我們主要使用的函數是
plot
和
fplot
函數,而在三維曲線作圖裡面我們使用的是
plot3
和
fplot3
函數,其不但長得像,功能也是差不多的,隻不過是做了擴充而已。
- plot3和fplot3
關于plot3函數,其基本用法如下:
one
plot3(x,y,z,參數)
two
plot(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等繪圖函數指令之外,還有有一些其它修飾圖形的常用指令。
這些呢是一些常用的輔助繪圖指令,沒有參數,直接在腳本輸入就行,功能已經列在表中非常明确,大家可以自行練習檢視實用效果。
接下來是一些帶參數的繪圖指令,它們可以幫你進行圖形标注、坐标控制等等一系列功能,非常實用,記得好好學習。圖形标注函數
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函數來改變着色方式 參數如下:
示例:使用同一色圖,以不同着色方式繪制圓錐體
[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的使用,可能裡面的很多東西不是我們不會用,而是根本不知道,是以這篇文章大緻列出來了很多非常常用的函數方法等,
其中的示例僅僅是個示例,它們的用法還有很多,希望大家能夠進行再次開拓,深入的了解每個方法的使用。最後,如果你覺得本篇文章對你有用,請點個贊,謝謝!