Matlab實現(xiàn)生成箭頭坐標軸詳解
屬實是寫工具函數(shù)寫上癮了,又寫了一個一行代碼將坐標軸變?yōu)榧^坐標軸的函數(shù),而且可以對其進行隨意拖動和縮放(拖動需要先點擊那個像手掌的符號):

功能函數(shù)的引用非常簡單,就只是在最后面加上一行:
arrowAxes()或者arrowAxes(ax)
即可,以下給出幾個例子:
demo1 基礎使用
就像上面說的一樣,編寫好代碼后在最后面引用一下工具函數(shù)即可:
% arrow axes demo1 % @author:slandarer t=-pi:.2:2*pi; stem(t,sin(t),'LineWidth',1.5); arrowAxes()

demo2 軸方向
可以調整坐標區(qū)域的XAxisLocation屬性及YAxisLocation屬性來調整坐標軸的方向和位置,總共有九種組合,篇幅問題這里不一一列舉
這里只列舉常用的四種:
% arrow axes demo2 % @author:slandarer t=-pi:.2:2*pi; % 子圖1 ax1=subplot(2,2,1); plot(t,sin(t),'LineWidth',1.5); arrowAxes(ax1) % 子圖2 ax2=subplot(2,2,2); plot(t,sin(t),'LineWidth',1.5); ax2.XAxisLocation='top'; ax2.YAxisLocation='right'; arrowAxes(ax2) % 子圖3 ax3=subplot(2,2,3); plot(t,sin(t),'LineWidth',1.5); ax3.XAxisLocation='origin'; arrowAxes(ax3) % 子圖4 ax4=subplot(2,2,4); plot(t,sin(t),'LineWidth',1.5); ax4.XAxisLocation='origin'; ax4.YAxisLocation='origin'; arrowAxes(ax4)

demo3 軸的其他屬性
在引用工具函數(shù)前調整坐標軸的粗細和顏色,引用工具函數(shù)時,工具函數(shù)會自動提取坐標軸的屬性并賦予箭頭坐標軸:
% arrow axes demo3 % @author:slandarer t=-pi:.2:2*pi; stem(t,sin(t),'LineWidth',1.5); % 修改坐標軸屬性 ax=gca; ax.XColor=[1,0,0]; ax.LineWidth=2; ax.XAxisLocation='origin'; arrowAxes(ax)

后言
不管畫多少子圖,怎樣的軸方向和位置,每個子圖都能像如下這樣任意調整坐標范圍和圖像縮放。


工具函數(shù)完整代碼
function arrowAxes(ax)
%
% @author: slandarer
% @公眾號: slandarer隨筆
% @知乎 : hikari
% @CSDN : slandarer
%
% 期待您的關注!!!
help arrowAxes % 若不希望輸出[作者信息],請刪除這行
if nargin<1
ax=gca;
end
ax.Box='off';
ax.UserData.arrow{1}=[];
ax.UserData.arrow{2}=[];
ax.UserData.arrow{3}=[];
ax.UserData.arrow{4}=[];
pos=ax.Position;
xm=.02;
ym=.02;
% -------------------------------------------------------------------------
switch ax.XAxisLocation
case 'bottom'
ax.UserData.arrow{2}=annotation('arrow');
ax.UserData.arrow{2}.Color=ax.YColor;
ax.UserData.arrow{2}.Position=[pos(1),pos(2),0,pos(4)+ym];
case 'top'
ax.UserData.arrow{4}=annotation('arrow');
ax.UserData.arrow{4}.Color=ax.YColor;
ax.UserData.arrow{4}.Position=[pos(1),pos(2)+pos(4),0,-pos(4)-ym];
case 'origin'
ax.UserData.arrow{2}=annotation('arrow');
ax.UserData.arrow{2}.Color=ax.YColor;
ax.UserData.arrow{2}.Position=[pos(1),pos(2),0,pos(4)+ym];
ax.UserData.arrow{4}=annotation('arrow');
ax.UserData.arrow{4}.Color=ax.YColor;
ax.UserData.arrow{4}.Position=[pos(1),pos(2)+pos(4),0,-pos(4)-ym];
end
switch ax.YAxisLocation
case 'left'
ax.UserData.arrow{1}=annotation('arrow');
ax.UserData.arrow{1}.Color=ax.XColor;
ax.UserData.arrow{1}.Position=[pos(1),pos(2),pos(3)+xm,0];
case 'right'
ax.UserData.arrow{3}=annotation('arrow');
ax.UserData.arrow{3}.Color=ax.XColor;
ax.UserData.arrow{3}.Position=[pos(1)+pos(3),pos(2),-pos(3)-xm,0];
case 'origin'
ax.UserData.arrow{1}=annotation('arrow');
ax.UserData.arrow{1}.Color=ax.XColor;
ax.UserData.arrow{1}.Position=[pos(1),pos(2),pos(3)+xm,0];
ax.UserData.arrow{3}=annotation('arrow');
ax.UserData.arrow{3}.Color=ax.XColor;
ax.UserData.arrow{3}.Position=[pos(1)+pos(3),pos(2),-pos(3)-xm,0];
end
if strcmp(ax.XAxisLocation,'top')
if ~isempty(ax.UserData.arrow{1}),ax.UserData.arrow{1}.Position=[pos(1),pos(2)+pos(4),pos(3)+xm,0];end
if ~isempty(ax.UserData.arrow{3}),ax.UserData.arrow{3}.Position=[pos(1)+pos(3),pos(2)+pos(4),-pos(3)-xm,0];end
end
if strcmp(ax.YAxisLocation,'right')
if ~isempty(ax.UserData.arrow{2}),ax.UserData.arrow{2}.Position=[pos(1)+pos(3),pos(2),0,pos(4)+ym];end
if ~isempty(ax.UserData.arrow{4}),ax.UserData.arrow{4}.Position=[pos(1)+pos(3),pos(2)+pos(4),0,-pos(4)-ym];end
end
for i=1:4
if ~isempty(ax.UserData.arrow{i}),ax.UserData.arrow{i}.LineWidth=ax.LineWidth;end
end
reArrow()
% -------------------------------------------------------------------------
function reArrow(~,~)
if strcmp(ax.XAxisLocation,'origin')
pos=ax.Position;
ylim=ax.YLim;
sepy=(0-ylim(1))./(ylim(2)-ylim(1)).*pos(4);
switch true
case ylim(2)<=0
if ~isempty(ax.UserData.arrow{1}),ax.UserData.arrow{1}.Position=[pos(1),pos(2)+pos(4),pos(3)+xm,0];end
if ~isempty(ax.UserData.arrow{3}),ax.UserData.arrow{3}.Position=[pos(1)+pos(3),pos(2)+pos(4),-pos(3)-xm,0];end
case ylim(1)>=0
if ~isempty(ax.UserData.arrow{1}),ax.UserData.arrow{1}.Position=[pos(1),pos(2),pos(3)+xm,0];end
if ~isempty(ax.UserData.arrow{3}),ax.UserData.arrow{3}.Position=[pos(1)+pos(3),pos(2),-pos(3)-xm,0];end
case ylim(2)>0&ylim(1)<0
if ~isempty(ax.UserData.arrow{1}),ax.UserData.arrow{1}.Position=[pos(1),pos(2)+sepy,pos(3)+xm,0];end
if ~isempty(ax.UserData.arrow{3}),ax.UserData.arrow{3}.Position=[pos(1)+pos(3),pos(2)+sepy,-pos(3)-xm,0];end
end
end
if strcmp(ax.YAxisLocation,'origin')
pos=ax.Position;
xlim=ax.XLim;
sepx=(0-xlim(1))./(xlim(2)-xlim(1)).*pos(3);
switch true
case xlim(2)<=0
if ~isempty(ax.UserData.arrow{2}),ax.UserData.arrow{2}.Position=[pos(1)+pos(3),pos(2),0,pos(4)+ym];end
if ~isempty(ax.UserData.arrow{4}),ax.UserData.arrow{4}.Position=[pos(1)+pos(3),pos(2)+pos(4),0,-pos(4)-ym];end
case xlim(1)>=0
if ~isempty(ax.UserData.arrow{2}),ax.UserData.arrow{2}.Position=[pos(1),pos(2),0,pos(4)+ym];end
if ~isempty(ax.UserData.arrow{4}),ax.UserData.arrow{4}.Position=[pos(1),pos(2)+pos(4),0,-pos(4)-ym];end
case xlim(2)>0&xlim(1)<0
if ~isempty(ax.UserData.arrow{2}),ax.UserData.arrow{2}.Position=[pos(1)+sepx,pos(2),0,pos(4)+ym];end
if ~isempty(ax.UserData.arrow{4}),ax.UserData.arrow{4}.Position=[pos(1)+sepx,pos(2)+pos(4),0,-pos(4)-ym];end
end
end
end
set(ax.Parent,'WindowButtonMotionFcn',@reArrow); % 設置鼠標按下回調
end到此這篇關于Matlab實現(xiàn)生成箭頭坐標軸詳解的文章就介紹到這了,更多相關Matlab箭頭坐標軸內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
用位圖排序無重復數(shù)據(jù)集實例代碼(C++版)
本文講解如何用位圖排序無重復的數(shù)據(jù)集,我們使用C++實現(xiàn)一下這個方法2013-11-11
C++詳細講解函數(shù)調用與Struct和CLass的區(qū)別
主調函數(shù)使用被調函數(shù)的功能,稱為函數(shù)調用。在C語言/C++中,只有在函數(shù)調用時,函數(shù)體中定義的功能才會被執(zhí)行,下面讓我們詳細來了解2022-05-05

