如何在 Matlab 中绘制带箭头的坐标系

如何在 Matlab 中绘制带箭头的坐标系


实现原理

使用 matlab 的绘制函数时,默认设置为一个方框形的坐标系,

如何在 Matlab 中绘制带箭头的坐标系图1

如果想要绘制的如下图所示中的带箭头的坐标系,需要如何实现呢?

如何在 Matlab 中绘制带箭头的坐标系图2

这里首先介绍 Matlab 自带的一个图窗标注函数 annotation,具体用法请点击查看文档,简而言之,该函数可以在图窗指定位置绘制图形(箭头,矩形,椭圆等)或文字。其中绘制箭头的调用格式为

arrow_obj = nnotation(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)\),则该点在图窗的位置坐标为

\[X_p = \frac{x_p - x_{min}}{x_{max}-x_{min}} \cdot W + X_0 \]

\[Y_p = \frac{y_p - y_{min}}{y_{max}-y_{min}} \cdot H + Y_0 \]

有了这个函数,可以很方便计算出 axis 上的点在图窗的位置坐标,因此只需确定 axis 对象就可以很方便地绘制出待箭头的坐标系(具体实现见 DrawAxisWithArrow.m),同时如果想在坐标上某个位置标注文字也可以利用这个函数进行坐标转换(图2中文字均是调用 FigPointLabel.m 绘制)。


演示效果

如何在 Matlab 中绘制带箭头的坐标系 如何在 Matlab 中绘制带箭头的坐标系

效果还还不错~


完整代码

其中使用到的API功能描述如下,函数实现和用法详见源码和实例。

  • DrawAxisWithArrow 自动确定坐标原点在图窗的位置,并以此来绘制带箭头的坐标轴;

  • CoorFromAxis2Fig 进行坐标转换,将点在坐标轴(axis)上的坐标转换为在图窗(figure)的归一化坐标;

  • FigPointLabel 在图窗上的某点附近添加文字。结合函数 CoorFromAxis2Fig,可以很方便在 axis 上添加文字(只需知道该点在 axis 的坐标);

  • SaveFig2Img 保存图窗;

完整的函数代码和实例:

  1. Github:https://github.com/songWreng/MatlabDrawNiceGraph
  2. Gitee:https://gitee.com/iam002/MatlabDrawNiceGraph.git
上一篇:数据处理与可视化(一)——Numpy基础


下一篇:import numpy as np