Matlab繪圖方法整理(超完整版)

使用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*分別爲曲線線性、顏色、數據點標記,其中參數的一些具體屬性如下表所示:

線形 顏色 數據點標記
'-' : 實線 'k' : 黑色 * : 星號
':' : 虛線 b : 藍色 o : 圓圈
'-.' : 點劃線 c : 藍綠色 s : 方塊
'--' : 雙劃線 g : 綠色 p : 五角星
m : 洋紅色 ^ : 朝上三角符號
r : 紅色 X : 叉
w : 白色 + : +
y : 黃色 d : 菱形
v : 朝下三角符號
< : 朝左三角符號
> : 朝右三角符號
H : 六角形

這些就是基本的繪圖參數指令,搭配使用效果更佳。關於參數的使用是在每種方法中都可以添加,三種常用示例只是簡單示例。關於第三種使用方法,意思是把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,y2)

三維作圖

在上文的二維作圖示例中我們可以知道二維作圖的基本方法,而有時候二維的圖形滿足不了我們的需要,這個時候就需要做一些三維圖像了,而三維圖像裏邊除了包含曲線作圖之外還包含曲面作圖。

三維曲線

在二維曲線作圖裏邊我們主要使用的函數是plotfplot函數,而在三維曲線作圖裏面我們使用的是plot3fplot3函數,其不但長得像,功能也是差不多的,只不過是做了擴展而已。

  • 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等繪圖函數命令之外,還有有一些其它修飾圖形的常用命令。

指令 作用
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中還有兩個非常重要的函數:
  • setget,它們兩個能非常方便的創建、修改圖形的各種屬性,如改變座標軸範圍、設置字體和刻度點、設定線條風格等等,不過它們涉及到的使用更深入,在這裏不再展開敘述,而事實上,對於我們非常熟知的figure,它也能加上參數來對窗格進行設置,這都是我們經常使用的,但也是經常忽略它們其它功能的函數,如果有興趣,你可以繼續的深入探索下去,更深入的學習能更方便的爲我們所用。

總結

好了,感謝你能看到這裏,對於這篇文章,它可能的側重點不是完全教會我們怎麼作圖,而更多的也可能是提醒我們在Matlab裏面可以進行如此操作,對於新手而言,很多沒有系統的學習過Matlab的使用,可能裏面的很多東西不是我們不會用,而是根本不知道,所以這篇文章大致列出來了很多非常常用的函數方法等,其中的示例僅僅是個示例,它們的用法還有很多,希望大家能夠進行再次開拓,深入的瞭解每個方法的使用。最後,如果你覺得本篇文章對你有用,請點個贊,謝謝!

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