多圖長文流量警告
本文灰底灰字部分不是什麼重點,可以選擇不看
或許是無聊的廢話
或許是不那麼要緊的零散知識點
BreakTheLoop - Computer Department
Matlab report
Subject: Use Matlab to plot experimental data
No.: Matlab No. 5
Instructor's name: Internet
Execution date: October 11, 2019
Performed by:
Name: Junyi
Faculty: Matlab
Group no.: Group 1, Team 1
Abstract
(背景)
之前因為數學建模比賽,需要總結matlab有什麼關於建模以及繪圖的函數,所以寫了篇推文。因為無聊,寫的還是敘事型的。結果寫一半,matlab壞了,沒繼續寫
現在大二做實驗需要數據分析,但是卻還沒學過matlab,可能你們用Python,excel?反正我們材料剛開始做實驗的時候,同時還在學matlab,對軟體還不熟練,做起來磕磕絆絆的。不過還好第一節實驗課,導師給我們講matlab的一些有關於數據分析的用法
(假設)
我們看到很多人覺得matlab非常適合數據分析,實際上也確實很多人在用matlab進行數據分析。那我們自己使用matlab進行數據分析並繪圖是個什麼情況呢?我們假設它應該能對我們的實驗分析起到很大的幫助
(材料)
我用的是matlab R2018b,所以本篇推文皆以這個版本為基礎
(結論)
就我自己這一年多的使用歷程來說,matlab這方面還是很贊的
(胡扯一些其他的)
反正我現在打算總結一下,一是看能不能給你們做實驗助一臂之力,二是未來我再次使用這個軟體也比較容易回顧上手(老實說,我現在感覺很生疏)。不過之前那篇太亂,重寫
matlab最基礎的不講,見官網教程。這個教程我覺得做得特別好,很適合新手快速上手這個軟體。它是讓你直接在matlab web版上操作,教程也很短,很快就能熟悉其中的操作和一些概念了。建議沒有matlab基礎的小夥伴先去看一下這個教程,再看本推文接下來的內容
https://ww2.mathworks.cn/support/learn-with-matlab-tutorials.html
(長按複製連結)
Figure 1. Official website of matlab tutorial
另外,請注意,本文並不講數據處理和數據分析。因為這些東西都需要具體問題具體對待。而且本文也只講主要的,或者是說我曾做實驗數據處理繪圖遇到的一些情況總結,並不包括所有的繪圖知識
Introduction
matlab有很多方法可以繪圖,據我所知的就有三種,但總而言之本質上都是編程。這些東西都沒有那麼深奧難懂,就從最基礎的繪圖的結構入手
就跟我們現實生活一樣,你要畫點寫點什麼東西,都需要有載體讓你往上面寫寫畫畫,課本,牆亦或者是課桌(笑)等。matlab也一樣,它的載體就是figure。有了figure之後,它就可以依照你的要求在上面繪圖,標記等等
Figure 2. Figure
figure的結構如下
Figure ── Axes ─┬─Line
├─Annotation
| (Text, Arrow...)
├─Surface
├─ ...
知道這些之後,你就要有意識地去了解每個元素的編號,就像Figure 2一樣,圖中標題寫的是Figure 1,而不是其他圖的編號。你可以依據這些編號,在程序中指定某些特定的元素,不管是figure,axes,還是其他什麼,然後進行修改。比如指定Figure 1的時候,你可以這麼寫
注意,在繪圖的時候你確實可以不寫figure然後直接進行繪圖(plot之類的),系統會自動幫你畫在第一張。但問題是,如果你之前還有其他figure,它就會自動把現在的繪圖覆蓋在上一個figure
所以,這並不是一個好的習慣,最好是條理清晰地標明每一個元素,方便程序正確運行,也方便你自己後來再看程序時理解結構
舉個例子,我們要畫(1,5)到(10,14)的直線,我們可以直接寫(不推薦)
Figure 3. Line from (1,5) to (10,14)
圖很順利地畫出來了,然後我們還要再畫一個(1,14)到(10,5)的線,錯誤寫法如下
plot(1:10,5:14);
plot(1:10,14:-1:5);
Figure 4. A wrong result
我們可以看到程序運行結果只輸出了一個figure,後一個plot把前一個plot的結果給覆蓋了。所以正確的寫法如下
figure(1);
plot(1:10,5:14);
figure(2);
plot(1:10,14:-1:5);
figure;
plot(1:10,5:14);
figure;
plot(1:10,14:-1:5);
Figure 5. Two lines
figure後面如果不加數字的話,系統就會自動把編號從小到大增加
另外,figure函數還可以更改標題,加上自定義的標題名或者是關閉figure編號的顯示;更改窗口背景等。具體用法請去看幫助文檔的figure條目
Figure 6. Documentation of 'figure'
根據前面的背景介紹,我們可以提出一個假設
Hypothesis
Matlab應該能對我們的實驗數據繪圖起到很大的幫助
Method & Results & Discussion
前面我說了我知道三種繪圖的方式,那麼我們就一項一項來吧
一、PLOTS
PLOTS在頂端的標籤欄裡,它能幫助我們快速預覽繪圖的效果,便於選擇合適的繪圖方式
Figure 7. PLOTS
選擇在Workspace裡所需要的數據,然後在PLOTS裡選擇你想要的繪圖形式。它會在Command Window裡自動生成代碼並輸出繪圖窗口
Figure 8. Demonstration of PLOTS
二、Live Script
live script是matlab比較新的一個功能,它也一直在推薦使用這個功能,非常適合小體積程序的快速預覽和修改。一個live script可以通過標籤欄HOME下的New Live Script或者HOME下New裡的Live script等方式新建
(a)
(b)
Figure 9. The way to create a live script
輸入代碼(也可以直接複製PLOTS自動在Command Window裡生成的代碼),然後run,出現圖像
Figure 10. Running code in live script
或許有人會問,這個普通的Script有什麼區別,區別在
方便直接在繪出的圖上進行修改,並自動添加代碼
Figure 11. Modification in live script
更直觀的排版注釋
Figure 12. Typesetting and annotation in live script
還有它還有一些有趣的功能,比如numeric slider
Figure 13. Numeric slider
還有drop down
Figure 14. Drop down
三、Script
最後就是最常規的在script裡打代碼
最常見最普通的就是plot函數,上面有很多例子我也都用了plot。它依據使用需求有幾種寫法
這個畫的就是x = 1:n(n為y中的元素個數),y的圖像
還有我們一般用的
畫的就是x為橫坐標,y為縱坐標的圖像。請注意,x和y內包含的元素必須一樣多,因為圖上每個點都是由x和y共同決定的。所以有多少個點,就有多少個x,多少個y。否則會報錯
Error using plot
Vectors must be the same length.
我們剛剛畫的都是單個figure都只plot了一個曲線,那麼要plot多個曲線要怎麼辦呢,我們可以這麼寫
plot(x1,y1,x2,y2,x3,y3...);
這個就相當於我們畫了x1 vs y1圖像,x2 vs y2圖像,x3 vs y3圖像等等等
% Example 1:
% 設置橫坐標x的值
x = 0:0.1:10;
% 繪圖,生成figure窗口
figure;
% 繪製x對sin(x)和x對cos(x)的圖像
plot(x,sin(x),x,cos(x));
Figure 15. Sin(x) and cos(x)
這裡再插點東西,可能新來的小夥伴還不太清楚,百分號(%)是注釋的意思,寫在它後面的東西程序不會去運行它。在matlab裡注釋一般會被標成綠色。注釋能夠方便閱讀程序的人理解,所以是一個非常重要的東西。我們的調試程序的時候,有時候有幾種方案,不知道選哪一種的時候,也會用注釋不會被程序讀取的特點,暫時把一些代碼變成注釋。要把程序裡的一些內容變成注釋很簡單,在前面加%就行。或者你可以在那一行按ctrl+r。要把注釋變回代碼就按ctrl+t。另外,想要單純只運行程序的某些代碼,那就刷黑那些代碼,然後按F9
回到主題,在同一個figure裡plot多個曲線還有一種寫法那就是hold
% 寫了hold on就可以一直不停地畫下去啦
hold on
% 寫了hold off就會停止在同一個axes上加東西
hold off
% Example 2:
% 設置橫坐標x的值
x = 0:0.1:10;
% 繪圖,生成figure窗口
figure;
% 畫sin(x)圖像
plot(x,sin(x));
hold on
% 畫cos(x)圖像
plot(x,cos(x));
% 畫x/10圖像
plot(x,x/10);
% hold off
% 畫-x/10圖像
plot(x,-x/10);
Figure 16. Figure of example 2
% Example 3:
% 設置橫坐標x的值
x = 0:0.1:10;
% 繪圖,生成figure窗口
figure;
% 畫sin(x)圖像
plot(x,sin(x));
hold on
% 畫cos(x)圖像
plot(x,cos(x));
% 畫x/10圖像
plot(x,x/10);
hold off
↑ example 2和3的唯一區別
% 畫-x/10圖像
plot(x,-x/10);
Figure 17. Figure of example 3
有的小夥伴或許有意識到,上面這些畫圖方式其實還是不夠標準。比如Figure 16,它就沒有指明x軸指的是什麼,y軸指的是什麼,每條線代表什麼,(標題是什麼),等等。更重要的是,請注意,所有直接從實驗中得到的數據(除非實驗的儀器已經幫你做了一定的數據處理),在圖像中,必須以斷開的點進行表示(即,實驗數據不能是連續不斷的線,因為一般來說,無論什麼實驗都沒法完全連續不斷地獲得數據。而數據處理之後的一些數據就可以使用線來表示了,比如導數),那麼這些線又該怎麼在matlab裡轉變為點呢?還有,實驗獲得的數據都有一定誤差,能標上請務必標上,這樣才標準嚴謹,那麼誤差線要怎麼表示呢?依舊是一項一項來
x,y軸的表示(如果有單位,請記得加上單位)
% x坐標
xlabel('contant');
% y坐標
ylabel('contant');
% contant是你要輸入的內容
標題的寫法(一般不需要在圖像中打標題,而是在報告中寫標題。figure下面寫標題,table上面寫標題)
標明每個元素所指的圖例的寫法
legend('contant_1','contant_2',...);
你有幾個plot(或者其他繪圖方式),就在legend裡寫幾個contant。程序會依照你之前plot的順序,給每條線加上圖例
另外寫報告的時候,也經常會遇到需要寫希臘字母,上下標的情況。在matlab裡也有方便的寫法,那就是在「 \ 」後面寫希臘字母的英文名(表格我會放在appendix裡[8]),在「 _ 」後面寫下標內容,在「 ^ 」後面寫上標內容
上下標一般只會作用於後面一個字而已。如果後面有多個字需要同時變為上下標,這些字要用花括號({})包起來
%Example 4
figure;
title('\omega_012^345 \omega_{012}^{345}');
Figure 18. Title of example 4
暫時先就這些東西組合起來看一個例子。這個例子是我們小組在做tension test時,用matlab繪製所有材料的stress-strain curve的一個片段。這個圖像被用來對比材料
% All specimens' Engineering figure
% 為了避免讀者混亂,下面暫時不需要讀者看的內容就灰色掉了
figure(19)
plot(strain_brass,stress_brass,'k.',...
strain_steelannecled,stress_steelannecled,'r.',...
strain_steelcoldwork,stress_steelcoldwork,'b.',...
strain_al,stress_al,'g.')
xlabel('strain');
ylabel('stress[MPa]');
legend('Brass4060','Tempered steel 1020','Cold work steel 1020','Aluminum6063');
Figure19. All Specimens' stress-strain surve
再插入一點,或許有些人看著Figure19會很不爽,怎麼這個圖不從(0,0)開始繪圖。這個我們也可以自己在代碼裡面調整
% x軸顯示的起始終止點
xlim([x_min x_max]);
% y軸顯示的起始終止點
ylim([y_min y_max]);
% 正無窮為inf,負無窮就是-inf
回到正題,每條線,每個marker的屬性可以這麼定義
% 單條線
plot(x,y,'properties');
% properties就是你要輸入的屬性
% 多條線
plot(x1,y1,'p1',x2,y2,'p2',...);
這些屬性可以是線型(比如「 : 」是螞蟻線那種點型),marker類型(比如「 d 」是菱形),顏色類型(比如「 r 」是紅色),具體的表我會放在appendix裡[9]
%Example 5
x = 1:10;
figure;
plot(x,sin(x),':dr',...
x,cos(x),'bs');
% 為了程序更加整潔易讀,一行代碼如果太長的話,我們可以用「 ... 」隔開。一行打到合適的長度後,打「 ... 」,過行然後繼續寫
% 建議不要直接複製公眾號裡的代碼,自己打。複製公眾號的代碼,它會自動在「 ... 」後面空一行,那樣程序會出錯
% 這裡我就偷懶一下,不打xlabel,ylabel,legend了
Figure 20. Figure of example 5
然後就是誤差線,errorbar了。在幫助文檔裡面,我覺得需要掌握的就是下面這幾種情況
% case 1
errorbar(y,err);
errorbar(x,y,err);
errorbar(x,y,err,ornt);
% case 2
errorbar(x,y,neg,pos);
errorbar(x,y,neg,pos,ornt);
% case 3
errorbar(x,y,yneg,ypos,xneg,xpos);
看到case 1,或許你已經意識到了,errorbar其實跟plot很相像,只是外加畫了誤差線罷了,所以也可以單純只寫errorbar不寫plot。除了誤差線之外的用法跟plot沒啥兩樣,詳情請看前面的內容
在上面的三個case裡,err指的就是誤差(error),如果你寫的是case 1裡面那種(也就是上面有包含err的代碼),那麼它就是上下誤差,或者左右誤差都是等於err值的誤差線。上下或者左右總長加起來就是兩倍的err
而neg指的是下方(yneg)或者左側(xneg)的誤差值,pos指的是上方(ypos)或者右側(xpos)的誤差值
ornt是設置誤差線的方向。它有三種值,分別為「horizontal」(水平的),「both」(水平和豎直的),以及默認的「vertical」(豎直的)
要注意的是,err、neg、pos都是集合,xy有多少個數值,這些集合就要包含多少個數值。都是每一個誤差線一一對應每一個點
這裡的例子就直接白嫖幫助文檔的例子好了[7]。說到底,這部分還是推薦去看幫助文檔,寫的很詳細,例子也很多
% Example 6
x = 1:10:100;
y = [20 30 45 40 60 65 80 75 95 90];
yneg = [1 3 5 3 5 3 6 4 3 3];
ypos = [2 5 3 5 2 5 2 2 5 5];
xneg = [1 3 5 3 5 3 6 4 3 3];
xpos = [2 5 3 5 2 5 2 2 5 5];
errorbar(x,y,yneg,ypos,xneg,xpos,'o')
Figure 21. Figure of example 6
隨著我們知道了解的越多,問題也隨之而來。比方說,我們要畫很多條線,並給這些線加上誤差線。每一條線的誤差線,我們都要寫一次errorbar。當我們只想在圖例裡面標明一次「誤差線」就夠了。我們現有知識中,legend就是把所有的線都標上,這樣就會重複標記「誤差線」,那麼怎麼解決這個問題呢?有兩種方法:
第一就是,errorbar最後寫。在legend裡也只寫一次「誤差線」。超出legend包含元素個數的元素在圖例裡就不會顯示出來。寫一個例子比較好理解吧
% Example 7
x = 1:10;
figure;
plot(x,sin(x));
hold on
plot(x,cos(x));
errorbar(x,sin(x),0.1*ones(size(x)),'linestyle','none','color','k');
errorbar(x,cos(x),0.1*ones(size(x)),'linestyle','none','color','k');
% 雖然寫了兩個errorbar,但最後在legend裡只顯示第一個
legend('sin(x)','cos(x)','errorbar');
Figure 22. Figure of example 7
第二種方法是我自己在用的,就是把每個需要標入圖例的plot(或者其他繪圖方式)賦給一個變量
接下來這個例子,是我們小組在做ageing實驗時候,需要看不同回火情況下,隨著時間變化,材料HRB(一種表示硬度的標準)的變化情況。在這個實驗的數據處理圖像化,我就遇到需要在圖例中只顯示部分元素的情況。下面是完整代碼中,我們需要看那部分
figure;
% 要在圖例中顯示的誤差線,命名為p
p = errorbar(0,mean_rt,std_rt,std_rt,1/6,1/6,'color',[0.5,0.5,0.5],'markersize',1,'linestyle','none');
hold on;
errorbar(x,mean_210,std_210,std_210,error_x,error_x,'color',[0.5,0.5,0.5],'markersize',1,'linestyle','none');
errorbar(x,mean_260,std_260,std_260,error_x,error_x,'color',[0.5,0.5,0.5],'markersize',1,'linestyle','none');
% 需要在圖例裡表明的三條線,分別命名為q、r、s
q = plot(0,mean_rt,'gx','markersize',5);
r = plot(x,mean_210,'bx','markersize',5);
s = plot(x,mean_260,'rx','markersize',5);
% 我當時考慮到圖中的點太亂了,比較難分辨哪一個點是屬於哪一個溫度的,變化趨勢單純看雜亂的點也不好看。所以就加了虛線。其實這麼做是不對的。直接得到的實驗數據不能連線就是不能連線,因為你兩個實驗數據點間的數據大小是不清楚的。你連線就相當於說,兩個實驗數據之間的數據就是在線上,這是很不嚴謹的。所以我記得當時這個部分被扣了分
plot([0,x],[mean_rt,mean_210],'c','linewidth',1,'linestyle',':');
plot([0,x],[mean_rt,mean_260],'m','linewidth',1,'linestyle',':');
xlabel('Ln(Time)[Ln(min)]');
ylabel('HRB');
% 讓legend根據「p q r s」的順序來標記圖例。所以雖然有很多個plot,但最後只顯示四個圖例元素
legend([p q r s],'error bar','room temperature','210℃','260℃');
Figure 23. Ageing
另外,我們還會遇到需要在報告裡展示非常多張圖的情況。如果是展示在appendix還好說,就一張一張展示也沒什麼,但是如果是展示在主體部分的話,就會顯得圖太多,圖太大,沒什麼實際上的內容(因為一般看report都是看文字,圖片只是輔助)。這個時候我們就需要subplot。這個函數就相當於在一個figure裡,畫很多個axes
它的意思就是在當前figure裡生成mxn的axes網絡格。也就是說,這個figure上有m行乘n列的m*n個axes。你要在其中某個axes上畫圖,你就告訴程序你要在第p個axes上畫,甚至可以合併幾個axes為一個axes。還是直接上例子比較好理解
% Example 8
x = 0:0.1:10;
figure
% 第一個圖像
subplot(2,2,1)
plot(x,x/10);
title('x/10');
% 第二個圖像
subplot(2,2,2)
plot(x,cos(x));
title('cos(x)');
% 第三個圖像,佔用第3、第4兩個格
subplot(2,2,[3 4])
plot(x,sin(x));
title('sin(x)');
Figure 24. Figure of example 8
當時我們小組在做Q Factor的時候,就用了這個函數。繪圖的時候有點帥
Figure 25. Using subplot
那麼接下來就講講除了plot,errorbar之外,我還在實驗數據處理圖像化的時候遇到哪些有趣的函數
比如說semilogx。我們小組當時在做fatigue實驗的時候,因為需要等的時間特別長,用常規的等距x軸不太合適,就需要x軸換為指數的形式展示。其實除了這一點之外,跟plot也沒什麼很大的區別,寫法也還是一樣的
figure(1);
semilogx(cycle,stress,'xr');
hold on;
semilogx(cycle,stress,'-b');
xlim([10^2 10^5]);
errorbar(cycle,stress,error_stress,error_stress,error_cycle,error_cycle,'k.'...
,'markersize',1,'linestyle','none');
grid on;
xlabel('number of cycle');
ylabel('stress σ (MPa)');
Figure 26. Number of cycle vs stress
這裡的errorbar當時的數據處理有問題,垂直的誤差線以當時的情況來看,不可能這麼大。另外又是犯了實驗數據連線的問題
看著figure 26,我們發現圖被加上了網絡格,這就是grid的作用
% 打開網絡格
grid on
% 打開更密的網絡格
grid minor
% 關閉網絡格
grid off
Figure 27. Grid minor
有時候我們需要在一個圖像裡顯示兩種不同類型的曲線,它們y軸的含義不同,但是x軸卻完全一樣。比如一組數組以及他們的導數曲線。這個時候就需要yyaxis了
figure
% 用左y軸表示的曲線
yyaxis left
...
% 用右y軸表示的曲線
yyaxis right
...
依舊是我們小組做實驗的例子。我們現在需要畫cooling-curve以及展示它變化趨勢的derivative curve在同一個figure裡
% 這部分函數我當時是用一個function封裝了起來,使我的程序變得整潔
function ct(tc,i)
figure(i)
axis([10*182 10*413 -inf inf])
yyaxis left
time_1 = 10*182:10:10*413;
plot(time_1,tc(183:414),'b.','markersize',1);
xlabel('Time[sec]');
ylabel('Temperature[℃]');
yyaxis right
der = diff(tc(183:414))/10;
time_2 = 10*182:10:10*412;
plot(time_2,der,'r:','markersize',1);
ylabel('Derivative[dT/dt]');
legend('cooling curve','derivative dT/dt ');
end
Figure 28. One of the cooling-curve and its derivative curve
最後一個我想要講的是histogram(直方圖),這是我們小組當時在做Average Velocity小車實驗的時候,遇到的函數
histogram(x);
histogram(x,nbins);
% x是你的數據組,nbins是你要畫多少條柱子
bins = 20;
figure
histogram(AVdata(:),bins);
xlabel('time[sce]');
Figure 29. Histogram
我暫時就講這麼多種繪圖方式,其他的請看郭彥甫教授的matlab課程[2],或者自己探索,比如boxplot,pie,polarplot等等
另外,繪圖只是實驗數據處理圖像化的一個部分。繪圖的前提是要有數據。而數據需要經過合適的數據處理,這些東西都需要你們自行學習,自行探索,自行積累。有非常多的數據處理函數,比如正態分布的std,找局部最大值的peak,輔助求導的diff等等等,都相當的有意思。Figure 30就是通過peak找局部最大最小值的絕對值,通過這些值來了解小車的振幅變化情況
Figure 30. The cart with the magnet on it and the magnet produce magnetic damping
四、後期(?)
當你run完程序,matlab彈出了figure窗口,你就進入了後期的狀態了(請允許我把它叫做「後期」,有點像。不過雖然就算運行了程序,也要重複調試修改代碼)
Figure 31. Figure window
這個時候你可以直接選擇保存它。雖然你也可以直接在代碼裡輸入保存的程序,但我個人不建議。畢竟你在figure窗口裡還能對你的圖像託託拽拽放大縮小,進行一些比較後期的修改,改到滿意了再保存
不過我在這裡還是多嘴一句,到了figure窗口了,發現了自己有哪些地方可以改進,儘可能在代碼裡進行修改。畢竟figure窗口是一次性品,關閉重新運行程序再打開後又是原樣了,需要重新修改(其實可以通過File-Generate Code來把圖像轉化為代碼,但個人感覺沒必要)
另外記得選擇保存的文件格式,不然matlab默認保存的是matlab自己的.fig格式
(a)
(b)
(c)
Figure 32. Saving figures
看完怎麼保存我們製作的圖像之後,我們就可以來看看這個figure窗口還有什麼有趣的東西
第一個有趣的事情是,其實你plot的所有2D圖像,其實都是3D的。其實前面這句話是廢話,一個2D圖像,在平面之外轉個角度,就可以變成3D圖像(我也是無聊到了極致啊
有兩種方法可以使2D圖像變成3D的,一個是Tools下面有一個Rotate 3D,通過在axes上拖拽就可以旋轉3D視角。想要恢復原狀,可以把滑鼠放在axes上,右上角會出現一個「小屋子」的圖標,點擊它就恢復原狀了
(a)
(b)
Figure 33. (a)3D rotate (b)Restore view
另一種方法就是使用View裡的Camera Toolbar
Figure 34. Camera toolbar
不單單只有camera toolbar。打開view,我們看到了新世界
(a)
(b)
Figure 35. (a)View
(b)①Figure toolbar ②Camera toolbar
③Plot edit toolbar ④Property inspector
⑤Figure Palette ⑥Plot Browser
⑦Property editor
我們除了剛剛已經看過的②camera toolbar之外,一個一個來看看
①Figure toolbar
Figure 35. Figure toolbar
Figure toolbar從左到右分別是「新建」「打開」「保存」「列印」「Link plot」(不知幹啥的)「colorbar」「圖例」(axes上的圖例是可以拖動,來放到合適的位置的)「Edit plot」「Property inspector」。其中,Edit plot是可以單擊axes內任意元素,然後進行修改
(a)
(b)
Figure 36. (a)Legend & colorbar
(b)Edit plot
③Plot edit toolbar
可以往圖上加文字,圖形,箭頭等;還有最後一個按鈕是調整
(a)
(b)
Figure 37. Plot edit toolbar
(a)Add somthing
(b)Align distribute tool
⑤Figure Palette & ⑥Plot Browser
前者可以單擊添加一個2D3D圖像;subplot;往圖像裡導入workspace裡的變量(雙擊變量,或者把變量拖入圖中);添加箭頭,圖形等(跟plot edit toolbar一樣,就不演示了)
後者相當於圖層,決定可以看到哪些曲線,是否刪除哪些曲線等
Figure 38. Figure Palette & Plot Browser
⑦Property editor
可以修改各項元素的部分屬性
(a)
(b)
(c)
(d)
Figure 39. Property editor
(a)Figure (b)&(c)Axes (d)Line
④Property inspector
個人認為這是標籤欄View下最重要的工具了,你點擊axes裡的任意元素,它都將詳細顯示這個元素的所有具體屬性設置(是的,比property editor詳細很多)
Figure 40. Property inspector
這些屬性的詳細信息可以在幫助文檔「Figure屬性」看看。重點是,這些屬性都可以直接用代碼寫,而這些代碼的函數名其實就是property inspector裡的屬性名(而我前面部分被灰字的代碼就是這個,你現在再去前面看這些代碼就知道在說什麼了)
% Example 9
x = 1:10;
figure
plot(x,x);
Figure 41. Figure of example 9
% Example 10
x = 1:10;
figure
% 跟example 9一樣的數據。color就是設置曲線的顏色,後面的數組就是數值為0~1的rgb紅綠藍通道值。linestyle就是曲線的線類型,none就是沒有線,markersize就是設置marker的大小
plot(x,x,'color',[0.3 0.6 0.2],'linestyle','none','marker','^','markersize',20);
Figure 42. Figure of example 10
View部分介紹完了。接下來還有一些主要需要用到的。比如你把滑鼠放在axes上,右上角就會出現一排按鈕
Figure 43. Some buttons
它們分別是「Brush/Select Data」「Data Tips」「Pan」「Zoom In」「Zoom Out」「Restore View」
其中「Pan」拖動畫面,其實可以直接把滑鼠放在axes上拖動圖像,沒啥必要點這個按鈕
「Zoom In」「Zoom Out」放大縮小也沒啥必要,直接用滑鼠滾輪就行了
「Brush/Select Data」就是高亮一些數據,按緊shift可以選多段
Figure 44. Brush/Select Data
「Data Tips」就是在圖上顯示數據信息,單擊需要顯示信息的數據點就行。還可以拖動這些標籤來選擇標籤的放置方向。同樣也是按緊shift來選多個數據點。要刪除標籤的話,就單擊要刪除的標籤,然後按delete
Figure 45. Data Tips
Data Tips很實用,因為保存圖片的時候,它會一起被保存進圖片裡。有時候實驗報告裡的圖片,需要你標記出實驗數據裡某些數據的具體數值,就可以用這個功能
另外還有兩個很實用的工具在標籤欄的Tools裡,它們分別是Basic fitting,Data statistics
Figure 46. Basic fitting & Data statistics
Basic fitting如字面意思一樣,就是最基礎的擬合曲線。因為我們做實驗的目的就是為了找出規律,所以常常需要看看有沒有什麼數學公式剛好能符合數據情況,這時候就需要擬合曲線了。residuals就是擬合的貼切程度,0就是完全符合,越偏離0擬合越失敗
Figure 47. Basic fitting
Data statistics是數據的統計,也是一個非常方便的工具
(a)
(b)
Figure 48. Data statistics
關於figure還有很多有意思的東西,比如gca,gcf,cla,clf等,請自行搜索
Conclusion
matlab確實可以一定程度上幫助數據處理。數據處理圖形化是為了方便分析得出結論,所以不要死板地使用軟體。如果有需要的話,可以把導出的圖像拿到其他繪圖軟體進行後期處理
舉個例子,有一個實驗需要研究cooling-curve和phase diagram。我們需要通過cooling-curve的拐點和相應的phase diagram進行對照,來判斷每個樣品對應的composition。這裡單純用matlab導出的圖像我總覺得不直觀,沒法很好地解釋我們為什麼認為它就是這個composition。所以我就用csp(一個繪圖軟體),選擇合適地方式把cooling-curve和phase diagram結合起來。就算是對待導出的圖像,也完全可以自主地進行調整。比方說,cooling-curve在對比時,時間軸並不是重點,重點在於拐點地高低,那我就可以把cooling-curve的橫坐標刪掉。然後每個cooling-curve用不同顏色的線跟phase diagram連起來,使圖像簡潔明了
(a)
(b)
(c)
Figure 49. (a)The lead–tin phase diagram [6]
(b)Cooling-curve of six specimen
(c)The lead–tin phase diagram and each specimen's cooling curve
Reference (其實也包含一些推薦的資源)
[1] MATLAB入門之旅. Retrieved from
https://ww2.mathworks.cn/learn/tutorials/matlab-onramp.html?s_cid=learn_ONRAMP_BAN
[2] 郭彥甫 (Yan-Fu Kuo). [2016, February 1]. Applications of MATLAB in Engineering. Retrieved from
https://www.youtube.com/watch?v=KHFZLkm9qs0&list=PLVHBjRDK0kALcQMwAFbR5q2driYZCHNIx
or
https://www.bilibili.com/video/av68228488?from=search&seid=7479184084911756899
[3] 卓金武. [2019, August 15]. 數學建模中MATLAB的幾招神技. Retrieved from
http://live.vhall.com/325642498?invite=
[4] matlab中文論壇. Retrieved from
https://www.ilovematlab.cn
[5] CSDN. Retrieved from
https://www.csdn.net/
[6] William D. Callister, JR. | David G. Rethwisch, A. [2011,2015]. Materials Science and Engineering. Hoboken, State of New Jersey: John Wiley & Sons,Inc.
[7] Matlab Documentation
Appendix
[8]
Table 1. Greek alphabet
符號寫法[9]詳情請見幫助文檔的「Line屬性」
Table 2. Plot properties
Line type
Option.
Solid line
(——)
-Asterisk (﹡)*Dashed line
(- -)
--Cross (×)xDash-dotted line
(- · - ·)
-.Circle (o)Dotted line
(· ·)
:Plus sign (+)
+No linenonePentagram (☆)
pDownward
triangle (▽)
vUpward
triangle (△)
^Leftward
triangle (◁)
<Rightward
triangle (▷)
>Hexagram (✡)
h[10]
在寫每個程序前,推薦使用這三個函數:clc;clear;close all
clc是清空Command Window,這方便你再一次運行時能看清它的結果,或者出錯時看的更加清晰
clear是清除workspace裡的數據,單純寫clear就是清除全部數據。這防止上一次的運算結果影響到本次的運行
close all就是關閉除了主窗口、幫助文檔之外的所有窗口。一般用來關掉figure,以免上一次的figure和這一次的figure混淆
% preparation
close all;
clear;
clc;
[11] 請合理「排版」,加注釋
(a)
(b)
Figure 50. Some nice typesetting
[12] Debug
一個非常重要的技能。詳情請點擊下面的Figure 51進行查看
Figure 51. Debug
[13] Curve fitting tool (cftool)
在Command window裡輸入cftool就可以調出這個工具。它可以擬合曲線,能力應該是比Basic fitting要強的。第一次調用這個插件的時候,它應該會提示需要下載這個插件,下載就是了。這個插件背後使用的函數其實是fit,我為了方便對擬合曲線進行修改,已經避免忘記對擬合曲線進行命名,一般會直接使用fit而不是使用。fit的具體使用方法請看幫助文檔
Figure 52. Curve fitting tool
選擇要擬合曲線的數據,然後記得修改擬合曲線的名稱(不然「untitled fit 1」什麼之類的,真的沒啥意義。我記得我當時好多次都栽在這上面了)。然後選擇要擬合的類型(個人用的比較多的是Polynomial,Exponential),甚至可以自己寫擬合的方程(Custom Equation)。左下角的Results會寫擬合方程類型,係數值,誤差值還有許許多多的統計數據
(這些統計數據Statistic都會教的,每個數據都要它自己的意義。另外,statistic的T課如果有教怎麼用excel處理數據,請認真聽,非常乾貨)最後fitting curve做好後,可以通過File - Print to Figure導出成為figure
Figure 53. Using Curve fitting tool
[14] eval
這是一個我個人用得很爽的,但是matlab不推薦的函數。用來批量處理數據非常方便。它其實就是跟你普通打代碼一樣,比如
跟
的效果是一樣的。但是如果你需要批量處理數據的時候,就會有變量。一般來說,一段代碼就沒法處理多個數據,但是eval就可以
比如你有很多數據組,它們的命名都很相似,都是「data_n」(data_1, data_2, ...)。我們只要每個數據組的第一個數據,並把它們一併賦值給一個變量
for i = 1:3
first(i) = eval(['data_',num2str(i),'(1);']);
end
它就相當於
first(1) = data_1(1);
first(2) = data_2(1);
first(3) = data_3(1);
num2str就是number to string數字轉化為字符串的意思。一般eval裡的東西都用單引號('')括起來。如果有數據類型轉化(比如num2str或者str2num等),就要寫在單引號之外。是不是只有這種情況需要寫在單引號之外,我記不太清楚了。這些不同的元素(需要單引號的,不需要單引號的)要用逗號(,)隔開。如果元素太多的話,需要用方括號([])括起來,否則會報錯
另外,有時候我們會遇到被賦值的那個變量(括號左邊的變量)也需要有不同的命名。這個時候不能在等號左邊寫eval,而是應該用eval把整個式子括起來,舉個例子
for i = 1:3
% eval(['result_',num2str(i)]) = i;
↑ 這麼寫是錯的,有時候還會很搞笑的,程序把這整一個eval函數當作變量名
eval(['result_',num2str(i),' = i;']);
end
result_1 = 1;
result_2 = 2;
result_3 = 3;
eval可以寫的非常複雜,但不推薦,會寫得很混亂,除非萬不得已。我就寫過有些特別複雜的eval,但又暫時找不到替代方案,結果一直出錯,改了很久才改對。我暫時找不到之前寫的超級複雜的案例。不過有時候最混亂的就是這個單引號,哪裡需要加,哪裡不需要,很亂。尤其是像legend這樣原函數本身就需要單引號的,就更亂了。這時候只要記得「兩個連續的單引號就會被eval判斷為普通的單引號」(所以有時候你甚至可以看到連續三個單引號,第一個是eval需要的單引號,後面兩個是內容的一個單引號)
就相當於
x = data';
% 「 ' 」指的是對data進行轉置矩陣處理
[15]
保存figure要等它閃一下,不要點保存就馬上關了,很可能沒保存上(嘛,只是提個醒。不知道是不是只有我的電腦有這種情況)
[16] 後續的自學
寫程序我們經常會遇到我們從未遇到的情況,或者我們曾遇到了,但是記不清楚的函數用法。我們可以請求網絡的幫助,這點非常重要,常常能使人豁然開朗,谷歌也好,百度也罷,能捉到老鼠就是好貓。matlab中文論壇(https://www.ilovematlab.cn),CSDN(https://www.csdn.net/)也都很贊
其實個人感覺最有用的是官方的幫助文檔
我們可以在Command Window裡輸入
舉個例子,我們要查plot
Figure 54. Help
它就會簡略地把一些跟plot有關的介紹顯示在Command Window裡。想要更詳細的信息我們就需要幫助文檔。我們可以通過函數doc或者右上角的搜索欄調出幫助文檔
比如還是plot
Figure 55. Doc
如果你單純看幫助文檔還是不懂,沒關係,大部分函數的幫助文檔都有實例。你可以通過幫助文檔裡的「打開實時腳本」來看實例,進一步對函數進行了解
Figure 56. Open a live script
p.s.
雖然這篇文章是按照report的格式來寫的,但是卻沒有嚴格按照應有的格式來寫。具體寫法還請遵循導師的指導
廣以的學子,學校應該都有給你們買你們在大學學習期間能使用的正版matlab的license。我只是說maybe,你們可以郵件問問學校?
按照自己的思路寫的,雖然自覺得上下文有所承接,但不知道觀眾會不會看著覺得沒什麼邏輯,比較亂
微信公眾號雖然功能越來越多了,怎麼感覺越來越難排版了
現在就連引用的字數都限制了?好吧,理解(那麼問題來了,重查率是多少。雖然我本文中使用引用功能的都是我自己寫的代碼,只是為了方便把代碼和文章區別出來而已
動圖限制太難受了,浪費了我好多時間
總感覺內容太多了,但又沒有什麼思路怎麼串聯起來,總是想棄坑
就算是摸魚,也有拖延症(五月病
因為總突然想到什麼,然後在文中加了點什麼,刪了點什麼,文中很多編號總是進行修改,不知道最後成品有沒有出錯,有點擔心
不知道有多少人能耐下心來看完這篇推文(撓頭
修改了很多次,不知道會不會還是寫的有點亂,不方便理解(但是時間真的很緊迫,沒啥時間摸魚了,這學期,吐血
不知道能不能幫上這個處理實驗數據圖像的忙(撓禿
找資料,看以前自己寫的東西,調試代碼,碼這麼多字,做圖,排版好累啊(瘋狂暗示
有問題可以在評論區提問,最好是自己探索之後(網上搜索)不懂再問。畢竟本人平常還是比較忙的,上公眾號也是看心情,有時候可能會很久都沒上
不推薦公眾號後臺,因為平臺限制,一段時間用戶沒有主動和公眾號互動的話,公眾號是不能在後臺私信用戶的
如果提問的時候有代碼,請使用有意義的名字來命名變量,並加上注釋,不然很可能看不懂