3 回答

TA貢獻1765條經驗 獲得超5個贊
簡短的回答:經常使用 Set('Xdata',...')。
示例代碼:
function PlotUpdate()
x = 0:.1:8;
y = sin(x);
h = plot(x,y);
y = sin(x.^3);
set(h,'XData',x,'YData',y);
end
長答案:
有三種相關措施可供選擇一種最佳方法。
代碼清晰 -有人閱讀您的代碼有多容易?
運行時 -每種方法執行任務的速度有多快?
代碼可移植性 -您重構代碼的速度有多快?
現在,讓我們分析可能的方法。
方法(1)-refreshdata
function PlotUpdate()
x = 0:.1:8;
y = sin(x);
h = plot(x,y);
set(h,'YDataSource','y')
set(h,'XDataSource','x')
y = sin(x.^3);
refreshdata(h,'caller');
end
M-lint立即在生產線發出警告 y=sin(x.^3)
The value assigned to variable `y` might be unused
為什么會發生? refreshdata使用eval并且m-lint不知道您將使用y。有人閱讀您的代碼,不妨完全刪除此行。發生這種情況是因為您違反了封裝原理。refreshdata從調用者工作區訪問變量。另一種看待這種情況的方法是,假設您將繪圖的句柄傳遞給另一個函數。讀者不知道您為什么寫y = sin(x.^3);這本書,以及它與劇情的更新有何關系。
現在讓我們討論速度/運行時間。通過查看refreshdata源代碼,您會注意到兩個丑陋的for循環,它們遍歷您空間中的所有圖形處理變量。這是第一個:
% gather up all the objects to refresh
objs = {};
for k = 1:length(h)
obj = h(k);
objfields = fields(obj);
for k2 = 1:length(objfields)
% search for properties ending in DataSource
if strncmpi(fliplr(objfields{k2}),'ecruoSataD',10)
objs = {objs{:},obj, objfields{k2}};
end
end
end
假設您沒有一個圖,但是有100個圖,而您只想更新第一個圖。這將非常慢,因為對于每個圖,您都會嘗試找到所需的圖?。ㄎ覍⒆鳛榫毩暪┳x者弄清楚是什么ecruoSataD,以及如何使用它。)
即使將相關的圖作為參數,您仍然會有第二個循環,該循環運行eval了好幾次。效率不高。最后我將顯示時間比較。
結論:難以理解,難以重構,運行緩慢
方法(2)-刪除并重新繪制
function PlotUpdate()
x = 0:.1:8;
y = sin(x);
h = plot(x,y);
set(h,'YDataSource','y')
set(h,'XDataSource','x')
y = sin(x.^3);
delete(h);
h = plot(x,y);
end
這種方法對讀者來說很清楚。您刪除了該圖,并繪制了一個新圖。但是,從最后的時間比較中可以看出,這是最慢的方法。
結論:易于理解,易于重構,運行速度非常慢
方法(3)-set('XData',...,'YData')
代碼真的很清楚。您想要修改繪圖的兩個屬性,XData和YData。而這正是您要做的。而且,代碼的運行速度非???,如下面的比較所示。
function PlotUpdate()
x = 0:.1:8;
y = sin(x);
h = plot(x,y);
y = sin(x.^3);
set(h,'XData',x,'YData',y);
end
由于使用了新的圖形引擎hg2(R2014b及更高版本),因此,如果您喜歡該表示法,還可以使用屬性語法來指定數據:
function PlotUpdate()
x = 0:.1:8;
y = sin(x);
h = plot(x,y);
y = sin(x.^3);
h.XData = x;
h.YData = y;
end
結論:易于理解,易于重構,運行速度快
這是時間比較代碼
function PlotUpdateTimeCompare()
x = 0:.1:8;
y = sin(x);
h = plot(x,y);
set(h,'YDataSource','y')
set(h,'XDataSource','x')
y = sin(x.^3);
tic
for i=1:100
refreshdata(h,'caller');
end
toc
tic
for i=1:100
delete(h);
h = plot(x,y);
end
toc
tic
for i=1:100
set(h,'XData',x,'YData',y);
end
toc
end
結果:
經過的時間為0.075515秒。
經過的時間為0.179954秒。
經過的時間為0.002820秒。

TA貢獻1824條經驗 獲得超8個贊
您可以調用該函數drawnow并執行類似的操作:
h = plot(nan);
for i = 1:n
y = ...
set(h,'YData',y);
drawnow %update the graph
end

TA貢獻1909條經驗 獲得超7個贊
假設我想用新數據更新繪圖。我應該選擇哪種方法?
如果給定軸上有多個線對象,則方法:
將XDataSource屬性設置為某些名稱,更新變量,然后調用
refreshdata
將在MATLAB R2012b中生成錯誤。Andrey的答案中提供了一個適當的示例。
已將一個錯誤提交給Mathworks。
- 3 回答
- 0 關注
- 1370 瀏覽
添加回答
舉報