Source code for fluiddyn.output.figs

"""
Utilities for creating figures (:mod:`fluiddyn.output.figs`)
=============================================================

.. currentmodule:: fluiddyn.output.figs

Provides

.. autoclass:: Figure
   :members:

.. autoclass:: Figures
   :members:

"""

import os
import sys

import matplotlib
import matplotlib.pyplot as plt

from ..util import is_run_from_ipython
from .rcparams import set_rcparams


[docs] class Figures: """Represent a set of figures. Utilities to plot and save figures with matplotlib. Parameters ---------- path_save : str Related to the path where to save. hastosave : bool If True, the function `Figure.saveifhasto` save the figure. for_beamer : bool If True, use beamer layout. for_article : bool If True, use article layout. fontsize : {18, int} Font size of the text in the figures. fontsize_pad : {9, int} Font size of the pad in the figures. """ def __init__( self, path_save=None, hastosave=False, for_beamer=False, for_article=False, fontsize=18, fontsize_pad=9, ): self.hastosave = hastosave if path_save is None: self.path_save = os.getcwd() elif os.path.isabs(path_save): self.path_save = path_save else: self.path_save = os.path.join(os.getcwd(), path_save) set_rcparams(fontsize, for_article, for_beamer, fontsize_pad=9)
[docs] def new_figure( self, name_file=None, num=None, fig_width_mm=200, fig_height_mm=150, size_axe=None, ): """Create a new Figure object and return it. Parameters ---------- num : int, optional Number. fig_width_mm : {200, number}, optional Width (in mm) fig_height_mm : {150, number}, optional Height (in mm) size_axe : list, optional Size of the axe. name_file : str, optional Name of the file. """ one_inch_in_mm = 25.4 fig_width_inches = float(fig_width_mm) / one_inch_in_mm fig_height_inches = float(fig_height_mm) / one_inch_in_mm figsize = [fig_width_inches, fig_height_inches] dpi_latex = 72.27 fig = Figure( num=num, figsize=figsize, dpi=dpi_latex, size_axe=size_axe, name_file=name_file, figures=self, ) return fig
def show(block=None): """Show slightly more cleaver than old version of plt.show.""" if block is None: if is_run_from_ipython(): block = False plt.ion() else: block = True plt.ioff() if sys.platform.startswith("win") and not block: print("Warning: bug with anaconda and non-blocking show (?)") try: plt.show(block=block) except TypeError: plt.show()
[docs] class Figure(matplotlib.figure.Figure): """One figure. Improvement (?) of ``matplotlib.figure.Figure`` Parameters ---------- size_axe : list, optional Size of the axe. name_file : str, optional Name of the file. figures : :class:`fluiddyn.output.figs.Figures` Set of figures. kwargs : keyword arguments Given when create the figure. """ def __init__( self, size_axe=None, name_file=None, figures=None, **kwargs # *args, ): # Ugly workaround to be able to use the function plt.figure fig = plt.figure(**kwargs) for k, v in fig.__dict__.items(): self.__dict__[k] = v if name_file is not None: self.name_file = name_file if figures is None: self.hastosave = True self.path_save = os.getcwd() else: self.hastosave = figures.hastosave self.path_save = figures.path_save self.figures = figures title = "Fig " + str(self.number) if name_file is not None: fig.name_file = name_file title += " " + name_file self.clf() self.canvas.manager.set_window_title(title) if size_axe is not None: self.add_axes(size_axe)
[docs] def saveifhasto(self, name_file=None, hastosave=None, verbose=True): """Save the figure if `hastosave` is True. Parameters ---------- name_file : str, optional Name of the file (the extension has to indicate the format). hastosave : bool, optional If True, save the figure. verbose : {True, bool}, optional Print nothing if False. """ if hastosave is None: hastosave = self.hastosave if hastosave: if name_file is None: try: name_file = self.name_file except AttributeError: raise ValueError("No name given...") if not os.path.exists(self.path_save): os.mkdir(self.path_save) path = os.path.join(self.path_save, name_file) if verbose: print("Save figure in file\n" + path) super().savefig(path)