matlab 找到数组中第一个不连续点_超全Matlab绘图方法整理
使用Matlab繪圖
圖像是結果的一種可視化表現,它能直觀的體現你的結果,并且能體現你獲得結果的準確性,在當前的大數據時代,在做數據分析的時候,將其可視化可以直觀多維的展示數據,可以讓人們更好的發現并且記住數據的特征,因此很多時候掌握一些繪圖方法是非常重要的,而使用MATLAB可以非常簡單的進行繪圖(當然還有很多其它工具可供使用),下文是我所了解的一些基本繪圖方法的整理,其中很多很多內容非常基礎,希望對你能有些幫助。二維作圖
二維圖像是我們在學習過程中經常會接觸到的圖像,比如在做數學題目時隨手畫出的一個正弦曲線,這個圖像往往是我們根據它的函數做出來的,事實確是這樣,在我們學習過程中畫出來的每一個圖像幾乎都是函數,反過來說,每一個函數都對應著它自己的圖像,我們能畫出來的二維圖像往往是一個一元函數即二元方程,在Matlab中做二維圖像也是這樣,我們根據一個函數來畫出它的圖像,不過要注意的一點是,在Matlab畫圖的過程中,它并不認識你給出的那個函數,它要做的僅僅是把你給出的函數上的點連成線而已。- plot和fplot
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 : 六角形 |
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
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?=?tplot3(x,y,z)
對于plot3函數來講,它的參數x,y,z不止可以是一維數組,實際上:
- 參數x、y、z是同型矩陣時,以x、y、z對應列元素繪制曲線,曲線條數等于矩陣列數。
- 參數x、y、z中有向量,也有矩陣時,向量的長度與矩陣相符。
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.利用矩陣運算生成:
?Y?=?y*ones(size(x))
- 2.利用meshgrid函數生成:
- 繪制三維曲面的函數
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=peakspeaks(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)首先,創建一個色圖矩陣方法如下:
其中,parula是內建色圖中包含的一個種類,其中參數5可以是任何一個數值,它關系著色圖矩陣的范圍,一般來說使用的時候省略就好。內建色圖如下:
- 指定當前圖形使用的色圖
?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 | 網格片內采用顏色插值處理 |
?colormap(lines)
?subplot(1,3,1)
?surf(x,y,z);
?shading?flatsubplot(1,3,2)surf(x,y,z);
?shading?interpsubplot(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)?=?NaNplot(x,y)axis([-1.1,1.1,-1.1,1.1])
?axis?square
?grid?on
其它
- 其實在Matlab中還有兩個非常重要的函數:
- set和get,它們兩個能非常方便的創建、修改圖形的各種屬性,如改變坐標軸范圍、設置字體和刻度點、設定線條風格等等,不過它們涉及到的使用更深入,在這里不再展開敘述,而事實上,對于我們非常熟知的figure,它也能加上參數來對窗格進行設置,這都是我們經常使用的,但也是經常忽略它們其它功能的函數,如果有興趣,你可以繼續的深入探索下去,更深入的學習能更方便的為我們所用。
總結
好了,感謝你能看到這里,對于這篇文章,它可能的側重點不是完全教會我們怎么作圖,而更多的也可能是提醒我們在Matlab里面可以進行如此操作,對于新手而言,很多沒有系統的學習過Matlab的使用,可能里面的很多東西不是我們不會用,而是根本不知道,所以這篇文章大致列出來了很多非常常用的函數方法等,其中的示例僅僅是個示例,它們的用法還有很多,希望大家能夠進行再次開拓,深入的了解每個方法的使用。最后,如果你覺得本篇文章對你有用,請點個贊,謝謝!???end???
走在路上
goldsunC
總結
以上是生活随笔為你收集整理的matlab 找到数组中第一个不连续点_超全Matlab绘图方法整理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [硬件技术] 教你如何挑选主板:电脑主板
- 下一篇: matlab人脸追踪,求大神帮助我这个菜