def _get_marginal_layers()

in python-package/lets_plot/bistro/_plot2d_common.py [0:0]


def _get_marginal_layers(marginal, binwidth2d, bins2d, color, color_by, show_legend):
    marginal_color = None if color_by is not None else (color or _COLOR_DEF)

    def bin_param_to_1d(param2d, side):
        if param2d is None:
            return None
        else:
            if side in ['t', 'b']:
                return param2d[0]
            else:
                return param2d[1]

    def _get_marginal_layer(geom_kind, side, size):
        if geom_kind in ['dens', 'density']:
            layer = geom_area(stat='density', position='identity', color=marginal_color, fill=marginal_color,
                              alpha=_MARGINAL_ALPHA, show_legend=show_legend)
        elif geom_kind in ['hist', 'histogram']:
            binwidth = bin_param_to_1d(binwidth2d, side)
            bins = bin_param_to_1d(bins2d, side)
            layer = geom_histogram(bins=bins, binwidth=binwidth,
                                   color=marginal_color, fill=marginal_color, alpha=_MARGINAL_ALPHA,
                                   show_legend=show_legend)
        elif geom_kind in ['box', 'boxplot']:
            layer = geom_boxplot(color=marginal_color, fill=marginal_color, alpha=_MARGINAL_ALPHA, show_legend=show_legend)
        else:
            raise Exception("Unknown geom '{0}'".format(geom_kind))

        return ggmarginal(side, size=size, layer=layer)

    result = DummySpec()
    for layer_description in filter(bool, marginal.split(",")):
        params = layer_description.strip().split(":")
        geom_kind, sides = params[0].strip(), params[1].strip()
        size = float(params[2].strip()) if len(params) > 2 else None
        for side in sides:
            result += _get_marginal_layer(geom_kind, side, size)

    return result