zoukankan      html  css  js  c++  java
  • 如何在 Matlab 中绘制带箭头的坐标系

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


    实现原理

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

    图1

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

    图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 自带的一个图窗标注函数 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 绘制)。


    演示效果

    效果还还不错~


    完整代码

    其中使用到的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
  • 相关阅读:
    在emacs上使用博客园的代码功能
    Programming Pearls笔记之一
    Virtualbox中Archlinux联网问题
    微信公众平台消息接口开发集成解决方案
    发送短信
    基于JMS的数据交换既数据互操作平台的解决方案
    Spring MVC基于注解的Junit测试
    获取设置一个字节某一个位的数值
    NotificationManager
    调用系统联系人列表
  • 原文地址:https://www.cnblogs.com/wreng/p/15150750.html
Copyright © 2011-2022 走看看