Coverage for tbkit/save.py: 100%
44 statements
« prev ^ index » next coverage.py v7.16.2, created at 2026-10-15 06:13 +0000
« prev ^ index » next coverage.py v7.16.2, created at 2026-10-15 06:13 +0000
1from __future__ import annotations
3import os
4from matplotlib.figure import Figure
5from matplotlib.animation import FuncAnimation
6import tbkit.error_handling as error_handling
9#################################
10# CLASS SAVE
11#################################
14class Save():
15 '''
16 Create folder and save figures / animations obtained via
17 **plot** or **propagation**.
19 :param dir_name: String. Name of the sub-directory the figures are stored in.
20 :param dir_main: String. Default value None. Path of the main directory.
21 If None, figures are stored under ``'figs/'``.
22 :param params: Dictionary. Default value None. Parameters appended to file names.
23 :param file_format: Default value 'png'. Figure format.
24 '''
25 def __init__(
26 self,
27 dir_name: str,
28 dir_main: str | None = None,
29 params: dict | None = None,
30 file_format: str = 'png',
31 ) -> None:
32 error_handling.string(dir_name, 'dir_name')
33 error_handling.string(dir_main, 'dir_main')
34 error_handling.file_format(file_format)
35 self.params = {} if params is None else params
36 self.file_format = file_format
37 if dir_main is None:
38 self.dir_main = 'figs'
39 else:
40 self.dir_main = dir_main
41 self.dir_name = os.path.join(self.dir_main, dir_name)
42 self.create_dir()
44 def create_dir(self) -> None:
45 '''
46 Create the directory the figures are stored in, if it does not exist.
47 '''
48 if not os.path.exists(self.dir_main):
49 os.makedirs(self.dir_main)
50 if not os.path.exists(self.dir_name):
51 os.makedirs(self.dir_name)
53 def file_name(self) -> str:
54 '''
55 Create the file name.
57 :returns:
58 * **file_name** -- File name.
59 '''
60 file_name = ''
61 for key, val in self.params.items():
62 file_name += '_' + key + str(complex(val+0)).replace('.', ',')
63 return file_name
65 def fig(self, fig: Figure, name: str) -> None:
66 '''
67 Save the figure in the directory *dir_name*.
69 :param fig: Matplotlib fig.
70 :param name: String. First part of the file name.
71 '''
72 error_handling.fig(fig)
73 error_handling.string(name, 'name')
74 name_file = os.path.join(self.dir_name,
75 name + self.file_name() + '.' + self.file_format)
76 fig.savefig(name_file, format=self.file_format)
78 def fig_lat(self, fig: Figure, name: str) -> None:
79 '''
80 Save the figure in the directory *dir_name*.
82 :param fig: Matplotlib fig.
83 :param name: String. First part of the file name.
84 '''
85 error_handling.fig(fig)
86 error_handling.string(name, 'name')
87 name_file = os.path.join(self.dir_name, name + '.' + self.file_format)
88 fig.savefig(name_file, format=self.file_format)
90 def ani(self, ani: FuncAnimation, name: str, fps: int = 10) -> None:
91 '''
92 Save the animation, as MP4, in the directory *dir_name*.
94 :param ani: Matplotlib FuncAnimation.
95 :param name: String. First part of the file name.
96 :param fps: Positive integer. Default value 10. Frames per second.
97 '''
98 error_handling.ani(ani)
99 error_handling.string(name, 'name')
100 error_handling.positive_int(fps, 'fps')
101 name_file = os.path.join(self.dir_name, name + '.mp4')
102 ani.save(name_file, fps=fps, extra_args=['-vcodec', 'libx264'])
105# Backward-compatible lowercase alias (pre-0.2 API).
106save = Save