Source code for autoarray.plot.wrap.base.figure
from enum import Enum
import matplotlib.pyplot as plt
from typing import Union, Tuple
from autoarray.plot.wrap.base.abstract import AbstractMatWrap
class Aspect(Enum):
square = 1
auto = 2
equal = 3
[docs]class Figure(AbstractMatWrap):
"""
Sets up the Matplotlib figure before plotting (this is used when plotting individual figures and subplots).
This object wraps the following Matplotlib methods:
- plt.figure: https://matplotlib.org/3.3.2/api/_as_gen/matplotlib.pyplot.figure.html
- plt.close: https://matplotlib.org/3.3.2/api/_as_gen/matplotlib.pyplot.close.html
It also controls the aspect ratio of the figure plotted.
"""
@property
def config_dict(self):
"""
Creates a config dict of valid inputs of the method `plt.figure` from the object's config_dict.
"""
config_dict = super().config_dict
if config_dict["figsize"] == "auto":
config_dict["figsize"] = None
elif isinstance(config_dict["figsize"], str):
config_dict["figsize"] = tuple(
map(int, config_dict["figsize"][1:-1].split(","))
)
return config_dict
def aspect_for_subplot_from(self, extent):
ratio = float((extent[1] - extent[0]) / (extent[3] - extent[2]))
aspect = Aspect[self.config_dict["aspect"]]
if aspect == Aspect.square:
return ratio
elif aspect == Aspect.auto:
return 1.0 / ratio
elif aspect == Aspect.equal:
return 1.0
raise ValueError(
f"""
The `aspect` variable used to set up the figure is {aspect}.
This is not a valid value, which must be one of square / auto / equal.
"""
)
[docs] def aspect_from(self, shape_native: Union[Tuple[int, int]]) -> Union[float, str]:
"""
Returns the aspect ratio of the figure from the 2D shape of a data structure.
This is used to ensure that rectangular arrays are plotted as square figures on sub-plots.
Parameters
----------
shape_native
The two dimensional shape of an `Array2D` that is to be plotted.
"""
if isinstance(self.config_dict["aspect"], str):
if self.config_dict["aspect"] in "square":
return float(shape_native[1]) / float(shape_native[0])
return self.config_dict["aspect"]
[docs] def open(self):
"""
Wraps the Matplotlib method 'plt.figure' for opening a figure.
"""
if not plt.fignum_exists(num=1):
config_dict = self.config_dict
config_dict.pop("aspect")
fig = plt.figure(**config_dict)
return fig, plt.gca()
return None, None
[docs] def close(self):
"""
Wraps the Matplotlib method 'plt.close' for closing a figure.
"""
if plt.fignum_exists(num=1):
plt.close()