How can I make a gif using subplots and avoid an error in function wgifc?
Show older comments
Hi everyone,
I am trying to generate a gif of my results over different timestep using the following procedure:
h = figure;
filename = 'testnew51.gif';
axis tight manual % this ensures that getframe() returns a consistent size
for t=10:10:100 % t is the percent number in the file name
subplot(121)
fn = "T_timestep_"+t+"_precent.bin";
fid = fopen(fn); % file for t-th step
nx = fread(fid,1,'int32');
ny = fread(fid,1,'int32');
T = reshape(fread(fid,nx*ny,'double'),nx,ny);
fclose = (fid);
contourf(T')
colorbar;
subplot(122)
fn = "S_timestep_"+t+"_precent.bin";
fid = fopen(fn); % file for t-th stepfid = fopen('S.bin');
nx = fread(fid,1,'int32');
ny = fread(fid,1,'int32');
S = reshape(fread(fid,nx*ny,'double'),nx,ny);
fclose = (fid);
contourf(S')
colorbar;
drawnow
% Capture the plot as an image
frame = getframe(h);
im = frame2im(frame);
[imind,cm] = rgb2ind(im,256);
% Write to the GIF File
if t == 1
imwrite(imind,cm,filename,'gif', 'Loopcount',inf);
else
imwrite(imind,cm,filename,'gif','WriteMode','append');
end
pause(0.2)
end
However I get the error:
Error using wgifc
Can only append to GIF89a format GIFs.
Error in writegif (line 306)
wgifc(mat, map, filename,writemode,disposalmethod,delaytime,...
Error in imwrite (line 566)
feval(fmt_s.write, data, map, filename, paramPairs{:});
Error in matlab_run (line 34)
imwrite(imind,cm,filename,'gif','WriteMode','append');
How can I resulve that? Or is there a better way to generate a gif?
And also how can I scale the x-axis and y-axis of the subplots in respect of an scaled entity of nx and ny respectively? So that the ratio of the subplots are representing my original grid.
Thanks a lot already in advance for all your help and time.
Accepted Answer
More Answers (1)
The calling style "subplot(121)" is outdated for over 20 years now. Use subplot(1, 2, 1) instead.
You can simplify:
reshape(fread(fid,nx*ny,'double'),nx,ny)
to
fread(fid, [nx, ny],'double')
This line redefines the command fclose as a variable:
fclose = (fid);
You want this instead:
fclose(fid);
I guess, that the number of unclosed files stops opening a new file, because the number of simultaneously open files is limited by the operating system. The error message would be misleading, if this is true.
Use fclose('all') in the command window to clean up the already open files or restart Matlab.
how can I scale the x-axis and y-axis of the subplots in respect of an scaled entity of nx and ny respectively? So that the ratio of the subplots are representing my original grid.
I'm not sure, what this means. Maybe:
axesH = subplot(1, 2, 1);
axis(axesH, 'equal');
18 Comments
David Kaeser
on 10 Nov 2021
Edited: David Kaeser
on 13 Nov 2021
Jan
on 11 Nov 2021
Which Matlab version are you using?
David Kaeser
on 11 Nov 2021
Walter Roberson
on 11 Nov 2021
imwrite() is not able to write out a different colormap for each frame of a GIF. You need to work out a colormap first, and use rgb2ind() to map each frame based upon that colormap.
If you instead write out RGB images without a colormap, then imwrite() will determine a colormap based upon the first frame, and will convert all remaining frames to that colormap.
David Kaeser
on 11 Nov 2021
Hmmm, it is not obvious at the moment. Could you test the following?
And just in case... please make sure that the output file does not already exist.
h = figure();
filename = 'testnew51.gif';
axis tight manual % this ensures that getframe() returns a consistent size
for t = 1 : 10
surf(rand(20,20));
drawnow();
frame = getframe(h);
im = frame2im(frame);
[imind,cm] = rgb2ind(im,256);
% Write to the GIF File
if t == 1
imwrite(imind,cm,filename,'gif', 'Loopcount',inf);
else
imwrite(imind,cm,filename,'gif','WriteMode','append');
end
end
[images, cmap] = imread(filename, 'Frames', 'all');
size(images)
size(cmap)
David Kaeser
on 13 Nov 2021
Walter Roberson
on 13 Nov 2021
The system that I ran the code on has a small display.
David Kaeser
on 13 Nov 2021
Jan
on 13 Nov 2021
I've tried it with different colormaps for the appended images and different sizes, but cannot reproduce the error message.
Did you restart Matlab and the computer already? Did you examing the created GIF file with an image viewer and can you confirm that it has the 89a format?
David Kaeser
on 13 Nov 2021
Edited: David Kaeser
on 13 Nov 2021
Jan
on 14 Nov 2021
Do you have write permissions in tis folder?
David Kaeser
on 15 Nov 2021
Jan
on 15 Nov 2021
This is too strange. Think twice.
Set a breakpoint in this line:
imwrite(imind,cm,filename,'gif', 'Loopcount',inf);
After this command ran, check, if the file was created:
isfile(fullfile(cd, filename))
If the file is not created, but you do not get an error message, the most logical explanation is an attack of extraterrestrials.
David Kaeser
on 16 Nov 2021
David Kaeser
on 16 Nov 2021
Walter Roberson
on 16 Nov 2021
To check: are you doing the isfile() before you do the imwrite 'loopcount' call, or after that call? The file is not expected to exist until after the call.
David Kaeser
on 16 Nov 2021
Categories
Find more on Data Import and Analysis 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!
