Skip to content
Snippets Groups Projects
visualize.py 5.96 KiB
Newer Older
DIANE's avatar
DIANE committed

DIANE's avatar
DIANE committed
import streamlit as st
DIANE's avatar
DIANE committed
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
DIANE's avatar
DIANE committed
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ predictions histogram ~~~~~~~~~~~~~~~~~~~~~~~~~~
DIANE's avatar
DIANE committed


DIANE's avatar
DIANE committed
@st.cache_data
def pred_hist(pred):
    # Creating histogram
DIANE's avatar
DIANE committed
    hist, axs = plt.subplots(1, 1, figsize=(15, 3),
                             tight_layout=True)
DIANE's avatar
DIANE committed

DIANE's avatar
DIANE committed
    # Add x, y gridlines
    axs.grid(color='grey', linestyle='-.', linewidth=0.5, alpha=0.6)
    # Remove axes splines
    for s in ['top', 'bottom', 'left', 'right']:
DIANE's avatar
DIANE committed
        axs.spines[s].set_visible(False)
    # Remove x, y ticks
DIANE's avatar
DIANE committed
    axs.xaxis.set_ticks_position('none')
    axs.yaxis.set_ticks_position('none')
    # Add padding between axes and labels
    axs.xaxis.set_tick_params(pad=5)
    axs.yaxis.set_tick_params(pad=10)
DIANE's avatar
DIANE committed
    # Creating histogram
DIANE's avatar
DIANE committed
    N, bins, patches = axs.hist(pred, bins=12)
DIANE's avatar
DIANE committed
    return hist


# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ predictions histogram ~~~~~~~~~~~~~~~~~~~~~~~~~~
@st.cache_data
DIANE's avatar
DIANE committed
def plot_spectra(specdf=None, color=None, cmap=None, xunits=None, yunits=None, mean=False):
DIANE's avatar
DIANE committed
    # pass
DIANE's avatar
DIANE committed
    import matplotlib.pyplot as plt
    import numpy as np
DIANE's avatar
DIANE committed

    fig, ax = plt.subplots(figsize=(30, 7))
DIANE's avatar
DIANE committed

    if color is None or cmap is None:
DIANE's avatar
DIANE committed
        specdf.T.plot(legend=False, ax=ax, color="blue")

DIANE's avatar
DIANE committed
    else:
        cats = color.unique()
        for key, value in cmap.items():
DIANE's avatar
DIANE committed
            ax.plot([], [], color=value, label=str(key))
DIANE's avatar
DIANE committed
            plt.legend()
DIANE's avatar
DIANE committed

DIANE's avatar
DIANE committed
        for key, value in cmap.items():
            idx = color.index[color == key].tolist()
DIANE's avatar
DIANE committed
            specdf.loc[idx].T.plot(legend=False, ax=ax, color=value)
DIANE's avatar
DIANE committed
    if mean:
DIANE's avatar
DIANE committed
        specdf.mean().T.plot(legend=False, ax=ax, color="black", linewidth=5)
DIANE's avatar
DIANE committed

    ax.set_xlabel(xunits, fontsize=30)
    ax.set_ylabel(yunits, fontsize=30)
DIANE's avatar
DIANE committed
    plt.margins(x=0)
DIANE's avatar
DIANE committed
    plt.tight_layout()
DIANE's avatar
DIANE committed
    # plt.legend()
    return fig


@st.cache_data
def barhplot(metadf, cmap):
    counts = metadf.groupby(metadf.columns[0]).size()
    counts = counts.loc[cmap.keys()]
DIANE's avatar
DIANE committed
    fig, ax = plt.subplots(figsize=(10, 5))
DIANE's avatar
DIANE committed
    ax.barh(counts.index, counts.values, color=cmap.values())
    plt.gca().invert_yaxis()
    plt.xlabel('Count')
    plt.ylabel(str(metadf.columns[0]).capitalize())
DIANE's avatar
DIANE committed
    return fig


# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Cal/val hist ~~~~~~~~~~~~~~~~~~~~~~~~~~
@st.cache_data
DIANE's avatar
DIANE committed
def hist(y, y_train, y_test, target_name='y'):
    fig, ax = plt.subplots(figsize=(5, 2))
    sns.histplot(y, color="#004e9e", kde=True, label=str(
        target_name) + " (Total)", ax=ax, fill=True)
    sns.histplot(y_train, color="#2C6B6F", kde=True,
                 label=str(target_name)+" (Cal)", ax=ax, fill=True)
    sns.histplot(y_test, color="#d0f7be", kde=True, label=str(
        target_name)+" (Val)", ax=ax, fill=True)
DIANE's avatar
DIANE committed
    ax.set_xlabel(str(target_name))
    plt.legend()
    plt.tight_layout()
    return fig


@st.cache_data
DIANE's avatar
DIANE committed
def reg_plot(meas, pred, train_idx, test_idx, trainplot=True):
DIANE's avatar
DIANE committed
    a0 = np.ones(2)
    a1 = np.ones(2)
