getframe produces empty structure when attempting to create animation
6 views (last 30 days)
Show older comments
Rowan Rushton
on 8 Mar 2022
Edited: Rowan Rushton
on 9 Mar 2022
I am attempting to create a video from an animation of a heatmap of spatial data. Using getframe has worked for me previously when capturing figures of point data, but here I have seperate colour maps for bathymetry and the bincount of particles (as a pcolor plot) in the spatial grid so there are two axes (which I suspect is the issue). The code I used to create my heatmap figures follows:
blue_map = zeros(n,3); blue_map(:,3) = linspace(0,0.7,n)'; blue_map = flip(blue_map);
clear M
figure('Position',[1200 500 900 1200])
ax1 = axes;
bathy_contour = contourf(ax1,bathy_lon,bathy_lat,bathy,[0:5:100],'Edgecolor','none');
xlabel('Longitude','FontSize',12)
ylabel('Latitude','FontSize',12)
view(2)
ax2 = axes;
heatmap = pcolor(ax2,lon(1:end-1),lat(1:end-1),hist_heat_map(:,:,1));
set(heatmap,'EdgeColor','none');
caxis([0 200])
hold on
drouged1_fig = plot(drouged1{1,3},drouged1{1,2},'.r','MarkerSize',14,'DisplayName','SOSBU-MS-1');
drouged2_fig = plot(drouged2{1,3},drouged2{1,2},'.g','MarkerSize',14,'DisplayName','SOSBU-MS-2');
drouged3_fig = plot(drouged3{1,3},drouged3{1,2},'.y','MarkerSize',14,'DisplayName','SOSBU-MS-3');
linkaxes([ax1,ax2])
ax2.Visible = 'off'; ax2.XTick = []; ax2.YTick = [];
colormap(ax1,blue_map)
colormap(ax2,'autumn')
xlim([-5.6 -2.8])
ylim([53 55])
set([ax1,ax2],'Position',[.17 .11 .685 .815]);
cb1 = colorbar(ax1,'Position',[.05 .11 .0675 .815]);
cb1.Label.String='Depth below sea level (m)';
cb1.Label.FontSize=11;
cb2 = colorbar(ax2,'Position',[.88 .11 .0675 .815]);
cb2.Label.String='Number of particles per bathymetry grid cell';
cb2.Label.FontSize=11;
set(gcf,'Renderer','zbuffer');
hold off
legend([drouged1_fig drouged2_fig drouged3_fig])
M = getframe(gcf);
for i = 2:size(hist_heat_map,3)
heatmap.CData = hist_heat_map(:,:,i);
drouged1_fig.XData = drouged1{int(i),3};
drouged1_fig.YData = drouged1{int(i),2};
drouged2_fig.XData = drouged2{int(i),3};
drouged2_fig.YData = drouged2{int(i),2};
drouged3_fig.XData = drouged3{int(i),3};
drouged3_fig.YData = drouged3{int(i),2};
set(gcf,'Renderer','zbuffer');
legend([drouged1_fig drouged2_fig drouged3_fig])
drawnow
M(j) = getframe(gcf);
end
This code performs without errors and generates what I want to see, which is the heatmap pcolor plot overlaying the bathymetry contour plot. However, the fields cdata and colormap in structure M hold empty cells when the loop has executed, so I have nothing to write a video with.
Does anyone have a suggestion as to how I can capture everything in my figure window to create an animation with? Any help would be appreciated.
Thank you for your time.
4 Comments
Walter Roberson
on 8 Mar 2022
I recommend against continually calling gcf() . The current figure can change under various circumstances, including that the user happens to click something else in order to move it out of the way to see what is happening.
I recommand that you record the output of the figure() call and use that has the figure handle instead of gcf()
Accepted Answer
More Answers (0)
See Also
Categories
Find more on Animation in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!