MATLAB Zoom然后绘制新数据

时间:2016-02-24 16:24:01

标签: matlab plot zoom

我创建了一个简单的时间序列图。然后我放大。当我放大时,我想计算缩放区域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

有什么想法吗?谢谢!

1 个答案:

答案 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);