Source code for qiskit_experiments.framework.containers.figure_data

# This code is part of Qiskit.
#
# (C) Copyright IBM 2023.
#
# This code is licensed under the Apache License, Version 2.0. You may
# obtain a copy of this license in the LICENSE.txt file in the root directory
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
#
# Any modifications or derivative works of this code must retain this
# copyright notice, and modified files need to carry a notice indicating
# that they have been altered from the originals.

"""Container of experiment data components."""

from __future__ import annotations

import copy
import io
from typing import Dict, Optional, Union, Any

from matplotlib.figure import Figure as MatplotlibFigure


[docs] class FigureData: """A plot data container. .. note:: Raw figure data can be accessed through the :attr:`.FigureData.figure` attribute. """ def __init__( self, figure, name: str | None = None, metadata: dict[str, Any] | None = None, ): """Creates a new figure data object. Args: figure: The raw figure itself. Can be SVG or matplotlib.Figure. name: The name of the figure. metadata: Any metadata to be stored with the figure. """ self.figure = figure self._name = name self.metadata = metadata or {} def __eq__(self, value): """Test equality between two instances of FigureData.""" return vars(self) == vars(value) # name is read only @property def name(self) -> str: """The name of the figure""" return self._name @property def metadata(self) -> dict: """The metadata dictionary stored with the figure""" return self._metadata @metadata.setter def metadata(self, new_metadata: dict): """Set the metadata to new value; must be a dictionary""" if not isinstance(new_metadata, dict): raise ValueError("figure metadata must be a dictionary") self._metadata = new_metadata
[docs] def copy(self, new_name: Optional[str] = None): """Creates a copy of the figure data""" name = new_name or self.name return FigureData(figure=self.figure, name=name, metadata=copy.deepcopy(self.metadata))
def __json_encode__(self) -> Dict[str, Any]: """Return the json representation of the figure data""" return {"figure": self.figure, "name": self.name, "metadata": self.metadata} @classmethod def __json_decode__(cls, args: Dict[str, Any]) -> "FigureData": """Initialize a figure data from the json representation""" return cls(**args) def _repr_png_(self): if isinstance(self.figure, MatplotlibFigure): b = io.BytesIO() self.figure.savefig(b, format="png", bbox_inches="tight") png = b.getvalue() return png else: return None def _repr_svg_(self): if isinstance(self.figure, str): return self.figure if isinstance(self.figure, bytes): return self.figure.decode("utf-8") return None
FigureType = Union[str, bytes, MatplotlibFigure, FigureData]