八年+的MATLAB算法开发经验,居然被一个箭头难倒?
最近做到一个优化算法项目,最终需要绘制结果图,且途中的点之间需要用箭头来做连接。然而发现没有现成的内置函数可用,没办法既然没有轮子,咱们就自己动手造。
好在MATLAB中有这么一个函数——annotation,为我的造轮之路提供了很大的便利。annotation是用来做图上标注的,其入参中就包含坐标,但是要求坐标范围在0-1。也就是说这个函数的入参不能用实际的坐标点。
进一步分析发现,annotation之所以要求输入的坐标在0-1,是因为它是基于当前图窗的位置和尺寸参数来绘制箭头的,这样的话,思路就清晰了:将实际坐标映射到当前图窗的尺寸范围内,再作为annotation函数的入参绘制箭头即可。话不多说,直接上代码:
clc
clear
close all
x0=0:pi/5:2*pi;
y0=10.*sin(x0);
loc=[x0' y0'];
figure(1)
plot(loc(:,1),loc(:,2),'kp');
ax=gca;
%计算实际坐标x轴跨度
dex=ax.XLim(2)-ax.XLim(1);
%计算实际坐标与当前图窗的缩放比例
bx=dex/ax.Position(3);
%计算实际坐标y轴跨度
dey=ax.YLim(2)-ax.YLim(1);
%计算实际坐标与当前图窗的缩放比例
by=dey/ax.Position(4);
de=dex/60;
hold on
for j=1:size(loc,1)
if j>1
%根据缩放比例定位实际坐标点在当前图窗上的位置
x=ax.Position(1)+([loc(j-1,1) loc(j,1)]-ax.XLim(1))./bx;
y=ax.Position(2)+([loc(j-1,2) loc(j,2)]-ax.YLim(1))./by;
annotation('arrow',x,y,'Color','r');
end
text(loc(j,1)+de,loc(j,2),num2str(j))
end
hold off
效果如下:
从图上可以看出,完美连接所有点。轮子造完,可以拿去造车了^_^