Aviad
Aviad

Reputation: 53

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

I read a lot of answers here, but for some reason my animation still doesn't work as expected.

The axis range should vary from frame to frame. The 'Hurricane Center' caption should remain in the center all the time, but the captions from the previous frames must be erased. Also, I'm afraid that some of the data from previous parts remain.

I used hold on and draw now but it still happens.


The animation can be seen here:

image


Code:

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

Upvotes: 1

Views: 1627

Answers (3)

Wolfie
Wolfie

Reputation: 30121

If you don't want the previous data to remain, then you shouldn't use hold on... I think you should revise your code as follows:

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

Upvotes: 1

Zep
Zep

Reputation: 1576

The best of the two worlds:

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

Upvotes: 2

Laleh
Laleh

Reputation: 508

Instead of writing the text every time, just modify its position in the loop. Create a text object out side of the loop

t = text(position1, position2, txt);

in the loop change the position and if necessary the text

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

Upvotes: 1

Related Questions