12/31/2006

如何在同一畫面中指定繪製兩圖

圖軸axes之應用


使用guide進行介面製作時,比較常見的困擾是當同一個畫面使用兩個以上圖時,常常繪製之圖內容會一直繪製在同一圖框上。為避免這種情形發生,可以應用handles這個結構矩陣。這是在guide中專屬的資料參數。

話說在同一畫面中,若有許多圖軸時,通常它會以axes1,axes2,...表示。故當對應某特定按鈕之回叫函數呼叫時,其內容需加上此類似指令,以呼叫第一圖軸(axes1)為例:

axes(handles.axes1)
plot(...)


若不在第一行設定圖軸,在執行時亦可用滑鼠指向要顯示的圖軸,然後再按指定之按鈕即可。這種方式的應用可依實際需求而定。

第一行亦可寫成如下之形式,但其表現之外觀則有不同,若想做子母圖之讀者不妨自行一試:

axes('Tag','axes1')


雙圖應用例


下面為matlab介紹的一個雙圖之例子。先利用guide製造圖形介面,第一個圖軸之標籤為frequency_axes,第二圖軸為 time_axes。介面之右邊有三個edit輸入口,分別為f1,f2及t值,最後一個按鈕為plot。在此edit輸入口並沒有回叫函數,故僅能就現有之值取出計算。其初值通常在屬性表中設定。



(圖摘自mathworks.com)

其對應之程式在.m檔中,大致上與其他檔案相同。比較大差異在於plot之回叫函數部份。其程式內容如下:


function varargout = plot_button_Callback(h, eventdata, handles, varargin)
% hObject handle to plot_button (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)

% Get user input from GUI
f1 = str2double(get(handles.f1_input,'String'));
f2 = str2double(get(handles.f2_input,'String'));
t = eval(get(handles.t_input,'String'));

% Calculate data
x = sin(2*pi*f1*t) + sin(2*pi*f2*t);
y = fft(x,512);
m = y.*conj(y)/512;
f = 1000*(0:256)/512;;

% Create frequency plot
axes(handles.frequency_axes)
plot(f,m(1:257))
set(handles.frequency_axes,'XMinorTick','on')
grid on

% Create time plot
axes(handles.time_axes)
plot(t,x)
set(handles.time_axes,'XMinorTick','on')
grid on


在plot_bottom_Callback回叫函數中,開頭三行為處理輸入之值,前兩項屬f1及f2值之轉換,後一項則為t值之範圍,由於是一個字串輸入,故必須使用eval函數就其內容執行後置於t變數之中。

其後將計算之頻率資料繪製於frequency_axes之圖軸上,並將對應於時間t之x資料繪於time_axes軸上。