如何在 Matlab 中繪制帶箭頭的坐標系
實現原理
使用 matlab 的繪制函數時,默認設置為一個方框形的坐標系,

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

方法一:通過設置 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)\),則該點在圖窗的位置坐標為
有了這個函數,可以很方便計算出 axis 上的點在圖窗的位置坐標,因此只需確定 axis 對象就可以很方便地繪制出待箭頭的坐標系(具體實現見 DrawAxisWithArrow.m),同時如果想在坐標上某個位置標注文字也可以利用這個函數進行坐標轉換(圖2中文字均是調用 FigPointLabel.m 繪制)。
演示效果
![]() |
![]() |
---|
效果還還不錯~
完整代碼
其中使用到的API功能描述如下,函數實現和用法詳見源碼和實例。
-
DrawAxisWithArrow
自動確定坐標原點在圖窗的位置,並以此來繪制帶箭頭的坐標軸; -
CoorFromAxis2Fig
進行坐標轉換,將點在坐標軸(axis)上的坐標轉換為在圖窗(figure)的歸一化坐標; -
FigPointLabel
在圖窗上的某點附近添加文字。結合函數CoorFromAxis2Fig
,可以很方便在 axis 上添加文字(只需知道該點在 axis 的坐標); -
SaveFig2Img
保存圖窗;
完整的函數代碼和實例: