Source code for pyleecan.Functions.Plot.animate_as_gif
# -*- coding: utf-8 -*-
import imageio
from os.path import join
from os import remove
from glob import glob
from SciDataTool import VectorField
from matplotlib.pyplot import subplots
[docs]def animate_as_gif(
func,
data_list,
save_path="./",
file_name="animated_plot.gif",
index_var="t_index",
index_max=50,
index_step=1,
component_list=None,
**kwargs
):
"""Animate an existing plot command as a gif: animate
Parameters
----------
func : function
plot command
data_list : Data or [Data]
Data object or list to plot
save_path : str
path where to save the gif
file_name : str
name of the gif file
index_var : str
name of the plot parameter along which to animate
index_max : int
maximum value of the index
index_step : int
step for the index (number of frames = index_max / index_step)
component_list : list
list of component names to plot in separate figures
kwargs : dict
parameters of func
"""
with imageio.get_writer(join(save_path, file_name), mode="I") as writer:
if isinstance(data_list, list):
for i, data in enumerate(data_list):
if isinstance(data, VectorField):
if component_list is None: # default: extract all components
component_list = data.components.keys()
ncomp = len(component_list)
fig, axs = subplots(2, ncomp, tight_layout=True, figsize=(20, 10))
for j in range(0, index_max, index_step):
save_path_temp = save_path + "\\temp_" + str(j) + ".png"
kwargs["save_path"] = save_path_temp
for k, comp in enumerate(component_list):
func(
data.components[comp],
fig=fig,
subplot_index=k,
**kwargs
)
image = imageio.imread(save_path_temp)
writer.append_data(image)
else:
for j in range(0, index_max, index_step):
save_path_temp = save_path + "\\temp_" + str(j) + ".png"
kwargs["save_path"] = save_path_temp
func(data, **kwargs)
image = imageio.imread(save_path_temp)
writer.append_data(image)
else:
if isinstance(data_list, VectorField):
if component_list is None: # default: extract all components
component_list = data.components.keys()
ncomp = len(component_list)
for j in range(0, index_max, index_step):
fig, axs = subplots(1, ncomp, tight_layout=True, figsize=(20, 10))
save_path_temp = save_path + "\\temp_" + str(j) + ".png"
kwargs[index_var] = j
kwargs["save_path"] = save_path_temp
for k, comp in enumerate(component_list):
func(
data_list.components[comp],
fig=fig,
subplot_index=k,
**kwargs
)
image = imageio.imread(save_path_temp)
writer.append_data(image)
else:
for j in range(0, index_max, index_step):
save_path_temp = save_path + "\\temp_" + str(j) + ".png"
kwargs[index_var] = j
kwargs["save_path"] = save_path_temp
func(data_list, **kwargs)
image = imageio.imread(save_path_temp)
writer.append_data(image)
for file in glob(save_path + "\\temp_*"):
remove(file)