如何在 Matlab 中繪製帶箭頭的坐標系

如何在 Matlab 中繪製帶箭頭的坐標系


實現原理

使用 matlab 的繪製函數時,默認設置為一個方框形的坐標系,

圖1

如果想要繪製的如下圖所示中的帶箭頭的坐標系,需要如何實現呢?

圖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 繪製)。


演示效果

效果還還不錯~


完整程式碼

其中使用到的API功能描述如下,函數實現和用法詳見源碼和實例。

  • DrawAxisWithArrow 自動確定坐標原點在圖窗的位置,並以此來繪製帶箭頭的坐標軸;

  • CoorFromAxis2Fig 進行坐標轉換,將點在坐標軸(axis)上的坐標轉換為在圖窗(figure)的歸一化坐標;

  • FigPointLabel 在圖窗上的某點附近添加文字。結合函數 CoorFromAxis2Fig,可以很方便在 axis 上添加文字(只需知道該點在 axis 的坐標);

  • SaveFig2Img 保存圖窗;

完整的函數程式碼和實例:

  1. Github://github.com/songWreng/MatlabDrawNiceGraph
  2. Gitee://gitee.com/iam002/MatlabDrawNiceGraph.git
Tags: