天天看點

matlab hist函數_超全Matlab繪圖方法整理(建議收藏!)

你好,我是

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*')
           
matlab hist函數_超全Matlab繪圖方法整理(建議收藏!)

可以看到,x是一個長度為1001的一維數組,y是和x等長的在sin(x)上的一維數組,後邊的

-r*

分别為曲線線性、顔色、資料點标記,其中參數的一些具體屬性如下表所示:

matlab hist函數_超全Matlab繪圖方法整理(建議收藏!)

這些就是基本的繪圖參數指令,搭配使用效果更佳。

關于參數的使用是在每種方法中都可以添加,三種常用示例隻是簡單示例

。關于第三種使用方法,意思是把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')
           
matlab hist函數_超全Matlab繪圖方法整理(建議收藏!)

在第二種方法中,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 hist函數_超全Matlab繪圖方法整理(建議收藏!)

其它形式下的二維曲線圖

上文舉例說明了最基礎最常用的兩個做二維曲線的函數,實際上,二維圖形的種類還有很多,不光隻有一根線構成的曲線圖,還有各種統計圖、坐标圖等等,相應的在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)
           
matlab hist函數_超全Matlab繪圖方法整理(建議收藏!)

第一個,參數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)
           
matlab hist函數_超全Matlab繪圖方法整理(建議收藏!)
  • 散點類圖形

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')
           
matlab hist函數_超全Matlab繪圖方法整理(建議收藏!)
  • 矢量類圖形

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
           
matlab hist函數_超全Matlab繪圖方法整理(建議收藏!)
  • 進階:雙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)
           
matlab hist函數_超全Matlab繪圖方法整理(建議收藏!)

三維作圖

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

三維曲線

在二維曲線作圖裡邊我們主要使用的函數是

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')
           
matlab hist函數_超全Matlab繪圖方法整理(建議收藏!)

怎麼樣,是不是非常簡單,假如要繪制個空間的螺旋線,其參數方程為: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)
           
matlab hist函數_超全Matlab繪圖方法整理(建議收藏!)

對于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平面網格坐标矩陣:

matlab hist函數_超全Matlab繪圖方法整理(建議收藏!)

說的簡單些,就是給我們要用的空間坐标系做個

底面

出來,本來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)
           
matlab hist函數_超全Matlab繪圖方法整理(建議收藏!)
  • 标準三維曲面

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

matlab hist函數_超全Matlab繪圖方法整理(建議收藏!)

這些呢是一些常用的輔助繪圖指令,沒有參數,直接在腳本輸入就行,功能已經列在表中非常明确,大家可以自行練習檢視實用效果。

接下來是一些帶參數的繪圖指令,它們可以幫你進行圖形标注、坐标控制等等一系列功能,非常實用,記得好好學習。

圖形标注函數

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')
           
matlab hist函數_超全Matlab繪圖方法整理(建議收藏!)
  • 圖形視窗分割函數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)
           
matlab hist函數_超全Matlab繪圖方法整理(建議收藏!)

圖形修飾處理

前面寫了一些基本繪圖指令,可以對我們的圖形進行簡單的修整,讓其變得更完備更好看,接下來是一些對圖形修飾的方法。

視點處理

  • 方位角:視點與原點連線在xy平面上的投影與y軸負方向形成的角度,正值表示逆時針,負值表示順時針。
  • 仰角:視點與原點連線與xy平面的夾角,正值表示視點在xy平面上方,負值表示視點在xy平面下方。
matlab hist函數_超全Matlab繪圖方法整理(建議收藏!)
  • 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)
           
matlab hist函數_超全Matlab繪圖方法整理(建議收藏!)

色彩處理

預設的,向量元素在[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可以是任何一個數值,它關系着色圖矩陣的範圍,一般來說使用的時候省略就好。内建色圖如下:

matlab hist函數_超全Matlab繪圖方法整理(建議收藏!)
  • 指定目前圖形使用的色圖
//以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)
           
matlab hist函數_超全Matlab繪圖方法整理(建議收藏!)
  • 用shading函數來改變着色方式 參數如下:
matlab hist函數_超全Matlab繪圖方法整理(建議收藏!)

示例:使用同一色圖,以不同着色方式繪制圓錐體

[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)
           
matlab hist函數_超全Matlab繪圖方法整理(建議收藏!)

圖形的裁剪處理

将圖形中需要裁剪部分對應的函數值設定成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 hist函數_超全Matlab繪圖方法整理(建議收藏!)

其它

  • 其實在Matlab中還有兩個非常重要的函數:
  • set

    get

    ,它們兩個能非常友善的建立、修改圖形的各種屬性,如改變坐标軸範圍、設定字型和刻度點、設定線條風格等等,不過它們涉及到的使用更深入,在這裡不再展開叙述,而事實上,對于我們非常熟知的

    figure

    ,它也能加上參數來對窗格進行設定,這都是我們經常使用的,但也是經常忽略它們其它功能的函數,如果有興趣,你可以繼續的深入探索下去,更深入的學習能更友善的為我們所用。

總結

好了,感謝你能看到這裡,對于這篇文章,它可能的側重點不是完全教會我們怎麼作圖,而更多的也可能是提醒我們在Matlab裡面可以進行如此操作,對于新手而言,很多沒有系統的學習過Matlab的使用,可能裡面的很多東西不是我們不會用,而是根本不知道,是以這篇文章大緻列出來了很多非常常用的函數方法等,

其中的示例僅僅是個示例

,它們的用法還有很多,希望大家能夠進行再次開拓,深入的了解每個方法的使用。最後,如果你覺得本篇文章對你有用,請點個贊,謝謝!

繼續閱讀