matlab制作小工具,Matlab有用的小工具小技巧
轉(zhuǎn)載地址:http://blog.sina.com.cn/s/blog_59cf672601015qmm.html
目錄:
1.使圖形窗口的默認(rèn)text解釋器為latex
2.圖形窗口最大化
3.雙坐標(biāo)
4.計時
5.局部放大子圖
6.Figure縮放字體
7.legend的Marker,line的屬性操作(多l(xiāng)egend,曲線減少marker數(shù))
8.eps圖片在latex中顯示不全
9.坐標(biāo)軸被遮住、保存后消失
10.使用一個目錄下的全部或某類文件
11. [原創(chuàng)]eps圖片中使用隱含信息做標(biāo)注
12. 生成高質(zhì)量透明矢量圖
13. imagesc中對nan的處理
14. 數(shù)據(jù)量比較大時保存真矢量eps圖
15. 坐標(biāo)軸在圖形中最大化
1.使當(dāng)前圖形窗口的默認(rèn)text解釋器為latex:
set(gcf,’DefaultTextInterpreter’,’latex’)
同理可推廣:
set(0,’DefaultTextInterpreter’,’latex’)
但是legend的解釋器似乎不受這個設(shè)置影響?(可以用’Interpreter’,’latex’來設(shè)置,但是感覺還是不爽。)
2.使圖形窗口最大化:
set(gcf,’outerposition’,get(0,’screensize’))
3.雙坐標(biāo)
[hax,hl1,hl2]=plotyy([x1,y1,x2,y2],[x3,y3]);
這將在左邊的坐標(biāo)軸里畫兩條曲線(x1,y1)和(x2,y2),而右坐標(biāo)軸畫一條(x3,y3)
對于坐標(biāo)軸的一些設(shè)置可以通過返回值來進(jìn)行操作
set(gcf,’CurrentAxes’,hax(1))//把當(dāng)前坐標(biāo)軸調(diào)成左邊的坐標(biāo)軸
set(gca,’Ylabel’,’xxxx’)//然后就可以正常操作這個坐標(biāo)軸,也可以使用hold on,增加曲線
4.計時
t0 = cputime; 程序;time=cputime-t0;
tic; 程序;toc;
t0 = clock; 程序;time = etime(clock, t0);
局部放大子圖
有一個mmzoom的擴(kuò)展,可以用鼠標(biāo)選區(qū)域來放大,用起來也挺好,不過不利于精確控制。
其實,要自己畫子圖也不難:
myzoom([0.18,0.18,0.4,0.3],[x0,x1,y0,y1])
通過筆者自己寫的簡單函數(shù)來實現(xiàn)放大:
function myzoom(position,axiscale)
ha=get(gcf,’CurrentAxes’);
ha1=copyobj(gca,gcf);
set(ha1,’position’,position)
set(gcf,’CurrentAxes’,ha1)
axis(axiscale)
xlabel(”)
ylabel(”)
set(gcf,’CurrentAxes’,ha)
其中position是字圖在當(dāng)前圖中的相對位置和大小,[x0,x1,y0,y1]是你要放大的坐標(biāo)范圍。
Figure縮放字體問題
讓字體隨figure的比例隨你設(shè)置的縮放比例而變:
hf=figure;
fp=get(hf,’position’);
times=2.0; %自定義縮放倍數(shù),
set(hf,’position’,[0 0 times*fp(3:4)]) %figure的縮放
set(gca,’FontSize’,times*get(gca,’FontSize’)) %gca上各種字體的縮放
xlabel(‘X’) %label在gca的fontsize設(shè)定之后寫,不用再單獨去設(shè)置它的字體
ylabel(‘Y’)
hc=colorbar;
set(hc,’FontSize’,times*get(hc,’FontSize’)) %假設(shè)有colorbar,實際上就是另外一個axes,同樣設(shè)置它的字體
參考:http://blog.csdn.net/benjmzhu/article/details/7246870
看了這個這里才知道輸出格式還可以Export Setup的,而set(findobj(‘FontSize’,10),’FontSize’,figure_FontSize);可以把所有的對象中字體大小為10的都改到想要的號啊!
7.legend的Marker,line等的操作
有這樣一個情況,曲線太多,用線型來表示是不夠的,只能用Marker、顏色結(jié)合線型來做。一般雜志還有要求,就是不用彩色也能說明每條曲線的意義,這樣就只能用Marker結(jié)合線型來做。但是如果杯具的是你的數(shù)據(jù)點太多,導(dǎo)致marker太多,全畫上的話根本看不清了。
解決這個問題最簡單的方法是:……哈哈,直接調(diào)用現(xiàn)成函數(shù)(筆者在原作者的基礎(chǔ)上做了一點修訂,使之在橫坐標(biāo)和縱坐標(biāo)范圍相差數(shù)值上很大時也能用,大家也可以考慮一下log坐標(biāo)的問題),當(dāng)在使用legend后再使用這個函數(shù),不會影響legend:
“nummarkers.m” http://pan.baidu.com/share/link?shareid=1072992811&uk=151290240
之前自己用的辦法其實原理上是一致的,也是用線把不同顏色的曲線畫一遍,然后每條曲線少用點Marker再畫一遍,這樣涉及到legend怎么展示,就是要對legend的線型、顏色進(jìn)行自定義。
x=0:0.0001:2*pi;
y1=sin(x);y2=cos(x);
figure
hold on
box on
n=1000;
hl(1)=plot(x(1:n:end),y1(1:n:end),’rd’);
hl(2)=plot(x(1:n:end),y2(1:n:end),’go’);
lstr={‘sin(x)’,’cos(x)’};
plot(x,y1,’r’)
plot(x,y2,’g’)
[hleg chleg hplot hlabel]=legend(hl,lstr,’location’,’southwest’);%hplot,hlabel在R2013a里可以用~代替
set(chleg,’linestyle’,’-‘)
比較不解的是對chleg里包含的對象分別操作的時候:比如set(chleg(1),’linestyle’,’.-‘),這樣的操作用get(chleg(1))來看是正常的,但是圖上卻沒有反應(yīng)!!!
8.eps圖片在latex中顯示不全的問題。
表現(xiàn)為eps圖片用latex插入,會顯示不全,出現(xiàn)在pdf里面看到的圖是一部分被截掉的情況。
原因在于eps圖片papersize的設(shè)置得太小,圖片超過了paper的范圍。
(筆者也不太明白bounding box和papersize各是什么,在matlab里面還有paperposition設(shè)置,這個和bounding box是對應(yīng)的么?papersize設(shè)成A0,但是打印出來的圖卻是緊湊的,尺寸并不是這個papersize啊!)。
這里給筆者使用命令的解決方案:
set(gcf,’PaperType’,’A0’)
set(gcf,’PaperPositionMode’,’auto’)
print(‘vtth_vt_vc_59_p’,’-depsc’);
根據(jù)matlab的幫助文件,最好在設(shè)置PaperTyper前設(shè)置一下PaperUnit。當(dāng)然PaperSize是可以自己設(shè)置的(PaperType給了幾個默認(rèn)設(shè)置而已:http://en.wikipedia.org/wiki/Paper_size#C_series)。
set(gcf, ‘PaperUnits’, ‘inches’);
set(gcf, ‘PaperSize’, [5 7]);
參考:
http://blog.sciencenet.cn/blog-533656-428329.html
http://blog.renren.com/share/236157660/13151799720
http://nibot-lab./73290.html
9.坐標(biāo)軸被遮住、保存后消失
set(gca,’Layer’,’top’) %坐標(biāo)軸被遮
set(gca,’LineWidth’,2) %保存成png圖片后坐標(biāo)軸消失了,可能是由于坐標(biāo)軸太細(xì)造成的(困擾我許久,比如用patch設(shè)置透明后坐標(biāo)軸消失,用pcolor后坐標(biāo)軸消失)
使用目錄下的所有或一類文件
files=dir(‘*.txt’);
for i=1:length(files)
a=load(files(i).name);
end
注意linux下直接用dir命令會得到所有文件和目錄(files.isdir=1),目錄中還會含有當(dāng)前目錄“.”和上級目錄“..”。
自己寫的話,linux下可以考慮用system命令結(jié)合regexp(str,’\t+\s+’,’split’),還是挺麻煩,不如直接用dir的方便。
[原創(chuàng)]eps圖片使用隱含信息標(biāo)注
因為eps圖片開頭有一些信息描述文件名、標(biāo)題、創(chuàng)建者等信息,所以我們可以把一些不需要在圖形中顯示但是又需要的信息全部放到eps文件隱含的注釋信息里面。(這樣信息不會輕易隨文件名更改而改變。這有沒有讓你想到基因序列里面的外顯子和內(nèi)含子呢?說不定人類的基因里的內(nèi)含子還真是創(chuàng)造者植入的注釋或者后門呢,哈哈。。。)
那么怎么放進(jìn)去呢?其實eps是基于文本的,把它當(dāng)文本文檔打開就能進(jìn)行編輯!那么在matlab里的話,怎么做呢?把要寫的信息放到一個字符串中,然后在eps文件中替換或添加部分注釋信息!
目前還不怎么熟悉matlab的字符串替換操作,所以目前我只放一個Linux系統(tǒng)中用系統(tǒng)的sed命令來添加信息的例子:
info=’Hello, World!’;
eval_r([‘!sed -i ”s/(\%\%Title.*)/\%\%’,info,’/g” test.eps’])
這樣,用圖片查看器打開后,查看文檔的“屬性”時,你就可以看到它的標(biāo)題這一項變成了“Hello, World!”。
生成透明高質(zhì)量矢量圖(未完全測試)
12.1 色圖里如何把含有NaN的數(shù)據(jù)設(shè)置成白色,并保證輸出圖的質(zhì)量。
http://www.mathworks.com/matlabcentral/newsreader/view_thread/140607
這里面第3個是最好的辦法,雖然復(fù)雜一點,但是能夠保證數(shù)據(jù)顯示正確,而且輸出的圖體積小質(zhì)量好。
pcolor或set(h,’alphadata’,~isnan(C))的方法,都會因為設(shè)置了透明而使生成的eps圖片即大又質(zhì)量不好:坐標(biāo)軸丟失、文字鋸齒。
12.2 三維圖
http://www.mathworks.com/matlabcentral/newsreader/view_thread/158841
print -depsc2 -painters test3.eps可以解決部分三維圖輸出質(zhì)量不高的問題,但是輸出有透明數(shù)據(jù)的圖時會有問題?
13 imagesc對nan的處理(有空再考慮完美解決辦法)
為什么MATLAB不在imagesc中直接默認(rèn)顏色為白色呢?
pcolor是這樣的,imagesc卻不一樣,怎么考慮的?不能理解!
13.2 最簡單的一句(如果你保存成eps圖片,可能會發(fā)現(xiàn)這是一場悲劇):
h=imagesc(C)
set(h,’alphadata’,~isnan(C))
14 數(shù)據(jù)量比較大時保存真矢量eps圖
matlab遇到比較大的數(shù)據(jù)量時,即使想保存為eps矢量圖,實際給出來的卻是偽矢量圖,先當(dāng)成位圖做了一個轉(zhuǎn)換,然后再輸出為eps圖。這樣保存的eps圖片,一是質(zhì)量差,二是其中的文字插入到latex中已經(jīng)不能編輯了。
使用下面的方法保存的不會有問題:
print(gca,’-depsc2’,’painters’,filename)
參考:http://www.voidcn.com/article/p-fzeoutiq-btq.html
(這里還有一個擴(kuò)展export_fig文件和savesvg文件,貌似很強(qiáng)大,沒有嘗試)
坐標(biāo)軸在圖形中最大化
tightInset = get(gca, ‘TightInset’);
position(1) = tightInset(1);
position(2) = tightInset(2);
position(3) = 1 - tightInset(1) - tightInset(3);
position(4) = 1 - tightInset(2) - tightInset(4);
set(gca, ‘Position’, position);
saveas(h, ‘WithoutMargins.pdf’);
來源地址:http://www.voidcn.com/article/p-uzlcdcac-bsq.html
總結(jié)
以上是生活随笔為你收集整理的matlab制作小工具,Matlab有用的小工具小技巧的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 自编码的matlab代码,深度学习自动编
- 下一篇: matlab虚拟力,31无线传感网络布局