如何利用matlab画三维图_平面图怎么画(新手如何入门pytorch)
引言
本人是一位數(shù)學(xué)科研工作者,平時(shí)的文章采用的是latex編寫,里面圖形的生成主要來(lái)自于Matlab(個(gè)人對(duì)Matlab非常喜歡,感覺上手比較容易,更親民)。對(duì)于圖形的處理比較頻繁,而且總會(huì)有一些特殊的需求,每次都要上網(wǎng)搜查,或者查以前用過(guò)的命令,經(jīng)常花了很多時(shí)間,實(shí)現(xiàn)了一點(diǎn)小要求,事后回想有點(diǎn)得不償失。因此借助這個(gè)平臺(tái),記錄自己在Matlab使用過(guò)程中碰到的一些問(wèn)題,給出我找到或者知道的解決辦法,不過(guò)方法不是唯一的,也希望廣大網(wǎng)友能有更好的思路提供。后續(xù)碰到的問(wèn)題我也會(huì)繼續(xù)更新(如果我有時(shí)間的話哈)。
Matlab畫三維圖
Matlab畫三維圖形的需求通常是針對(duì)二元函數(shù)而言的,Matlab畫圖主要采用描點(diǎn)的方法,就是畫出給定點(diǎn)對(duì)應(yīng)的值,然后Matlab會(huì)自動(dòng)把這些點(diǎn)連接起來(lái),就成了很漂亮的一幅圖。所以你給的點(diǎn)越多,畫的圖就越精確。
一個(gè)簡(jiǎn)單的例子
下面我們以函數(shù) u = s i n ( x ) s i n ( y ) u=sin(x)sin(y) u=sin(x)sin(y)為例,畫三維圖形的代碼如下:
function PF_3D
px=100; py=150; %x軸我布100個(gè)點(diǎn),y方向布150個(gè)點(diǎn)
x=linspace(0,2*pi,px); %該函數(shù)表示在[0,2*pi]上均勻布px個(gè)點(diǎn)
y=linspace(0,2*pi,py);
[X,Y]=meshgrid(x,y); %該函數(shù)的作用詳見下文
u=sin(X).*sin(Y); %計(jì)算對(duì)應(yīng)點(diǎn)的函數(shù)值u %注意點(diǎn)乘
surf(X,Y,u); %畫圖
%mesh(X,Y,u);
end
代碼中的meshgrid命令是生成 m × n m\times n m×n的X,Y兩個(gè)矩陣,這里m是y的長(zhǎng)度,n是x的長(zhǎng)度,結(jié)果如下圖Matlab代碼
X就是把x向量復(fù)制了m行,每行都一樣。Y就是把y復(fù)制了n列,每列都一樣,這樣X,Y矩陣相同位置的值就對(duì)應(yīng)了點(diǎn)的橫縱坐標(biāo)(總共有 m × n m\times n m×n個(gè)點(diǎn)),再由前面代碼計(jì)算得到u就得到點(diǎn)對(duì)應(yīng)的函數(shù)值。最后可以通過(guò)mesh或者surf命令進(jìn)行畫圖就。mesh和surf是有區(qū)別的,但是我也沒去區(qū)分,我自己常用的是surf命令,下面看兩個(gè)命令畫出圖的不同(左邊是surf,右邊是mesh)
上圖中左邊surf畫出來(lái)的圖比較黑那是因?yàn)镸atlab在圖上畫了黑色網(wǎng)格線,如果要去掉他可以在后面加命令:
shading interp
效果如圖:
如果不喜歡后面坐標(biāo)平面的那些網(wǎng)格線,也可以加命令:
grid off
就可以讓它消失。
坐標(biāo)軸的設(shè)置
1.從上面的圖可以看出,如果不加干預(yù)的話,Matlab畫出你給的橫縱數(shù)值范圍的全部圖形,但有些時(shí)候我們可能比較關(guān)心局部的圖樣,這時(shí)候就要設(shè)置圖形坐標(biāo)軸的顯示范圍,只要在surf命令后面加命令:
axis([0,2,0,4,0,1])
axis里面參數(shù)分別對(duì)應(yīng)x_min,x_max,y_min,y_max,z_min,z_max,效果如圖
2.有些問(wèn)題他的圖形是長(zhǎng)條形的,如x軸應(yīng)該很長(zhǎng),y,z軸比較短的,但Matlab總是畫得“方方正正”,這樣就會(huì)變得不美觀(肯定有個(gè)軸被壓縮),所以此時(shí)我們選擇控制軸的相對(duì)長(zhǎng)度,可以在surf后面加命令:
pbaspect([2,1,1]);
pbaspect后面得三個(gè)參數(shù)表示橫縱豎得長(zhǎng)度比例是2:1:1,最后效果如圖:(我們這個(gè)例子不需要讓軸變長(zhǎng),拉長(zhǎng)反而不好看,為了演示拼了)
3.隱藏坐標(biāo)軸。有時(shí)候我們保存多張圖,只是為了體現(xiàn)圖形的變化,這樣就不需要每個(gè)坐標(biāo)軸刻度和數(shù)值都顯示出來(lái),所以我們要隱藏坐標(biāo)軸,這個(gè)在網(wǎng)上有很多人提供了方案,但是個(gè)人覺得比較好用的方案是在surf后面添加如下命令
t=0:0:0;
set(gca,'xtick',t); %這兩句話可以去掉x軸的刻度和坐標(biāo)值
xlabel('x軸的說(shuō)明') %這句話可以坐標(biāo)的下面添加一個(gè)說(shuō)明
set(gca,'ytick',t); %這兩句話可以去掉y軸的刻度和坐標(biāo)值
ylabel('y軸的說(shuō)明') %這句話可以坐標(biāo)的下面添加一個(gè)說(shuō)明
set(gca,'ztick',t); %這兩句話可以去掉y軸的刻度和坐標(biāo)值
zlabel('z軸的說(shuō)明') %這句話可以坐標(biāo)的下面添加一個(gè)說(shuō)明
直接看效果
橫縱豎的刻度和刻度值都消失了,留下了三條邊緣黑線,至于這個(gè)怎么去了目前還不知道(是不是可以設(shè)置刻度線的顏色成白色就行?)。上面的方案原出處可以在該網(wǎng)頁(yè)查看。
4.其他坐標(biāo)軸設(shè)置。還有很多坐標(biāo)軸的設(shè)置可以直接上網(wǎng)查找,或者直接編輯圖片,如何編輯呢?就是直接在生成的圖像窗口點(diǎn)查看-屬性編輯器(我用的2019版本的是這樣,在以前的版本在圖形窗口有個(gè)圖標(biāo)直接點(diǎn)就行了,但是19版本沒有了,感覺沒有了很難受,誰(shuí)知道怎么添加這個(gè)屬性編輯器的快捷圖標(biāo)到工具欄里)。進(jìn)入屬性編輯器之后,就會(huì)發(fā)現(xiàn)里面有好多對(duì)圖形的坐標(biāo)軸的設(shè)置,還是挺好用的,但是如果對(duì)很多圖同時(shí)處理的畫,這樣效率很低,還是能用代碼解決的就用代碼解決。
圖形的視角
有時(shí)候我們不需要三維的立體圖,可能只要俯視圖或者側(cè)視圖,通過(guò)圖形的顏色區(qū)別函數(shù)值的大小。這時(shí)候我們就需要對(duì)圖形進(jìn)行旋轉(zhuǎn),一種辦法就是直接對(duì)生成圖形進(jìn)行旋轉(zhuǎn)(看工具欄上有,或者鼠標(biāo)移到圖上就有這個(gè)旋轉(zhuǎn)工具跳出來(lái))。第二種辦法就是加命令
view(0,90) %俯視圖xoy平面,x為橫軸
%view(-90,0) %側(cè)視圖yoz平面,y為橫軸
%view(0,0) %側(cè)視圖xoz平面,x為橫軸
效果如圖
但這樣光有顏色沒有標(biāo)明顏色對(duì)應(yīng)的值,我們可以在圖形窗口點(diǎn)插入顏色欄圖標(biāo)(上圖工具欄中的第六個(gè)圖標(biāo))會(huì)在右側(cè)出現(xiàn)顏色欄。如果對(duì)這個(gè)顏色欄不喜歡,可以右擊剛生成的顏色欄選擇標(biāo)準(zhǔn)顏色圖,選自己喜歡的打勾就行(我比較喜歡jet)。上面的過(guò)程也可以直接采用如下命令實(shí)現(xiàn):
colorbar %顯示顏色欄
colormap(jet) %顏色的風(fēng)格選擇
效果如下:
圖像的保存
圖像的保存一種就是直接在圖形窗口,文件-另存為就有好多的格式供你選擇,我們寫論文的時(shí)候一般要求是eps格式的圖片,因?yàn)樗鞘噶繄D,放大不失真,Matlab有提供這個(gè)選擇,兩個(gè)字完美!這種通過(guò)選擇保存圖片的方式非常笨拙,一兩個(gè)圖還行,多個(gè)圖的產(chǎn)生,或者程序需要長(zhǎng)時(shí)間運(yùn)行的不想干等的就比較麻煩,所以還是代碼來(lái)解決吧。
我們以一個(gè)例子來(lái)爽快的解決這個(gè)問(wèn)題。比如我們打算畫函數(shù)圖
u = s i n ( k x ) c o s ( k y ) u=sin(kx)cos(ky) u=sin(kx)cos(ky)這里的 k k k的取值[1,2,3],現(xiàn)在要將每個(gè) k k k對(duì)應(yīng)的圖保存到當(dāng)前路徑的figures文件夾里(這個(gè)文件夾要原先要存在),文件命保存成fg1.fig,fg2.fig,fg3.fig(.fig是Matlab圖形保存是默認(rèn)的后綴名,這樣后綴的圖形可以再由Matlab打開)。給出如下代碼:
function PFS
px=100; py=150; %x軸我布100個(gè)點(diǎn),y方向布150個(gè)點(diǎn)
x=linspace(0,2*pi,px); %該函數(shù)表示在[0,2*pi]上均勻布px個(gè)點(diǎn)
y=linspace(0,2*pi,py);
[X,Y]=meshgrid(x,y); %該函數(shù)的作用詳見下文
fid=[pwd,'\figures\']; %這個(gè)命令用fid指當(dāng)前路徑下的figures文件夾
for k=1:3
u=sin(k*X).*sin(k*Y); %計(jì)算對(duì)應(yīng)點(diǎn)的函數(shù)值u %注意點(diǎn)乘
figure(k) %創(chuàng)建第k個(gè)圖形窗口
surf(X,Y,u); %畫圖
M=int2str(k);%將k轉(zhuǎn)化成字符存到M中
saveas(gcf,[fid,'f',M,'.fig']);
end
end
上段代碼的核心:1.創(chuàng)建圖窗 2.保存圖形。先看創(chuàng)建圖窗的命令就是
figure(k) %創(chuàng)建第k個(gè)圖形窗口
注意k一定要加括號(hào),沒有括號(hào)不行。這個(gè)figure命令是k的for循環(huán)命令內(nèi),這樣就可以隨著k的變化創(chuàng)建不同的圖窗,然后再fiugure(k)后面跟上畫圖命令,圖就會(huì)畫到相應(yīng)的圖窗。這樣就避免了后面畫的圖覆蓋前面畫的圖情形。接著就是保存圖形,我們首先再for循環(huán)的外圍給命令
fid=[pwd,'\figures\'];
這個(gè)fid變量是為了保存圖像要保存的路徑,參數(shù)pwd是Matlab自帶的表示當(dāng)前路徑,\figures\就是figures文件夾(因?yàn)樗械膱D都要保存到這個(gè)文件夾里,所以這個(gè)命令放在for循環(huán)的外面)。在for循環(huán)內(nèi)容我們要給圖像名字起fg1.fig,fg2.fig,fg3.fig,注意名字上的1,2,3其實(shí)就是k的值,但是k是個(gè)數(shù)值(整數(shù)值),而文件名應(yīng)該是個(gè)字符串,所以首先先將k轉(zhuǎn)化成字符串
M=int2str(k);%將k轉(zhuǎn)化成字符存到M中
然后再合成一個(gè)完整的路徑就是[fid,‘f’,M,’.fig’],這個(gè)中括號(hào),中間逗號(hào)起到了字符串左右拼接的作用,注意里面已經(jīng)是字符串了不用加引號(hào),不是的要加。最后通過(guò)saveas函數(shù)進(jìn)行圖像保存:
saveas(gcf,[fid,'f',M,'.fig']);
saveas第一個(gè)參數(shù)gcf我也不知什么意思,是否是獲取圖片的意思,我就當(dāng)默認(rèn)處理了。
如果是要將圖片保存成eps格式的畫,要把saveas的參數(shù)命令中的’.fig’改成’.eps’,但如果僅僅如此的話,保存最終的eps圖像是黑白的(我的Matlab是這樣,不知道你們是否也是),如果想要是彩色的,要在后面額外加一個(gè)參數(shù)’psc2’,具體代碼如下:
saveas(gcf,[fid,'f',M,'.eps'],'psc2');
這樣就大功告成。
結(jié)束語(yǔ)
如果讀者有碰到一些Matlab的問(wèn)題也可以留言提問(wèn),如果我知道的話也會(huì)告知。
文中很多方法是我看書或者搜索到的,如果有侵權(quán)請(qǐng)告知,我深表歉意。
總結(jié)
以上是生活随笔為你收集整理的如何利用matlab画三维图_平面图怎么画(新手如何入门pytorch)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: viterbi算法_序列比对(十四)——
- 下一篇: 如何开启微店相机权限