1. 程式人生 > >Matlab中的圖形控制代碼(轉載)

Matlab中的圖形控制代碼(轉載)

在matlab中,每一個物件都有一個數字來標識,叫做控制代碼.當每次建立一個物件時,matlab就為它建立一個唯一的控制代碼

控制代碼中包含有該物件的相關資訊引數,可以在後續程式中進行操作,改變其中的引數,以便達到不同的效果

例如:gcf 是返回當前被啟用的視窗的控制代碼。你可以認為它就指代當前視窗。
figure(gcf)開啟這個視窗。

這兩天在看控制代碼式圖形方面的東西,以下是我在看書過程中整理的學習筆記,比較詳細的介紹了控制代碼以及與其密切相關的各種圖形物件和它們的屬性。希望能對初學Matlab介面設計的朋友們有所幫助。

GUI學習筆記:

控制代碼式圖形常用函式:
(1)get(h)返回控制代碼值h所指定的圖形物件的所有屬性名稱與相對應的屬性值
(2)a = get(h)返回由控制代碼值h所指定的圖形物件的屬性結構陣列,並且該陣列的欄位名稱就是該物件的屬性名稱。
(3)a = get(0,'factory')返回所有能由使用者設定的屬性的預設定義值。
(4)a = get(0,'FactoryObjectTypePropertyName1','FactoryObjectTypePropertyName2',...)返回指定物件型別指定的屬性值,輸入引數FactoryObjectTypePropertyName為一個關鍵詞,由字元Factory與圖形物件型別(如Figure)還有屬性名稱(如Color)組成。
a = get(0,'factoryFigureColor')返回Figure物件的Color屬性值。
(5)a = get(h,'DefaultObjectTypePropertyName1','DefaultObjectTypePropertyName1',...)返回控制代碼值為h的物件指定屬性的預設值。如“DefaultFigureColor”。
(6)a = get(h,'default')列出h物件的所有屬性的預設屬性值


(7)a = set(h)返回控制代碼值h所指定的圖形物件的所有屬性名稱對應的可設定屬性值,a為結構陣列,儲存物件的屬性名稱,其欄位值為相對應的屬性值。屬性值中用{}括起來的表示預設值。
(8)set(h,a)使用指定的屬性值來設定由控制代碼值h所指定的物件屬性,a為結構陣列,其欄位名稱為物件的屬性名稱,欄位值為相對應的屬性值。
(9)a = set(0,'factory')返回那些使用者可以設定預設值的所有物件的屬性,同時顯示可設定的屬性值。
(10)a=set(0,'FactoryObjectTypePropertyName')返回所有物件中指定的屬性名稱FactoryObjectTypePropertyName的所有可能的屬性值。
(11)a = set(h,'屬性名','屬性值')設定控制代碼值為h的物件的與屬性名對應的屬性值

(12)set(h,'DefaultObjectTypePropertyName1','DefaultObjectTypePropertyName2',...)對控制代碼值為h的物件設定特定屬性名稱的屬性預設值。
(13)H = findobj;返回Root物件與其所有子物件的控制代碼值
(14)H = findobj(h);返回h變數的控制代碼值
(15)H = findobj(’屬性名稱‘,’屬性值‘);依據物件的屬性名稱和屬性值找出匹配的物件控制代碼值。
(16)H = findobj(ObjectHandles,’屬性名稱‘,’屬性值‘);根據限定的物件列表找出與物件的屬性名稱和屬性值匹配的物件控制代碼值
(17)gcf返回當前Figure物件的控制代碼值
gca返回當前axes物件的控制代碼值
gco返回當前滑鼠單擊的控制代碼值,該物件可以是除root物件外的任意圖形物件,並且Matlab會把當前圖形物件的控制代碼值存放在Figure的CurrentObject屬性中

