我创建了一个简单的时间序列图。然后我放大。当我放大时,我想计算缩放区域Y数据的平均值,并将其与原始Y数据绘制在同一图形上。我尝试了下面的代码,但它做了什么,它擦除了原始的Y数据,只绘制了平均数据。
d = rand(1,length(t));
f = figure;ta = plot(t,d)
he = zoom;
guidata(ta,struct('d',d't',t,'axes',ta));
he.ActionPostCallback = @calcMean;
function calcMean(obj,evd)
data = guidata(obj);
newLim = evd.Axes.XLim;
tStart = round(newLim(1));
tEnd = round(newLim(2));
Croppedt = find(data.t(tStart:tEnd));
CroppedD = ones(1,length(Croppedt)).*mean(data.d(Croppedt));
plot(gca,data.t(tStart:tEnd),CroppedD,'r')
end
有什么想法吗?谢谢!
答案 0 :(得分:1)
你需要hold
图表来阻止它删除原始数据。
创建第一个图后,请输入以下代码。
hold on
理想情况下,您应该确定要保留哪些轴:
f = figure;
ax = axes ( 'parent', f );
plot ( ax, .... )
hold ( ax, 'on' )
虽然不是绝对必要的(Matlab会假设gca
是当前的轴,如果没有指定 - 这是一个很好的做法,如果你编写更复杂的代码等,将来可能会避免一些错误...
修改强> 您需要将手柄保存到缩放的绘图中,例如(未经测试)
function calcMean(obj,evd)
data = guidata(obj);
newLim = evd.Axes.XLim;
tStart = round(newLim(1));
tEnd = round(newLim(2));
Croppedt = find(data.t(tStart:tEnd));
CroppedD = ones(1,length(Croppedt)).*mean(data.d(Croppedt));
if isfield ( data, 'zoomHandle' )
delete ( data.zoomHandle )
end
data.zoomHandle = plot(gca,data.t(tStart:tEnd),CroppedD,'r');
% you then need to update the guidata to save the handle.
guidata(obj,data);
端