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

Wreng發表於2021-08-17

如何在 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

相關文章