DIANE's avatar
DIANE committed

    n = 2 if trainplot else 1
    for i in range(n):
        meas[i] = np.array(meas[i]).reshape(-1, 1)
DIANE's avatar
DIANE committed
        pred[i] = np.array(pred[i]).reshape(-1, 1)

DIANE's avatar
DIANE committed
        from sklearn.linear_model import LinearRegression
DIANE's avatar
DIANE committed
        M = LinearRegression()
        M.fit(meas[i], pred[i])
DIANE's avatar
DIANE committed
        a1[i] = np.round(M.coef_[0][0], 2)
        a0[i] = np.round(M.intercept_[0], 2)

    if trainplot:
        ec = np.subtract(np.array(meas[0]).reshape(-1),
DIANE's avatar
DIANE committed
                         np.array(pred[0]).reshape(-1))
DIANE's avatar
DIANE committed
    et = np.subtract(np.array(meas[1]).reshape(-1),
                     np.array(pred[1]).reshape(-1))

    fig, ax = plt.subplots(figsize=(12, 4))
    if trainplot:
        sns.regplot(x=meas[0], y=pred[0], color="#2C6B6F", label=f'Cal (Predicted = {
                    a0[0]} + {a1[0]} x Measured)', scatter_kws={'edgecolor': 'black'})
    sns.regplot(x=meas[1], y=pred[1], color='#d0f7be', label=f'Val (Predicted = {
                a0[1]} + {a1[1]} x Measured)', scatter_kws={'edgecolor': 'black'})
    plt.plot([np.min(meas[0]) - 0.05, np.max([meas[0]]) + 0.05],
             [np.min(meas[0]) - 0.05, np.max([meas[0]]) + 0.05], color='black')

    if trainplot:
DIANE's avatar
DIANE committed
        for i, txt in enumerate(train_idx):
            # plt.annotate(txt ,(np.array(meas[0]).reshape(-1)[i],ec[i]))
            if np.abs(ec[i]) > np.mean(ec) + 3*np.std(ec):
DIANE's avatar
DIANE committed
                plt.annotate(
DIANE's avatar
DIANE committed
                    txt, (np.array(meas[0]).reshape(-1)[i], np.array(pred[0]).reshape(-1)[i]))
    for i, txt in enumerate(test_idx):
        if np.abs(et[i]) > np.mean(et) + 3*np.std(et):
            plt.annotate(
                txt, (np.array(meas[1]).reshape(-1)[i], np.array(pred[1]).reshape(-1)[i]))
DIANE's avatar
DIANE committed

    ax.set_ylabel('Predicted values')
    ax.set_xlabel('Measured values')
    plt.legend()
    plt.margins(0)
    # fig.savefig('./report/figures/measured_vs_predicted.png')
    return fig

# Resid plot


DIANE's avatar
DIANE committed
@st.cache_data
DIANE's avatar
DIANE committed
def resid_plot(meas, pred, train_idx, test_idx, trainplot=True):

    et = np.subtract(meas[1], pred[1])
    ett = np.array(et).reshape(-1, 1)

DIANE's avatar
DIANE committed
    fig, ax = plt.subplots(figsize=(12, 4))
DIANE's avatar
DIANE committed
    plt.axhline(y=0, c='black', linestyle=':')
DIANE's avatar
DIANE committed
    if trainplot:
DIANE's avatar
DIANE committed
        ec = np.subtract(meas[0], pred[0])
        ecc = np.array(ec).reshape(-1, 1)
        sns.scatterplot(x=pred[0], y=ec, color="#2C6B6F",
DIANE's avatar
DIANE committed
                        label=f'Cal', edgecolor="black")
DIANE's avatar
DIANE committed

DIANE's avatar
DIANE committed
        for i, txt in enumerate(train_idx):
DIANE's avatar
DIANE committed
            if np.abs(ecc[i]) > np.mean(ecc) + 3*np.std(ecc):
                plt.annotate(txt, (np.array(pred[0]).reshape(-1)[i], ecc[i]))
DIANE's avatar
DIANE committed

DIANE's avatar
DIANE committed


    sns.scatterplot(x=pred[1], y=et, color="#d0f7be",
                    label=f'Val', edgecolor="black")
DIANE's avatar
DIANE committed
    for i, txt in enumerate(test_idx):
DIANE's avatar
DIANE committed
        if np.abs(ett[i]) > np.mean(ett) + 3 * np.std(ett):
            plt.annotate(txt, (np.array(pred[1]).reshape(-1)[i], ett[i]))

    if trainplot:
        lim = np.max(abs(np.concatenate([ec, et], axis=0)))*1.1
    else:
        lim = np.max(abs(et))*1.1
    plt.ylim(- lim, lim)

DIANE's avatar
DIANE committed
    ax.set_ylabel('Residuals')
    ax.set_xlabel('Predicted values')
    plt.legend()
    plt.margins(0)
    # fig.savefig('./report/figures/residuals_plot.png')
DIANE's avatar
DIANE committed
    return fig