def side_hist(ax, data, cdata, bins=50, cols=None, binsx=True,
                  discrete=False, cbins=10):
        """
        Add a histogram of data to ax made from inds of unique values of cdata

        """
        if discrete:
            if type(cbins) == int:
                hist, cbins = np.histogram(cdata, bins=cbins)
            dinds = np.digitize(cdata, cbins)
            uinds = range(len(cbins))
        else:
            uinds = np.unique(cdata)
            dinds = np.digitize(cdata, uinds)

        cols = palettable.get_map('Spectral', 'Diverging',
                                  len(uinds)).mpl_colors

        for j, i in enumerate(uinds):
            hist, hbins = np.histogram(data[dinds == i], bins=bins)
            if binsx:
                x = hbins[1:]
                y = hist
            else:
                y = hbins[1:]
                x = hist
            ax.plot(x, y, linestyle='steps-pre', color=cols[j], zorder=100-j)
        return ax
import os
import ResolvedStellarPops as rsp
import matplotlib.pyplot as plt
import palettable

galfile = '/Users/phil/research/BRratio/models/TRILEGAL_RUNS/big_galaxy/output_big_galaxy_wfpc2_z0.001.dat'
sgal = rsp.Galaxies.simgalaxy(galfile, filter1='F555W', filter2='F814W')

bmap = palettable.get_map('Paired', map_type='Qualitative', number=7)

ages = np.array([50e6, 100e6, 500e6, 1e9, 2e9, 5e9, 10e9])
lages = np.log10(ages)

lage = sgal.data.get_col('logAge')

inds = np.digitize(lage, lages)

xlim = (-1, 4.5)
ylim = (.1, -7.5)
plot_args = {'mew': 0}
fig = plt.figure(figsize=(8, 8))
ax = plt.axes()
for j, i in enumerate(np.unique(inds)):
    if i == len(ages):
        continue
    plot_args['color'] = bmap.mpl_colors[j]
    slice_inds, = np.nonzero(inds == i)
    sgal.plot_cmd(sgal.Color, sgal.Mag2, slice_inds=slice_inds, fig=fig, ax=ax,
                  scatter_off=True, xlim=xlim, ylim=ylim, plot_args=plot_args)
    plt.savefig('cmd_%i.png' % (j+1))
def scatter_hist(starpop, xdata, ydata, coldata='stage', xbins=50, ybins=50,
                 slice_inds=None, xlim=None, ylim=None, clim=None,
                 discrete=False, scatter_kw={}):
    """ """
    import palettable
    import matplotlib.gridspec as gridspec

    def side_hist(ax, data, cdata, bins=50, cols=None, binsx=True,
                  discrete=False, cbins=10):
        """
        Add a histogram of data to ax made from inds of unique values of cdata

        """
        if discrete:
            if type(cbins) == int:
                hist, cbins = np.histogram(cdata, bins=cbins)
            dinds = np.digitize(cdata, cbins)
            uinds = range(len(cbins))
        else:
            uinds = np.unique(cdata)
            dinds = np.digitize(cdata, uinds)

        cols = palettable.get_map('Spectral', 'Diverging',
                                  len(uinds)).mpl_colors

        for j, i in enumerate(uinds):
            hist, hbins = np.histogram(data[dinds == i], bins=bins)
            if binsx:
                x = hbins[1:]
                y = hist
            else:
                y = hbins[1:]
                x = hist
            ax.plot(x, y, linestyle='steps-pre', color=cols[j], zorder=100-j)
        return ax

    fig = plt.figure(figsize=(11, 7))
    gs = gridspec.GridSpec(3, 3)
    axt = plt.subplot(gs[0,:-1])
    axr = plt.subplot(gs[1:,-1])
    ax = plt.subplot(gs[1:,:-1])


    if type(xdata) is str:
        ax.set_xlabel(xdata.replace('_', '\_'))
        xdata = starpop.data[xdata]

    if type(ydata) is str:
        ax.set_ylabel(ydata.replace('_', '\_'))
        ydata = starpop.data[ydata]

    collabel = None
    if type(coldata) is str:
        collabel = coldata.replace('_', '\_')
        coldata = starpop.data[coldata]

    if slice_inds is not None:
        xdata = xdata[slice_inds]
        ydata = ydata[slice_inds]
        coldata = coldata[slice_inds]

    scatter_kw = dict({'edgecolors': 'none', 'cmap': plt.cm.Spectral}.items() \
                       + scatter_kw.items())
    l = ax.scatter(xdata, ydata, c=coldata,  **scatter_kw)

    axt = side_hist(axt, xdata, coldata, bins=xbins, discrete=discrete)
    axr = side_hist(axr, ydata, coldata, bins=ybins, binsx=False,
                    discrete=discrete)

    axt.set_yscale('log')
    axr.set_xscale('log')
    if xlim is not None:
        axt.set_xlim(xlim)
    ax.set_xlim(axt.get_xlim())

    if ylim is not None:
        axr.set_ylim(ylim)
    ax.set_ylim(axr.get_ylim())

    if clim is not None:
        l.set_clim(clim)

    axt.set_ylabel('$\#$')
    axr.set_xlabel('$\#$')

    axt.tick_params(labelbottom=False, labeltop=True, right=False)
    axr.tick_params(labelright=True, labelleft=False, top=False)
    gs.update(left=0.1, right=0.9, wspace=0, hspace=0)

    if collabel == 'stage':
        axtr = plt.subplot(gs[0, -1])
        cols = palettable.get_map('Spectral', 'Diverging',
                                  9).mpl_colors
        [axtr.plot(0, 0, label=get_stage_label()[i], color=cols[i])
         for i in range(len(cols))]
        axtr.tick_params(labelbottom=False, labelleft=False)
        axtr.grid()  # should turn it off!!
        plt.legend(mode='expand', ncol=2, frameon=False)
        axs = [axt, ax, axr, axtr]
    else:
        axs = [axt, ax, axr]


    return axs