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

摘要:
如何在Matlab中使用箭头绘制坐标系如何在Matlab中使用箭头创建坐标系如何实现原理演示效果当使用Matlab的绘图功能实现完整代码的原理时,默认设置为箱形坐标系。如果要在下图中用箭头绘制坐标系,需要如何实现?Matlab可以方便地提供轴对象在图形对象中的位置、轴对象的值范围、坐标轴的宽度和高度。
如何在 Matlab 中绘制带箭头的坐标系

实现原理

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

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

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

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

方法一:通过设置 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 中绘制带箭头的坐标系第3张
运行结果

方法二:使用 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)),则该点在图窗的位置坐标为

[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 中绘制带箭头的坐标系第4张如何在 Matlab 中绘制带箭头的坐标系第5张

效果还还不错~


完整代码

其中使用到的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

免责声明:文章转载自《如何在 Matlab 中绘制带箭头的坐标系》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇特征选择 (feature_selection)ggplot2 配色渐变 二色/三色梯度下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

转:ECharts图表组件入门教程之Theme:ECharts图表的皮肤是什么?如何给图表换主题(皮肤)Theme?

一、什么是ECharts图表的皮肤(主题)? 针对这个问题我只能这样回答,ECharts图表的主题(皮肤)就犹如人的衣服一样,是用来衬托和渲染主体,使其变得更加美观好看的目的。你去过ECharts图表组件的官网应该都看到每一个示例都支持皮肤切换的。我们更深入的理解,皮肤其实就是一些样式的定义集合。 图表有很多部分组成,比如:标题、坐标轴、Series数据、...

非线性方程(组):一维非线性方程(一)二分法、不动点迭代、牛顿法 [MATLAB]

1. 二分法(Bisection) 1) 原理   【介值定理】 对于连续的一元非线性函数,若其在两个点的取值异号,则在两点间必定存在零点。   【迭代流程】 若左右两端取值不同,则取其中点,求其函数值,取中点和与中点取值异号的端点构成新的区间(其中必有零点)。进行下一次迭代。 2) 实现二分求根算法   使用MATLAB实现二分法代码如下。捕捉异常主要...

echarts之tooltip-trigger

名称 类型 默认值 可选值 效果 trigger string ‘item’ ‘item’,’axis’ 触发类型,默认数据触发 当trigger为’item’ tooltip : { trigger: 'item' }   当trigger为’axis’ tooltip : { trigger: 'axis'...

(matlab)plot画图的颜色线型

(matlab)plot画图的颜色线型 y黄色·点线m粉红○ 圈线c亮蓝 × ×线r大红 + +字线g绿色 -实线b蓝色 *星形线w白色 : 虚线k黑色 -.-- 点划线matlab6.1线形:[ + | o | * | . | x | square | diamond | v | ^ | > | < | pentagram | hexagra...

D3.js 让图表动起来

D3 支持制作动态的图表。有时候,图表的变化需要缓慢的发生,以便于让用户看清楚变化的过程,也能给用户不小的友好感。 一、什么是动态效果  绘制完成后不再发生变化的,这是静态的图表。   动态的图表,是指图表在某一时间段会发生某种变化,可能是形状、颜色、位置等,而且用户是可以看到变化的过程的。   例如,有一个圆,圆心为 (100, 100)。现在我们希望圆...

【转】几款网络仿真软件的比较

转自: 网络仿真技术是一种通过建立网络设备和网络链路的统计模型, 并模拟网络流量的传输, 从而获取网络设计或优化所需要的网络性能数据的仿真技术。由于仿真不是基于数学计算, 而是基于统计模型,因此,统计复用的随机性被精确地再现。网络仿真技术具有以下特点:一, 全新的模拟实验机理使其具有在高度复杂的网络环境下得到高可信度结果的特点。二, 网络仿真的预测功能是其...