//  [python]
def plot_label_and_filter_results(dataset: str, data_sub_dir: str, holdout: str, fig_ext: str):

    # load results, targets, and predictions
    try:
        exp_path = experiment_results_path(dataset, 'label-and-filter', data_sub_dir, holdout)
        performance_junction = pd.read_pickle(os.path.join(exp_path, 'performance.pkl'))
        predictions = pd.read_pickle(os.path.join(exp_path, 'predictions.pkl'))
        exp_path = experiment_results_path(dataset, 'label-and-filter (off-target)', data_sub_dir, holdout)
        performance_off_target = pd.read_pickle(os.path.join(exp_path, 'performance.pkl'))
    except FileNotFoundError:
        return None

    # combine performance
    performance_junction['cell'] = 'A375'
    performance_off_target['cell'] = 'HEK293'
    performance = pd.concat([performance_junction, performance_off_target])

    # pull out relevant columns and check for a single configuration otherwise
    performance = performance.reset_index(['non-targeting quantile', 'min active ratio'])
    predictions = predictions.reset_index(['non-targeting quantile', 'min active ratio'])
    assert performance.index.nunique() == predictions.index.nunique() == 1

    # initialize figure
    fig, axes = plt.subplots(nrows=2, ncols=3, figsize=(15, 10))
    kwargs = dict(marker='o', markersize=7.5, alpha=0.6)

    # plot performance
    for i, metric in enumerate(METRICS):
        ax = axes[i // 2, 1 + i % 2]
        legend = (i // 2, 1 + i % 2) == (0, 2)
        sns.lineplot(performance, x='min active ratio', y=metric, hue='cell', style='non-targeting quantile',
                     ax=ax, legend=legend, **kwargs)
        ax.set_ylim([performance.loc[performance['cell'] == 'A375', metric].min() * 0.95,
                     performance.loc[performance['cell'] == 'A375', metric].max() * 1.05])
        if legend:
            ax.legend(bbox_to_anchor=(1, 1), loc='upper left')

    # plot data utilization
    x = performance.loc[performance['cell'] == 'A375', 'min active ratio'].dropna().unique()
    for i, nt_cutoff in enumerate(performance['non-targeting quantile'].unique()):
        num_genes = []
        num_guides = []
        for min_ratio in x:
            idx = (predictions['non-targeting quantile'] == nt_cutoff) & (predictions['min active ratio'] == min_ratio)
            num_genes += [predictions.loc[idx, 'gene'].nunique()]
            num_guides += [len(predictions.loc[idx])]
        line_styles = ['-', '--']
        axes[0, 0].plot(x, num_genes, color='tab:blue', linestyle=line_styles[i], **kwargs)
        axes[0, 0].set_ylabel('# of genes')
        axes[1, 0].plot(x, num_guides, color='tab:blue', linestyle=line_styles[i], **kwargs)
        axes[1, 0].set_ylabel('# of guides')

    #             for j, metric in enumerate(METRICS):
    #                 y = performance.loc[perf_idx, metric].values.tolist()
    #                 y_err = performance.loc[perf_idx, metric + ' err'].values.tolist()
    #                 x_dodge = x + 0.2 * x_diff * i / performance['non-targeting quantile'].nunique()
    #                 ax[j // 2, j % 2].errorbar(x_dodge, y, 2 * np.array(y_err), label=label, elinewidth=1, **kwargs)
    #                 ax[j // 2, j % 2].set_title(metric)

    # finalize
    axes[0, 0].set_ylim(bottom=0)
    axes[1, 0].set_ylim(bottom=0)
    plt.tight_layout()

    # save figure
    fig_path = figure_save_path(dataset, 'label-and-filter', data_sub_dir, holdout)
    save_fig(fig, fig_path, 'summary', fig_ext)