Matlab繪圖
「手把手教學」第二彈來啦
在之前的文章中
Matlab繪圖:如何讓你的圖看起來就覺得很正确?mp.weixin.qq.com
我們介紹了一些非常簡單實用的Matlab繪圖操作(案例展示),包括
- 「選擇什麼樣」 的圖?
- 如何 「調整圖像」 使得含義表達更明确?
- 調整字型
- 儲存 「輸出圖像」
本文呢,我們來
「進一步調整圖像」,增添一些更有助于讀者了解的元素。
改進思路
首先我們來看下之前的圖像
大家集思廣益來看看有什麼改進的呢?
- 可以加個 「圖例」
- 加個标題說明一下 「用意」
- 說明一下x軸的變量
- 這個圖是三階收斂的,但是能不能 「表示地更明顯」 呢?
沒錯,我們可以加一個
「直角」三角形!
「長寬比」是
,就像下面這樣~
這樣讀者是不是就可以
「一目了然」地看出藍色的線條是
「關于參數」 「三階下降」的呢?
回顧
這裡,我們回顧一下藍色線條的含義,它反映的是函數
和它的Taylor展開到前三項的多項式逼近
的誤差。
同時,我們也繪制了Taylor展開式中保留前兩項
的誤差結果——
「紅色三角」表示
左上角的輔助三角形讓讀者一目了然地看到紅色的線是二階下降的。
輔助三角形的繪制
下面我們講講這個輔助的三角形怎麼繪制。
實際應用中,根據我們要描述的
「收斂點圖」的方向,我們需要下面四種三角形
觀察
「規律」- 都是直角三角形
- 直角邊 「平行于坐标軸」
- 根據斜邊來看
- A、B的 「斜邊斜率」 為負
- C、D的 「斜邊斜率」 為正
三角形的決定量
要繪制出一個這樣的三角形,我們隻需要如下的參數
- 水準邊的兩個點的坐标
- 斜邊的斜率
通過這些參數,我們來計算出三角形的三個頂點坐标(其實兩個已經有了,隻需要計算出第三個頂點)
下面我們拿一個三角形來
「具體說明」我們觀察這個三角形的斜邊,對應的是
階收斂。
為什麼呢?我們觀察
「右上角的點到左下角的點」的收斂率
橫坐标 變小了 縱坐标 變小了
是以,在這裡,我們可以得到
其中
對應的是斜邊的斜率,也是誤差随着參數
的收斂率。
因為
是以我們隻需要輸入
「水準邊的兩個頂點」的坐标以及
「斜邊的斜率」,我們就可以計算出第三個點的縱坐标
是以我們的函數的輸入部分如下書寫
function triangle(tr1,tr2,ratio)
x0 = tr1(1); y0 = tr1(2); x1 = tr2(1);
y1 = y0*(x1/x0)^ratio;
參數解釋
- tr1是水準邊上鄰接斜邊的那個頂點,是一個二維向量
- tr2是水準邊上另一個頂點,我們隻需要它的x坐标
- 仿照上文的公式, 「計算第三個頂點的y坐标」
繪制三角形
重點來啦!!
三角形的繪制過程:
把三個頂點依次連接配接起來「唯一值得注意」
的是,我們不希望這樣繪制的線條在添加圖例時被探測到。
(PS:如果什麼都不做,你在添加圖例時,會按照你繪圖的順序給每條線都加一個圖例)
是以,我們用下面的語句
loglog([x0,x1],[y0,y0],'-k','HandleVisibility','off','Linewidth',1.5);
loglog([x1,x1],[y0,y1],'-k','HandleVisibility','off','Linewidth',1.5);
loglog([x1,x0],[y1,y0],'-k','HandleVisibility','off','Linewidth',1.5);
其中
HandleVisibility
就是設定句柄是否可見。
最後,我們再添加顯示比例的文字(1和2)來輔助讀者更輕易地了解,使用matlab的text指令即可。
我們将繪制三角形的指令寫成一個function,如下
function triangle(tr1,tr2,ratio,text1,text2,pos_adjust)
x0 = tr1(1); y0 = tr1(2); x1 = tr2;
y1 = y0*(x1/x0)^ratio;
loglog([x0,x1],[y0,y0],'-k','HandleVisibility','off','Linewidth',1.5);
loglog([x1,x1],[y0,y1],'-k','HandleVisibility','off','Linewidth',1.5);
loglog([x1,x0],[y1,y0],'-k','HandleVisibility','off','Linewidth',1.5);
text(sqrt(x0*x1),y0*pos_adjust,text1,'fontsize',16);
text(x1*pos_adjust,sqrt(y0*y1),text2,'fontsize',16);
end
參數解釋:
- tr1:水準邊和斜邊交點坐标
- tr2:水準邊另一個端點坐标
- ratio:斜邊斜率
- text1:水準邊文字
- text2:垂直邊文字
- pos adjust:文字坐标的微調
總結
最後給出一個調用的例子(開始的例子)友善你來親手實踐一下~
close all
epsilon_set = [0.5,0.25,0.125,0.0625,0.03125];
result2_set = [0.10653,0.0288007,0.00749690258,0.0019130628,0.00048323447];
result3_set = [0.01846,0.0024492,0.00031559741,4.0062186e-05,5.046773e-06];
figure;
set(gcf,'unit','centimeters','position',[10,10,20,20]);
loglog(epsilon_set, result3_set,'b-o','LineWidth',2,'MarkerSize',18);
hold on;
loglog(epsilon_set, result2_set,'r-.^','LineWidth',2,'MarkerSize',18);
tr1 = [1e-1,1e-1]; tr2 = 2e-2; ratio = 2;
triangle(tr1,tr2,ratio,'1','2',1.2);
tr1 = [1e-1,5e-6]; tr2 = 1; ratio = 3;
triangle(tr1,tr2,ratio,'1','3',1.2);
grid on;
axis square;
xlim([1e-3,10]);
xlabel('{fontsize{28}epsilon}')
legend('前三項','前兩項')
title('Taylor展開誤差');
set(gca,'FontSize',22);
savepng('loglog.png')
function savepng(filename)
fig = gcf;
fig.PaperPositionMode = 'auto';
fig_pos = fig.PaperPosition;
fig.PaperSize = [fig_pos(3) fig_pos(4)];
print(fig,filename,'-dpng')
end
function triangle(tr1,tr2,ratio,text1,text2,pos_adjust)
x0 = tr1(1); y0 = tr1(2); x1 = tr2;
y1 = y0*(x1/x0)^ratio;
loglog([x0,x1],[y0,y0],'-k','HandleVisibility','off','Linewidth',1.5);
loglog([x1,x1],[y0,y1],'-k','HandleVisibility','off','Linewidth',1.5);
loglog([x1,x0],[y1,y0],'-k','HandleVisibility','off','Linewidth',1.5);
text(sqrt(x0*x1),y0*pos_adjust,text1,'fontsize',16);
text(x1*pos_adjust,sqrt(y0*y1),text2,'fontsize',16);
end
回味
相信你已經學會添加一個
「輔助了解」的三角形這個小技巧了吧~
最後再
「強調一下」吧~
有時候,你的圖中的三角形,雖然
「數學上」确實是 1:2 的,但是
「看起來卻不像」,如下
要怎麼調整呢?
原因是x軸的範圍太小了,把圖像給
「拉變形」了,是以把x軸的範圍修改成
xlim([1e-3,10])
就o了,因為這個時候x軸的跨度是
正好
「等于」y軸的跨度。
當然你又可能要說了,左右兩邊的空白太多了...那就閱讀原文看看裡面的答案是不是你想要的吧~
Matlab繪圖:繪制輔助三角形提升閱讀效果mp.weixin.qq.com