Plot all scalp projections of mixing- and unmixing-maps.

    .. note:: Parameter `topo` is modified by the function by calling :func:`~eegtopo.topoplot.Topoplot.set_map`.

    Parameters
    ----------
    topo : :class:`~eegtopo.topoplot.Topoplot`
        This object draws the topo plot
    mixmaps : array, shape = [w_pixels, h_pixels]
        Scalp-projected mixing matrix
    unmixmaps : array, shape = [w_pixels, h_pixels]
        Scalp-projected unmixing matrix
    global_scale : float, optional
        Set common color scale as given percentile of all map values to use as the maximum.
        `None` scales each plot individually (default).
    fig : Figure object, optional
        Figure to plot into. If set to `None`, a new figure is created.

    Returns
    -------
    fig : Figure object
        The figure into which was plotted.

def plot_sources(topo, mixmaps, unmixmaps, global_scale=None, fig=None):
    """Plot all scalp projections of mixing- and unmixing-maps.

    .. note:: Parameter `topo` is modified by the function by calling :func:`~eegtopo.topoplot.Topoplot.set_map`.

    Parameters
    ----------
    topo : :class:`~eegtopo.topoplot.Topoplot`
        This object draws the topo plot
    mixmaps : array, shape = [w_pixels, h_pixels]
        Scalp-projected mixing matrix
    unmixmaps : array, shape = [w_pixels, h_pixels]
        Scalp-projected unmixing matrix
    global_scale : float, optional
        Set common color scale as given percentile of all map values to use as the maximum.
        `None` scales each plot individually (default).
    fig : Figure object, optional
        Figure to plot into. If set to `None`, a new figure is created.

    Returns
    -------
    fig : Figure object
        The figure into which was plotted.
    """
    urange, mrange = None, None

    m = len(mixmaps)

    if global_scale:
        tmp = np.asarray(unmixmaps)
        tmp = tmp[np.logical_not(np.isnan(tmp))]
        umax = np.percentile(np.abs(tmp), global_scale)
        umin = -umax
        urange = [umin, umax]

        tmp = np.asarray(mixmaps)
        tmp = tmp[np.logical_not(np.isnan(tmp))]
        mmax = np.percentile(np.abs(tmp), global_scale)
        mmin = -mmax
        mrange = [mmin, mmax]

    y = np.floor(np.sqrt(m * 3 / 4))
    x = np.ceil(m / y)

    if fig is None:
        fig = new_figure()

    axes = []
    for i in range(m):
        axes.append(fig.add_subplot(2 * y, x, i + 1))
        plot_topo(axes[-1], topo, unmixmaps[i], crange=urange)
        axes[-1].set_title(str(i))

        axes.append(fig.add_subplot(2 * y, x, m + i + 1))
        plot_topo(axes[-1], topo, mixmaps[i], crange=mrange)
        axes[-1].set_title(str(i))

    for a in axes:
        a.set_yticks([])
        a.set_xticks([])
        a.set_frame_on(False)

    axes[0].set_ylabel('Unmixing weights')
    axes[1].set_ylabel('Scalp projections')

    return fig