def plot_heatmap(
        self,
        axs: tuple[plt.Axes, plt.Axes] | None = None,
        annotation_format: str = '0.1%',
        **plot_kwargs: Any,
    ) -> tuple[plt.Axes, plt.Axes]:
        """Plot a heatmap of the readout errors. If qubits are not cirq.GridQubits, throws an error.

        Args:
            axs: a tuple of the plt.Axes to plot on. If not given, a new figure is created,
                plotted on, and shown.
            annotation_format: The format string for the numbers in the heatmap.
            **plot_kwargs: Arguments to be passed to 'cirq.Heatmap.plot()'.
        Returns:
            The two plt.Axes containing the plot.

        Raises:
            ValueError: axs does not contain two plt.Axes
            TypeError: qubits are not cirq.GridQubits
        """

        if axs is None:
            _, axs_v = plt.subplots(1, 2, dpi=200, facecolor='white', figsize=(12, 4))
            axs_v = cast(np.ndarray, axs_v)
            axs = cast(tuple[plt.Axes, plt.Axes], (axs_v[0], axs_v[1]))
        else:
            if (
                not isinstance(axs, (tuple, list, np.ndarray))
                or len(axs) != 2
                or type(axs[0]) != plt.Axes
                or type(axs[1]) != plt.Axes
            ):  # pragma: no cover
                raise ValueError('axs should be a length-2 tuple of plt.Axes')  # pragma: no cover
        for ax, title, data in zip(
            axs,
            ['$|0\\rangle$ errors', '$|1\\rangle$ errors'],
            [self.zero_state_errors, self.one_state_errors],
        ):
            data_with_grid_qubit_keys = {}
            for qubit in data:
                if type(qubit) != grid_qubit.GridQubit:
                    raise TypeError(f'{qubit} must be of type cirq.GridQubit')  # pragma: no cover
                data_with_grid_qubit_keys[qubit] = data[qubit]  # just for typecheck
            _, _ = cirq_heatmap.Heatmap(data_with_grid_qubit_keys).plot(
                ax, annotation_format=annotation_format, title=title, **plot_kwargs
            )
        return axs[0], axs[1]
Plot a heatmap of the readout errors. If qubits are not cirq.GridQubits, throws an error.

        Args:
            axs: a tuple of the plt.Axes to plot on. If not given, a new figure is created,
                plotted on, and shown.
            annotation_format: The format string for the numbers in the heatmap.
            **plot_kwargs: Arguments to be passed to 'cirq.Heatmap.plot()'.
        Returns:
            The two plt.Axes containing the plot.

        Raises:
            ValueError: axs does not contain two plt.Axes
            TypeError: qubits are not cirq.GridQubits
        
cirq-core/cirq/experiments/single_qubit_readout_calibration.py