Source code for arviz_plots.backend.matplotlib.legend

"""Matplotlib manual legend generation."""
from matplotlib.lines import Line2D

from .core import expand_aesthetic_aliases


@expand_aesthetic_aliases
def dealiase_line_kwargs(**kwargs):
    """Convert arviz common interface properties to matplotlib ones."""
    prop_map = {"width": "linewidth"}
    return {prop_map.get(key, key): value for key, value in kwargs.items()}


[docs] def legend( plot_collection, kwarg_list, label_list, title=None, visual_type="line", visual_kwargs=None, legend_dim=None, # pylint: disable=unused-argument update_visuals=True, # pylint: disable=unused-argument **kwargs, ): """Generate a legend on a figure given lists of labels and property kwargs.""" if visual_kwargs is None: visual_kwargs = {} if "legend" in plot_collection.viz.children: legend_number = len(plot_collection.viz["legend"].data_vars) + 1 else: legend_number = 1 default_y = {1: "right upper", 2: "right lower", 3: "center right"}[legend_number] kwargs.setdefault("loc", f"outside {default_y}") if visual_type == "line": visual_fun = Line2D kwarg_list = [dealiase_line_kwargs(**kws) for kws in kwarg_list] else: raise NotImplementedError("Only line type legends supported for now") handles = [visual_fun([], [], **{**visual_kwargs, **kws}) for kws in kwarg_list] figure = plot_collection.get_viz("figure") return figure.legend(handles, label_list, title=title, **kwargs)