提取圖資料

有幾次,我有一個有趣的人物,但我丟失了對其資料的訪問許可權。此示例顯示瞭如何從圖中獲取提取資訊的技巧。

關鍵功能是 findobjgetfindobj 返回給定物件的屬性或屬性的物件的處理程式,例如 TypeColor 等。一旦找到了行物件, get 就可以返回屬性所持有的任何值。事實證明,Line 物件包含以下屬性中的所有資料:XDataYDataZData; 除非圖中包含 3D 圖,否則最後一個通常為 0。

下面的程式碼建立了一個示例圖,顯示了 sin 函式,閾值和圖例兩行

t = (0:1/10:1-1/10)';
y = sin(2*pi*t);
plot(t,y);
hold on;
plot([0 0.9],[0 0], 'k-');
hold off;
legend({'sin' 'threshold'});

findobj 的第一次使用會向兩行返回兩個處理程式:

findobj(gcf, 'Type', 'Line')
ans = 
  2x1 Line array:

  Line    (threshold)
  Line    (sin)

為了縮小結果, findobj 還可以使用邏輯運算子 -and-or 和屬性名稱的組合。例如,我可以找到一個線物件,其 DiplayNamesin 並讀取其 XDataYData

lineh = findobj(gcf, 'Type', 'Line', '-and', 'DisplayName', 'sin');
xdata = get(lineh, 'XData');
ydata = get(lineh, 'YData');

並檢查資料是否相等。

isequal(t(:),xdata(:))
ans =
     1
isequal(y(:),ydata(:))
ans =
     1

同樣,我可以通過排除黑線(閾值)來縮小我的結果:

lineh = findobj(gcf, 'Type', 'Line', '-not', 'Color', 'k');
xdata = get(lineh, 'XData');
ydata = get(lineh, 'YData');

並且最後一次檢查確認從該圖中提取的資料是相同的:

isequal(t(:),xdata(:))
ans =
     1
isequal(y(:),ydata(:))
ans =
     1