MATLAB | 一行代码生成箭头坐标轴,为坐标轴增添箭头

属实是写工具函数写上瘾了,又写了一个一行代码将坐标轴变为箭头坐标轴的函数,而且可以对其进行随意拖动和缩放(拖动需要先点击那个像手掌的符号):
在这里插入图片描述
功能函数的引用非常简单,就只是在最后面加上一行:

arrowAxes()

或者

arrowAxes(ax)

即可,以下给出几个例子:

demo1 基础使用

就像上面说的一样,编写好代码后在最后面引用一下工具函数即可:

% arrow axes demo1
% @author:slandarer

t=-pi:.2:2*pi;
stem(t,sin(t),'LineWidth',1.5);

arrowAxes()

在这里插入图片描述

demo2 轴方向

可以调整坐标区域的XAxisLocation属性及YAxisLocation属性来调整坐标轴的方向和位置,总共有九种组合,篇幅问题这里不一一列举,想了解的可以去以下网址瞅瞅:

坐标区的外观和行为 - MATLAB - MathWorks 中国

这里只列举常用的四种:

% 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 轴的其他属性

在引用工具函数前调整坐标轴的粗细和颜色,引用工具函数时,工具函数会自动提取坐标轴的属性并赋予箭头坐标轴:

% 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)

在这里插入图片描述

后言

不管画多少子图,怎样的轴方向和位置,每个子图都能像如下这样任意调整坐标范围和图像缩放。
在这里插入图片描述
在这里插入图片描述

工具函数完整代码

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
  • 21
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
### 回答1: Matlab是一款常用的数学计算软件,在绘制函数图像时,经常需要指定坐标轴和绘制箭头以表示方向。下面介绍如何在Matlab中绘制箭头坐标轴Matlab提供了一个Quiver函数,可以用来绘制带有箭头的向量场。我们可以利用该函数来绘制箭头坐标轴。 首先,要生成一些数据点来表示箭头的位置和方向。可以使用meshgrid函数来生成一组网格点坐标。例如,下面的代码生成了一个包含20个点的矩阵X和Y。 [X, Y] = meshgrid(linspace(-1,1,20), linspace(-1,1,20)); 接下来,定义一个表示水平方向的向量U和表示垂直方向的向量V。这里使用了sin和cos函数来生成一个类似于“十字”形状的向量场。 U = cos(X) + sin(Y); V = sin(X) - cos(Y); 最后,调用quiver函数来绘制向量场,并用axis函数来指定坐标轴范围。 quiver(X,Y,U,V); axis([-1.2 1.2 -1.2 1.2]); 绘制出来的图像会在上下左右四个方向上增加箭头来表示坐标轴方向。 除了使用quiver函数绘制向量场外,Matlab还提供了多种绘制箭头的方式,比如arrow函数、annotation函数等。不同的绘制方式适用于不同的场景和需求,具体选择要根据实际情况来决定。 ### 回答2: 在Matlab中绘制函数图像可以使用plot函数,也可以使用fplot函数。当我们需要在绘图中添加箭头坐标轴时,可以使用quiver函数。 Quiver函数的基本用法是:quiver(x,y,u,v)。其中x和y表示箭头的起点坐标,u和v表示箭头的长度和方向,可以理解为横向和纵向的分量。除此之外,quiver函数还可以添加一些参数,比如添加颜色、箭头的宽度等。 绘制坐标轴可以使用axis函数或gca函数。axis函数可以设置坐标轴的取值范围,gca函数可以获取当前的坐标轴对象,通过修改其属性实现更加精细的定制。 举个例子,如果我们需要绘制一个sin函数及其一阶导数的曲线,可以按照以下步骤操作: 1. 定义x轴的取值范围:x = linspace(0, 2*pi, 100); 2. 计算函数值:y = sin(x); dy = cos(x); 3. 绘制函数图像:plot(x, y); hold on; plot(x, dy); 4. 添加箭头:quiver(x, y, ones(size(x)), dy, 0.5); 5. 设置坐标轴:axis([0 2*pi -1.5 1.5]); gca().YAxisLocation = 'origin'; 在上述代码中,quiver函数中的第四个参数表示箭头的长度,这里设置为0.5。最后一行代码将Y轴的位置设置为原点。 以上就是使用Matlab绘制函数图像并添加箭头坐标轴的基本方法。需要注意的是,在实际操作中需要根据具体的情况调整参数和图像的样式。 ### 回答3: Matlab是一种常用的工具软件,可以用来进行数学计算、科学绘图等等。在函数图像绘制方面,Matlab提供了非常丰富的功能,可以方便地实现各种绘图需求。 其中,绘制箭头坐标轴也是Matlab的一项常见功能。在绘制函数图像时,我们常常需要标注出坐标轴箭头,以便读者更好地理解函数的变化趋势和特征。 在Matlab中,绘制坐标轴可以使用axes函数和axis函数来实现,它们可以设置坐标轴的范围、刻度、标签等等。而绘制箭头则可以使用quiver函数来实现,quiver函数可以根据坐标轴上的向量大小和方向绘制对应的箭头。 具体地说,我们可以使用如下代码来实现在Matlab中绘制带有箭头坐标轴: ```matlab % 设置坐标轴范围和刻度 axis([-5 5 -5 5]) xticks([-5:1:5]) yticks([-5:1:5]) % 绘制x轴和y轴 axes('Position',[0.1 0.1 0.8 0.8]) plot([-5 5],[0 0],'k','LineWidth',1.2) % x轴 hold on plot([0 0],[-5 5],'k','LineWidth',1.2) % y轴 % 绘制箭头 quiver(4,0,1,0,'LineWidth',1.5,'MaxHeadSize',0.5) % x轴箭头 quiver(0,4,0,1,'LineWidth',1.5,'MaxHeadSize',0.5) % y轴箭头 % 设置坐标轴标签 xlabel('x') ylabel('y') ``` 上述代码中,我们首先在坐标轴上设置了范围和刻度,并使用plot函数分别绘制x轴和y轴。然后,在箭头绘制部分,我们使用了quiver函数来绘制箭头,并设置了箭头宽度、最大头部尺寸等属性。 最后,我们使用xlabel和ylabel函数来设置坐标轴的标签。这样,在Matlab中就可以方便地绘制带有箭头坐标轴了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

slandarer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值