Figure物件的屬性篇
(1).^是矩陣每個元素的冪乘,^是數的冪乘。
(2)set(handle)列出控制代碼值為handle的物件的所有屬性
get(handle)除列出上述屬性外,還列出可以設定的屬性
reset(handle)將所有屬性改為預設值
delete(handle)刪除控制代碼值為handle的圖形物件
(3)利用set(handle,‘屬性名稱’)獲得控制代碼值為handle的物件的屬性名稱下所有可設定的屬性值
set(gcf,'units):得到[ inches | centimeters | normalized | points | {pixels} | characters ],其中,大括號中是預設值
(4)clf reset;將視窗關閉,並重新設定其屬性為預設值。
(5)Closerequestfcn,有效值為字串或函式控制代碼(前加@)
當關閉繪圖視窗或離開Matlab時,就會定義Closerequestfcn定義的函式
(6)createfcn,當Matlab建立一個物件時(如為figure物件,即開啟一個繪圖視窗),就會觸發createfcn所定義的callback程式。如set(0,'defaultfigurecreatefcn','set(gcbo,''integerhandle'',''off'')');即設定了根物件的預設值,使每次建立figure物件時,都會指定一個非整數的控制代碼值。(在使用者未指定控制代碼值時)
(7)將當前視窗中在鍵盤上按下的按鍵名顯示出來。
set(gcf,'keypressfcn','get(gcf,''currentcharacter'')')
(8)color有效值為colorspec
colorspec表:
RGB 簡稱
[110] y_yellow
[101] m_magenta
[011] c_cyan
[100] r_red
[010] g_green
[001] b_blue
[111] w_white
[000] k_black
(9)linspace(a,b,c):a初始b結束c線性分段次數linspace(a,b)則預設100次
(10)CurrentObject:有效值為圖形物件控制代碼值:返回繪圖視窗內當前被滑鼠選取的物件的控制代碼值
(11)currentPoint:有效值[x-座標,Y-座標]返回繪圖視窗中最後單擊滑鼠的位置,用get(gcf,'currentpoint')就會返回當前在視窗中單擊滑鼠的位置
(12)DeleteFcn:有效值:字串或函式控制代碼,刪除物件(這裡為figure)時會觸發Deletefcn所定義的Callback程式。
(13)Dockcontrols:有效值為on/off,預設值on,控制視窗的嵌入效果是否可用。
(14)Hittest:有效值on/off,決定能否用滑鼠選取物件為當前物件。
(15)Integerhandle:有效值on/off,決定Figure物件控制代碼值的型別為整數或浮點小數。
(16)Interruptible:有效值on/off,執行過程中需要中斷程式而優先執行其他程式時要設該屬性為on。即Interrupptible屬性是用以控制當Callback執行時是否能被其他事件(如此時滑鼠按下其他控制物件)而中斷,on是會中斷,off時會執行完當前Callback,再去執行其他Callback。
(17)Keypressfcn:有效值為字串或函式控制代碼。當用戶在figure視窗中按下鍵盤的任意鍵時,就會執行Keypressfcn所定義的Callback程式。
figure('keypressfcn','fprintf(''當前按下鍵盤上的%c鍵\n'',get(gcf,''currentcharacter''))')在這個figure視窗中按下鍵盤上的按鍵時就會立即返回對應的字元,依據這個效果就可以決定當字元鍵被按下時所要執行的操作。
當這個屬性指定的值是一個函式控制代碼時,Matlab就會將這個函式視為一個結構,包含下列欄位——character(以當前鍵盤上按下的按鍵顯示的字元來當作結果),modifier(包含一個或多個識別鍵盤上按下按鍵字元名稱的細胞陣列(如Ctrl,Alt,Shift等),key(顯示被按下的鍵)。
(18)WindowButtonDownFcn:有效值為字串或函式控制代碼
當滑鼠在繪圖視窗內按下滑鼠任意鍵時,將觸發WindowButtonDownFcn所定義的Callback以產生相對應的操作。
(19)WindowButtonMotionFcn:有效值為字串或函式控制代碼
當滑鼠在繪圖視窗內按住滑鼠任意鍵移動,將觸發WindowButtonMotionFcn所定義的Callback以產生相對應的操作。
(20)WindowButtonUpFcn:有效值為字串或函式控制代碼
當滑鼠在繪圖視窗內釋放滑鼠任意鍵時,將觸發WindowButtonUpFcn所定義的Callback以產生相對應的操作。
(21)CurrentAxes有效值為當前座標軸的控制代碼值,返回當前的座標軸控制代碼值。假設某座標軸控制代碼值為a_h,可以使用axes(a_h)或set(gcf,'currentaxes',a_h)這兩種方式,制定控制代碼值為a_h的座標軸為當前座標軸。
(22)CurrentCharacter:有效值為任意字元,返回使用者在繪圖視窗中最後輸入的一個字元,即剛在鍵盤上按下的字元鍵將儲存到Currentcharacter中,一般於Keyppressfcn合用。
(23)Currentobject有效值為圖形物件的控制代碼值,返回繪圖視窗內當前被滑鼠選取的物件的控制代碼值。
(24)有效值為兩元素的向量,[X座標,Y座標]
返回繪圖視窗中最後單擊滑鼠的位置,與Windowbuttonmotionfcn,Windowbuttonupfcn合用。使用get(gcf,'currentpoint')就會返回當前在視窗中單擊滑鼠的位置。

Axes物件的屬性
(1)title('new','color','r');給座標軸命名為new,紅色
title({'this title','has 2 '});命名為兩行的標題
(2)Units:有效值為pixels/normalized/inches/centimeters/points/characters
決定各種位置屬性的度量單位,相對於視窗左下角為基準。當設定為Pixels時,以畫素為單位;當設定為normalized時,以座標為單位,螢幕的左下角為[0,0],右上角為[1.0,1.0]。
(3)grid on:在影象中顯示網格。
(4)children:控制axes物件的子物件,即image\light\line\patch\rectangle\surface和text等物件,可通過get(gca,'children')來返回當前座標軸的子物件構成的控制代碼值向量。
(5)字型屬性:
Fontangle字型角度(正常normal或斜體italic/oblique)
Fontname字型名稱
fontsize字型大小(單位由Fontunits決定)
fontunits字型單位(points/normalized/inches/centimeters/pixels)
fontweight字型粗細(normal/bold/light/demi)
gridlinestyle決定座標軸網格線的樣式,‘-’為實線‘- -’為虛線‘:’為點線‘-.’為點虛線
plot(1:10);grid on;set(gca,'gridlinestyle','-.');將當前座標軸顯示的網格線為點-虛線
(6)linewidth 定義X,Y和Z軸的軸線寬度(以點單位定義)
(7)NextPlot:有效值為add|replace|replacechildren,預設為replace
add表示使用當前的座標軸,把新的圖形物件加到此座標軸中是一般保留的做法,replace表示重新設定座標軸的所有屬性(Position除外),也就是在繪圖前會刪除當前座標軸和它的子物件。replacechildren表示移除當前座標軸中所有子物件,但不重新設定座標軸的所有屬性
(8)Outerposition決定座標軸外邊界的位置。由位置向量[left,bottom,width,height]組成,其中left,bottom表示相對於繪圖視窗左下角的位置,width,height表示區域尺寸,預設為[0 0 1 1]
(9)Position由位置向量[left,bottom,width,height]組成,決定座標軸位置
(10)Tag定義本座標軸的卷展欄,因為每一個物件都有自己唯一的識別碼即tag,以方便findobj函式查詢座標軸控制代碼值。
(11)visible決定座標軸是否可見
(12)set(gca,'xgrid','on')繪製X軸垂直網格線
set(gca,'gridlinestyle',':','linewidth',3)設定網格線線條型別和寬度
set(gca,'box','on')將圖軸方框繪製出來
(13)set(gca,'xscale','linear');將X軸刻度設為線性
set(gca,'yscale','log');將Y軸刻度設為對數
(14)disp()顯示一個數組,但不顯示其陣列名稱
disp(' Corn Oats Hay')
disp(rand(5,3))
which results in
Corn Oats Hay
0.2113 0.8474 0.2749
0.0820 0.4524 0.8807
0.7599 0.8075 0.6538
0.0087 0.4832 0.4899
0.8096 0.6135 0.7741

Pause:pause, by itself, causes M-files to stop and wait for you to press any key before continuing.

例項:plot(1:10);set(gca,'yscale','log');
disp('請按下Enter鍵');
pause
set(gca,'Yscale','linear');本例是說按下Enter鍵將Y軸刻度由對數改為線性。
(16)Xtick,Ytick,Ztick:控制X,Y,Z軸座標刻度記號的位置,即控制座標軸上刻度記號的位置以及每隔多少值會到下一個刻度記號的位置,同時還需要配合Xticklabel、Yticklabel、Zticklabel屬性來調整。詳細見例程。
以下設定方式相同:
set(gca,'Xticklabel',{'1';'10';'100'})
set(gca,'Xticklabel','1|10|100')
set(gca,'Xticklabel',[1;10;100])
set(gca,'Xticklabel',['1 ';'10 ';'100'])
(17)Findobj:查詢

Line物件
當用戶建立一個線物件時,就會觸發Createfcn所定義的Callback產生相對應的操作;同樣,若刪除一個線物件時,就會觸發DeleteFcn所定義的Callback產生相對應的操作。以下程式建立一個線物件,並設定DeleteFcn為一個問題對話方塊,當刪除該線物件時,就會顯示其問題對話方塊來詢問使用者。
(1) clipping:有效值為on/off,預設值為on
設定座標軸土筐是否可以剪輯,如果設為off,則繪製線物件時可超出座標軸的圖框。
(2)Linewidth:有效值為純量(與向量相對,只有大小而無方向),點為單位。
(3)Marker:有效值為字元,決定Line物件的記號型別,有+,o,*,.,x,s,d,等
(4)Markersize:有效值為純量,單位為點,Marker的大小。
(5)UIcontextmenu:有效值為uicontextmenu物件的控制代碼值,定義與線物件相關聯的uicontextmenu選單,因此當用戶將該線物件的屬性UicontextMenu設定為相關聯的uicontextmenu物件的Tag名稱時,uicontextmenu就可以在該線物件上單擊滑鼠右鍵來顯示uicontextmenu選單。
(6)Tag:有效值為字串,定義改線物件的卷展欄(即標記)
(7)Type:有效值為字串(只讀),此處為’line‘字串。
(8)Xdata,Ydata,Zdata:有效值為座標陣列,指定產生線條的資料點,若為2D環境則Xdata、Ydata需要有相同數目的資料,而Zdata為空矩陣;3D環境則Xdata,Ydata,Zdata三者都需要有相同數目的資料。
例:x=0:5,y=x+10;line('xdata',x,'ydata',y);

Patch物件
patch函式不想其他高階區域建立函式(fill和area),只是簡單地將patch物件新增到當前座標軸中而已。
使用:patch(X,Y,C)
在當前的座標軸中新增二維填充的patch物件,X和Y用以定義patch物件頂點的位置,若X,Y為矩陣,則Matlab按每一行的元素來產生多個多邊形。
例:x = [0 0;0 1;1 1];
y = [1 1;2 2;2 1];
z = [1 1;1 1;1 1];(x(1,1),y(1,1),z(1,1)為第一個面的第一個頂點,x(2,1),y(2,1),z(2,1)為第一個面的第二個頂點,以此類推)
tcolor(1,1,1:3) = [1 1 1];
tcolor(1,2,1:3) = [.7 .7 .7];
patch(x,y,z,tcolor);(tcolor是一個1*2*3的三維矩陣)

Surface物件
surface可以建立一個surface物件,surface是由矩陣資料所在的列索引值為X座標,而行索引值為Y座標,並且矩陣的每個元素值為Z座標。

image物件
image(C)將矩陣C當作一個影象來顯示,C的每一個元素定義一個影象中矩陣線段的顏色。
image(x,y,C)其中x與y為2元素的向量,分別指定X軸與Y軸卷展軸的範圍。C為影象矩陣。

text物件
(1)text(x座標,y座標,'string')在圖形中指定位置(x,y)顯示字串string。
(2)Editing有效值為on/off,off時,使用者在執行GUI操作時無法直接在該Text物件上進行編輯,改為on後,可以進行編輯。
(3)HorizontalAlign 有效值為left/center/right決定Text物件中字元水平方向的對齊方式。
(4)Interpreter有效值為tex/none,決定Text物件中是否可用Tex字元註釋,當設定為Tex時,表示允許使用者能夠在String屬性下輸入Tex字元。以下為在視窗的 [.5 .5]點位置處建立一個text物件並且字型大小以16點來表示的一個方程式。(顯示的是一個二重積分)
text('interpreter','latex','string','

x0ydF(u,v) ','position',[.5 .5],'fontsize',16)
(5)String有效值為字串,表示要顯示出來的字串是什麼。
(6)verticalAlignme 有效值為top/cap/middle/baseline/bottom決定Text物件垂直對齊的方式。

下面載入一個例子,是ilovematlab論壇一個斑竹的回覆
x=0:0.5:10;
>> y1=sin(x);
>> y2=cos(x);
>> plot(x,y1,'r',x,y2,'g')
>> findobj(gca,'color','r')

不想要的曲線直接delete控制代碼就可以了