Coverage for src/mafw_tools/plotting_tools.py: 100%
25 statements
« prev ^ index » next coverage.py v7.11.0, created at 2025-11-04 11:00 +0100
« prev ^ index » next coverage.py v7.11.0, created at 2025-11-04 11:00 +0100
1# Copyright 2025 European Union
2# Author: Bulgheroni Antonio (antonio.bulgheroni@ec.europa.eu)
3# SPDX-License-Identifier: EUPL-1.2
4"""
5Plotting tools module
7This module provides utility functions for creating plots and visualizations
8using matplotlib. It includes functionality for plotting images with various
9customization options such as colorbars, axis control, and title management.
11.. versionadded:: 1.0.0
12"""
14import matplotlib
15from matplotlib import pyplot as plt
16from mpl_toolkits.axes_grid1 import make_axes_locatable
18def plot_image(
19 img,
20 ax: plt.Axes,
21 title: str = '',
22 preserve_axis_limits: bool = False,
23 axis_off: bool = False,
24 attach_colorbar: bool = False,
25 cbar_ticks: list = None,
26 **kwargs,
27) -> matplotlib.image.AxesImage:
28 """
29 Plot an image on a matplotlib axis with various customization options.
31 This function provides a flexible way to display images with options for
32 controlling axis appearance, adding colorbars, and preserving axis limits.
34 :param img: The image data to be plotted
35 :type img: numpy.ndarray
36 :param ax: The matplotlib axis object where the image will be displayed
37 :type ax: matplotlib.pyplot.Axes
38 :param title: Title to be displayed on the axis. Defaults to empty string
39 :type title: str
40 :param preserve_axis_limits: If True, preserves the current axis limits. Defaults to False
41 :type preserve_axis_limits: bool
42 :param axis_off: If True, turns off the axis ticks and labels. Defaults to False
43 :type axis_off: bool
44 :param attach_colorbar: If True, attaches a colorbar to the plot. Defaults to False
45 :type attach_colorbar: bool
46 :param cbar_ticks: List of tick locations for the colorbar. Defaults to None
47 :type cbar_ticks: list
48 :param kwargs: Additional keyword arguments passed to matplotlib's imshow function
49 :return: The matplotlib image object created
50 :rtype: matplotlib.image.AxesImage
51 :example:
53 >>> import matplotlib.pyplot as plt
54 >>> import numpy as np
55 >>> fig, ax = plt.subplots()
56 >>> data = np.random.rand(10, 10)
57 >>> plot_image(data, ax, title="Sample Image", attach_colorbar=True)
58 >>> plt.show()
59 """
60 if preserve_axis_limits:
61 x_lim, y_lim = ax.get_xlim(), ax.get_ylim()
62 ax.cla()
63 else:
64 x_lim = y_lim = (0, 1)
65 ax.set_xticks([])
66 ax.set_yticks([])
67 if axis_off:
68 ax.axis('off')
69 ax.set_title(title)
70 map = ax.imshow(img, **kwargs)
71 if preserve_axis_limits and x_lim != (0, 1) and y_lim != (0, 1):
72 ax.set_xlim(*x_lim)
73 ax.set_ylim(*y_lim)
75 if attach_colorbar:
76 # Use the make_axes_locatable to create a new axes for the colorbar
77 divider = make_axes_locatable(ax)
78 cax = divider.append_axes('right', size='5%', pad=0.05)
80 # Add the colorbar to the new axes
81 cbar = plt.colorbar(map, cax=cax)
82 if cbar_ticks is not None:
83 cbar.set_ticks(cbar_ticks)
84 cbar.set_ticklabels([f'{i}' for i in cbar_ticks])
86 return map