Matlab에서 그래프를 애니메이션으로 저장하는 방법에 대해서 예시코드를 공유합니다.
Matlab에서 그래프를 애니메이션으로 저장
myVideo = VideoWriter('VideoName'); myVideo.FrameRate = 10; myVideo.Quality = 80; open(myVideo) compPlot = figure('Name', 'Figure Name', 'WindowState', 'maximized'); ax1 = axes('Parent', compPlot); puase(0.1) xlabel(ax1, 'xlabel name'); ylabel(ax1, 'ylabel name'); zlabel(ax2, 'zlabel name'); set(ax1, 'xtick', [ 0 : 0.5 : 10]); set(ax1, 'ytick', [ 0 : 0.5 : 10]); set(ax1, 'ztick', [ 0 : 0.5 : 10]); set(ax1, 'xlim', [0, 10]); set(ax1, 'ylim', [0, 10]); set(ax1, 'zlim', [0, 10]); axis equal; hold on; rsCount = length(xData); plot3(ax1, xData, yData, zData, '-', 'Color', 'black', 'LineWidth', 1); hold on; for i = 1 to reCount plot(ax1, xData(i), yData(i), zData(i), "o", 'Color', 'red', 'LineWidth', 2); hold on; pbaspect(ax1, [1, 1, 1]) view(ax1, [-31, 9]) legend(ax1, {'route', 'plane'}) pause(0.1) frame = getframe(gcf); writeVideo(myVideo, frame); hold off; end close(myVideo);
비디오 객체 생성
(line : 1~4) 가장 먼저 해야 할 일은 영상을 저장할 비디오 객체를 생성하는 것입니다. 이 때 생성된 비디오 객체에 각각의 프레임을 저장하는 방식으로 영상을 만들게 됩니다.
마지막에 프레임을 모두 저장한 뒤에 해당 객체를 닫음으로써 영상 저장을 마무리합니다. (line : 49)
그래프 figure 정의
(line 6~25) 그래프를 그릴 Figure를 정의합니다. Figure의 이름을 정의하고, 처음 실행을 하게 되면 전체 화면으로 실행될 수 있도록 ‘WindowState’ 파라메터를 ‘maximized’로 설정하였습니다.
Figure가 처음 열리면 화면이 커지고 안에 axis도 화면의 크기에 따라 커지기 까지 약간의 시간이 필요하며 이를 위해서 0.1초의 pause를 부여하였습니다.(line 9)
label, tick, limit 등은 각자의 목적에 맞게 설정하시면 됩니다. (line 11 ~ 21)
기본 그래프 그리기
바로 그래프를 애니매이션을 이용해서 그릴 수 있으나 약간의 트릭을 이용하여 라인 트레이서와 같이 경로를 따라가도록 설정해 보겠습니다. 그러기 위해서 처음 경로에 해당하는 그래프를 먼저 그린다음 hold on 명령으로 고정시켜줍니다. (line 29 ~ 30)
애니매이션 객체 그리기
애니매이션을 적용하기 위해서 For 루프를 돌며 한 개의 점을 지속적으로 찍도록 합니다. (line 32 ~ 47) 앞서 그린 그래프와 거의 동일한 구조이지만 기본 그래프가 데이터 배열을 입력값으로 사용했다면 이번에는 순차적으로 한 개씩 데이터를 조회하여 그래프에 그려줍니다. 이 때 For 루프를 돌면서 마지막에 hold off; 조건을 입력해줘야 기존의 점이 지워지고 다른 점이 찍혀 이동하는 효과를 나타내게 됩니다.(line 46) 만약 hold off가 없다면 그래프가 점점 자라나는 모습이 나타나게 됩니다.
그렇게 그린 데이터는 프레임을 추출하여 저장하게 됩니다.(line 43 ~ 44)
비디오 파일 찾기
그렇게 저장된 비디오 파일을 해당 m 스크립트가 저장된 폴더에 함께 저장되게 됩니다. 다시 스크립트를 실행하면 기존의 파일이 지워지고 덮어쓰기 되며, 파일을 열려있다면 해당 파일에 대한 쓰기 권한을 가져올 수 없기 때문에 에러가 발생하게 됩니다.