Source code for aspire.plot

from __future__ import annotations

import copy
from typing import TYPE_CHECKING, Any

import matplotlib.pyplot as plt

if TYPE_CHECKING:
    from matplotlib.figure import Figure


[docs] def plot_comparison( *samples, parameters: list[str] | None = None, per_samples_kwargs: list[dict[str, Any]] | None = None, labels: list[str] | None = None, **kwargs, ) -> Figure: """ Plot a comparison of multiple samples. Parameters ---------- samples : Samples The samples to compare. parameters : list[str] | None The list of parameter names to plot. If None, the parameters will be inferred from the samples. per_samples_kwargs : list[dict] | None A list of dictionaries of keyword arguments to pass to each sample's :code:`plot_corner` method. If None, no additional keyword arguments will be passed. If provided, must have the same length as samples labels : list[str] | None A list of labels for the legend. If None, no legend will be shown. If provided, must have the same length as samples. kwargs : dict Additional keyword arguments to pass to each sample's :code:`plot_corner` method. """ default_kwargs = dict( density=True, bins=30, color="C0", smooth=1.0, plot_datapoints=True, plot_density=False, hist_kwargs=dict(density=True, color="C0"), ) default_kwargs.update(kwargs) if per_samples_kwargs is None: per_samples_kwargs = [{} for _ in samples] elif len(per_samples_kwargs) != len(samples): raise ValueError( "per_samples_kwargs must have the same length as samples" ) fig = None for i, sample in enumerate(samples): kwds = copy.deepcopy(default_kwargs) sample_kwargs = copy.deepcopy(per_samples_kwargs[i]) color = sample_kwargs.pop("color", f"C{i}") kwds["color"] = color kwds["hist_kwargs"]["color"] = color kwds.update(sample_kwargs) previous_fig = fig fig = sample.plot_corner(fig=fig, parameters=parameters, **kwds) # Corner seems to return a new figure so we make sure to close # it if previous_fig is not None and fig is not previous_fig: plt.close(previous_fig) if labels: fig.legend( labels=labels, loc="upper right", bbox_to_anchor=(0.9, 0.9), bbox_transform=fig.transFigure, ) return fig
[docs] def plot_history_comparison(*histories): # Assert that all histories are of the same type if not all(isinstance(h, histories[0].__class__) for h in histories): raise ValueError("All histories must be of the same type") fig = histories[0].plot() for history in histories[1:]: fig = history.plot(fig=fig) return fig