有時候,我們遇到座標軸的刻度不是數字而是文字時,常常因為間距不夠,就疊在一起,像下圖的慘狀。

irrotate.jpg  

此時,如果能夠將文字轉個方向,問題就解決了。

  在Matlab中,X座標軸刻度叫作XtickLabel,目前沒有內建的指令用以轉動其文字的方向。最常見的做法就是,把原本的tick label除去,再用text的方式將每個刻度標上。指令如下:

%一筆y(x)的數據
x = 1:12;
y = 10*rand(1,length(x));

%畫圖
figure
plot(x,y);

%設定座標軸刻度
set(gca,'XTick',[1:d:n]);
set(gca,'XTickLabel',[]);

  gca指『目前這張圖』; 'XTick'用來設定X座標的刻度大小,[1:d:n]表示刻度最小從1開始,一直畫到n,這個範圍以外的都不畫。d是刻度的間距,例如[1:2:10]就會產生1、3、5...9的刻度、[1:1:10]會產生1、2、3...10度。d也可以不要是整數,視作圖需求而定。

  決定好刻度的間距跟範圍後,如果你不作更動,它顯示的標籤通常是數字。如果你想改成文字或時間,用'XTickLabel'逗號後面放你所要標示的文字{'第一個刻度標籤';'第二個刻度標籤';...;'第n個刻度標籤'},例如月份{'Jan';'Feb';'Mar';'Apr';'May';'Jun';'Jul';'Aug';'Sep';'Oct';'Nov';'Dec'}若你有12個刻度,你卻只提供3個標籤,那這3個標籤就會一直重複出現,直到標完所有刻度為止。

  但若要轉動文字的方向,我們就不在此時放上標籤,而是在'XTickLabel'後面放[],把所有標籤清除。

%產生一串文字標籤作X軸的刻度標籤
xposi=[1:d:n];
yposi=(ymin-1)*ones(1,n); 
text(xposi, yposi, {'Jan';'Feb';'Mar';'Apr';'May';'Jun';'Jul';'Aug';'Sep';'Oct';'Nov';'Dec'}, 'HorizontalAlignment', 'right', 'rotation', 90);

  text的指令用來在圖形視窗中產生文字。第一個參數xposi為一個一維向量,用來指定每一個標籤在水平方向的位置,以X座標值為參考,例如[1,2,3...12],或簡單的表示方式[1:1:12]。第二個參數yposi也是一個一維向量,用來指定每一個標籤垂直方向的位置,以Y座標值當參考。不同於水平方向等間隔擺開,X座標的標籤位於同一個垂直高度,所以我們要產生一個一維向量,裡面的數值比Y軸的最小值再往下一個單位(才不會蓋在圖上面),例如你Y軸的最小值為-5,那你的ymin-1就是-6。ones(1:n)是產生n個1的意思,例如月份需要12個標籤,就用ones(1:12)=[1 1 1 1 1 1 1 1 1 1 1 1],再乘上(ymin-1) ,就指定完標籤的垂直高度了。

  接著,'HorizontalAlignment'用來設定文字要在水平線的下方(right)或者上方(left)。通常如果文字的轉動小於180度,就用'HorizontalAlignment', 'right';大於180度'HorizontalAlignment', 'left',這樣子標籤的字才不會蓋到圖。如果還有其他想要的屬性,例如字型大小('FontSize'),字體粗細('FontWeight')都可以接在後面一併設定,這樣就不用等圖畫完再一個一個改了。

  重點來了, 'rotation'就是用來指定文字的方向,0就是水平,90就是順時針轉90度,依此類推。好了!大功告成~

  原本糊成一團的刻度終於重見光明~

rotate.jpg  

 

參考資料:http://www.mathworks.com/support/solutions/en/data/1-15TK6/

 

arrow
arrow

    馬鈴薯 發表在 痞客邦 留言(3) 人氣()