【问题标题】:MATLAB Zoom then plot new dataMATLAB Zoom 然后绘制新数据
【发布时间】:2016-02-24 16:24:00
【问题描述】:

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

有什么想法吗?谢谢!

【问题讨论】:

    标签: matlab plot zooming


    【解决方案1】:

    您需要hold 绘图以阻止它擦除原始数据。

    在创建第一个绘图后输入以下代码。

    hold on
    

    理想情况下,您应该告诉 hold 要握住哪些轴:

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

    结束

    【讨论】:

    • 有效!最后一个问题:如何删除当前行以便绘制新行?它目前的工作方式是每次我放大/缩小时都会画一条新线,这就是它的设计方式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-15
    • 1970-01-01
    • 2012-08-17
    • 2015-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多