如何在 Matlab 中绘制带箭头的坐标系
如何在 Matlab 中绘制带箭头的坐标系
实现原理
使用 matlab 的绘制函数时,默认设置为一个方框形的坐标系,
如果想要绘制的如下图所示中的带箭头的坐标系,需要如何实现呢?
方法一:通过设置 axis 对象 的属性来调整坐标轴,参考代码如下:
% 通过设置axis的属性调整坐标轴
clear;
figure('Color', [0.15, 0.15, 0.15]);
% 一个简单的示例
x = linspace(-pi, 5*pi, 301);
y = sin(x);
h_p = plot(x, y, 'LineStyle', '-', 'Color', [0.39, 0.83, 0.07], 'LineWidth', 1);
% 获得当前坐标轴对象
h_a = gca;
% 关闭坐标盒子
box off
% 设置坐标的背景颜色
set(h_a, 'color' , [0.15, 0.15, 0.15]);
% 将坐标轴移到原点处
set(h_a, 'XAxisLocation', 'origin');
set(h_a, 'YAxisLocation', 'origin');
% 设置坐标轴的颜色
set(h_a, 'Xcolor', [0.8, 0.52, 0.98]);
set(h_a, 'Ycolor', [0.8, 0.52, 0.98]);
方法二:使用 Matlab 自带的一个图窗标注函数 annotation,具体用法请点击查看文档,简而言之,该函数可以在图窗指定位置绘制图形(箭头,矩形,椭圆等)或文字。其中绘制箭头的调用格式为
arrow_obj = annotation(fig_obj, 'arrow', [x0, x1], [y0, y1]);
x0,y0 表示的箭头末端(无箭头)在图窗的位置坐标;x1,y1 表示的箭头始端(有箭头)在图窗的位置坐标。(说明:图窗对象的坐标原点在左下角,水平方向为x方向,竖直方向为y方向,位置坐标均为归一化坐标,即范围为0~1)
也就是说,使用 annotation 完全可以实现绘制带箭头的坐标轴的目标,但是繁琐的地方在于如何精装的确定坐标轴在图窗的位置坐标。
稍微思索下,其实也不是很难。Matlab 可以很方便的提供 axis 对象在 figure 对象的位置,axis 对象的的取值范围、坐标轴的宽和高等属性。利用这点,我们很容易确定坐标原点\(O(0,0)\)在图窗中的位置坐标(任意点都是如此),再由 axis 对象的长宽属性很容易确定坐标轴在图窗的始末位置坐标。
具体计算公式如下:(实现于函数 CoorFromAxis2Fig.m)
设 axis 对象的坐标轴的取值范围分别为 \([x_{min}, x_{max}]\), \([y_{min}, y_{max}]\);
调用函数可以查看
x_range = get(axis_obj, 'XLim'); y_range = get(axis_obj, 'YLim');
设 axis 对象在图窗的位置坐标为 \((X_0, Y_0)\),宽(沿 x 方向)为 \(W\),高(沿 y 方向)为 \(H\);
调用函数可以查看
[X0, Y0, W, H] = get(axis_obj, 'Position');
设待求点的 axis 坐标为\((x_p, y_p)\),则该点在图窗的位置坐标为
有了这个函数,可以很方便计算出 axis 上的点在图窗的位置坐标,因此只需确定 axis 对象就可以很方便地绘制出待箭头的坐标系(具体实现见 DrawAxisWithArrow.m),同时如果想在坐标上某个位置标注文字也可以利用这个函数进行坐标转换(图2中文字均是调用 FigPointLabel.m 绘制)。
演示效果
效果还还不错~
完整代码
其中使用到的API功能描述如下,函数实现和用法详见源码和实例。
-
DrawAxisWithArrow
自动确定坐标原点在图窗的位置,并以此来绘制带箭头的坐标轴; -
CoorFromAxis2Fig
进行坐标转换,将点在坐标轴(axis)上的坐标转换为在图窗(figure)的归一化坐标; -
FigPointLabel
在图窗上的某点附近添加文字。结合函数CoorFromAxis2Fig
,可以很方便在 axis 上添加文字(只需知道该点在 axis 的坐标); -
SaveFig2Img
保存图窗;
完整的函数代码和实例: