虽然我使用了 'drawnow' 和 'hold on',但最后的情节仍然出现在动画中 - MATLAB

Although I used 'drawnow' and 'hold on', last plot still appears in animation - MATLAB

我在这里阅读了很多答案,但出于某种原因,我的动画仍然无法按预期运行。

轴范围应因帧而异。 'Hurricane Center' 字幕应始终位于中央,但必须擦除前几帧的字幕。另外,恐怕前面部分的一些数据仍然存在。

我用了 hold ondraw now 但它仍然发生。


动画可以看这里:


代码:

v = VideoWriter('test_video.avi');
v.FrameRate = 4;
v.open()   

hold on
for i=1:length(relevant(1,1,:))      
    if isempty(relevant) == 0     
        title('Lightning around Hurricane Jerry')
        grid on  

        ylim([Interp_Jerry(i,2)-Radius Interp_Jerry(i,2)+Radius])
        xlim([Interp_Jerry(i,3)-Radius Interp_Jerry(i,3)+Radius])

        ylabel('latitude')
        xlabel('longitude')

        text(Interp_Jerry(i,3),Interp_Jerry(i,2),txt1); 

        scatter(relevant(:,3,i),relevant(:,2,i),'.');
        drawnow
        pause(0.1);  

        v.writeVideo(getframe(fig));
    end
end  
v.close()

如果你不想保留以前的数据,那么你不应该使用hold on...我认为你应该修改你的代码如下:

v = VideoWriter('test_video.avi');
v.FrameRate = 4;
v.open();  
fg = figure();
% Do not hold on, so that data is not retained frame-to-frame
for i=1:length(relevant(1,1,:))     
    % You don't need to test if 'relevant' is empty, since you're looping to its length!
    % New plot
    scatter(relevant(:,3,i),relevant(:,2,i),'.');
    % Customise plot (labels / axes / text / ...)
    title('Lightning around Hurricane Jerry')
    ylabel('latitude')
    xlabel('longitude')
    ylim([Interp_Jerry(i,2)-Radius Interp_Jerry(i,2)+Radius]);
    xlim([Interp_Jerry(i,3)-Radius Interp_Jerry(i,3)+Radius]);   
    text(Interp_Jerry(i,3),Interp_Jerry(i,2),txt1);     
    grid on;      
    drawnow;
    % You don't need to pause whilst plotting, you already set the video framerate.
    % pause(0.1); 
    v.writeVideo(getframe(fg));
end  
v.close()

不用每次都写文本,只需修改它在循环中的位置即可。在循环外创建一个文本对象

t = text(position1, position2, txt);

在循环中更改位置,必要时更改文本

set(t, 'position', [new_position1, new_position2]);

两全其美:

v = VideoWriter('test_video.avi');
v.FrameRate = 4;
v.open()   

hold on;
for i=1:length(relevant(1,1,:))      
    if ~isempty(relevant)  % Corrected     

        if i == 1
            % Prepare first plot and save handles of graphical objects
            ht = text(Interp_Jerry(i,3),Interp_Jerry(i,2),txt1); 
            hold on;
            hs = scatter(relevant(:,3,i),relevant(:,2,i),'.');

            ylabel('latitude')
            xlabel('longitude')
            title('Lightning around Hurricane Jerry')
            grid on  
        else
            % Update graphical objects
            set(ht, 'position', [Interp_Jerry(i,3), Interp_Jerry(i,2)]);
            set(hs, 'XData', relevant(:,3,i) , 'YData' , relevant(:,2,i));
        end

        ylim([Interp_Jerry(i,2)-Radius Interp_Jerry(i,2)+Radius])
        xlim([Interp_Jerry(i,3)-Radius Interp_Jerry(i,3)+Radius])

        drawnow
        pause(0.1);  

        v.writeVideo(getframe(fig));
    end
end  
v.close()