11/06/2006

9.6Subplot 併圖指令

同一頁面要繪製許多圖時,可以使用subplot(m,n,p)這個併圖指令,如此可以將一個大圖分成好幾個區,然後依各區需要進行繪圖。其語法如下:


subplot(m,n,p) 或 subplot mnp
subplot(m,n,p,'replace')
subplot(m,n,p,'align')
subplot(h)
subplot('Position',[left bottom width height])
h = subplot(...)

subplot(m,n,p)這個併圖指令,亦可使用subplot mnp的型式。其主要功能是將一個大圖分成好幾個區,然後依各區需要進行繪圖。這個指令中之三個參數各有不同,前兩個為圖安排之矩陣位置,例如以m x n之矩陣型式分為mn個小圖,而p則是指向第幾個要畫的圖的位置,是一個指標,其範圍為1至mn間。例如:

subplot(2,2,1), plot(fig1) %在2x2之四個圖中,繪第1個小圖
subplot(2,2,2), plot(fig2) %在2x2之四個圖中,繪第2個小圖
subplot(2,2,3), plot(fig3) %在2x2之四個圖中,繪第3個小圖
subplot(2,2,4), plot(fig4) %在2x2之四個圖中,繪第4個小圖

此外,也可以有其他參數,如語法中,'replace'將原先繪圖之內容取代新值;'align'將所設之值對齊。而'Position'則是自訂位置,不用平均分攤的方式。

下面為繪製二小圖,一左一右,置於同一圖中的情形。

%Demo_15 Multi-plot
[x1]=0:.1:10;
[y1]=1-exp(-0.5*sqrt(x1));
[y2]=exp(-0.5*sqrt(x1));
subplot(1,2,1),plot(x1,y1,'b')
grid on
xlabel('x1')
ylabel('y1')
title('y1 versus x1')
subplot(1,2,2),plot(x1,y2,'k:')
grid on
xlabel('x1')
ylabel('y22')
title('y2 vs x1')






下面之小程式是利用前面的x1, y1、x1,y2之資料繪出上下合併之圖,執行後之結果如下6。兩圖並置時,縱軸會較高,若以四圖並構則較不會失真。讀者不妨試它一試。

clf;
subplot(2,1,1), plot(x1,y1)
subplot(2,1,2), plot(x1,y2)





上面小程式執行後之結果如上圖16。兩圖並置時,縱軸會較高,若以四圖並構則可以獲得較為均勻的比例,例如:


%Demo_16 subplot for 4 graphs in log-scale
[x]=0:.1:10;
[y]=1-exp(-0.5*x);
subplot(2,2,1),plot(x,y,'b'); grid on;
xlabel('x') ; ylabel('y') ; title('y versus x')
subplot(2,2,2),semilogx(x,y,'k') ; grid on;
xlabel('x') ; ylabel('y') ; title('y versus log(x)')
subplot(2,2,3),semilogy(x,y,'r') ; grid on;
xlabel('x') ; ylabel('y') ; title('log(y) versus x')
subplot(2,2,4),loglog(x,y,'m') ; grid on;
xlabel('x') ; ylabel('y') ; title('log(y) versus log(x)')






上述內容有兩點值得注意:其一是圖的序號是依列向編排,所以1,2是第一列;圖3,4是第二列。其二是各圖所用的資料是獨立的,後者不會應用到前者。所以各圖若要顯示一致,即使相同的內容,也要個別處理。上圖係利用對數座標顯示,可以充分表現對數軸與半對數軸之利用。通常要以對數座標或半對數座標表示時,其相關指令如下:

semilogx(Y,X) 將X座標以對數而Y座標正常繪圖。
semilogy(Y,X) 將Y座標以對數而X座標正常繪圖。
loglog(Y,X) 座標XY均以對數表示繪圖。


在上述應用例中,格線指令grid也相當重要,格線則用開關的方式,grid on為打開,grid off為關閉,是一個十分靈光的指令。

在四分圖表示法中,亦可顯示成三圖的架構。此時在subplot指令之最後項必須採用向量型式,如subplot(2,2,[1 2]) 表示上兩圖合併,而subplot(2,2, [1 3])表示左兩圖合併。


subplot(2,2,[1 2]),plot(x,y,'b'); grid on;
xlabel('x') ; ylabel('y') ; title('y versus x')
subplot(2,2,3),semilogx(x,y,'k') ; grid on;
xlabel('x') ; ylabel('y') ; title('y versus log(x)')
subplot(2,2,4),semilogy(x,y,'r') ; grid on;
xlabel('x') ; ylabel('y') ; title('log(y) versus x')




subplot(2,2,[1 3]),plot(x,y,'b'); grid on;
xlabel('x') ; ylabel('y') ; title('y versus x')
subplot(2,2,2),semilogx(x,y,'k') ; grid on;
xlabel('x') ; ylabel('y') ; title('y versus log(x)')
subplot(2,2,4),semilogy(x,y,'r') ; grid on;
xlabel('x') ; ylabel('y') ; title('log(y) versus x')