def produce_two_axis_plot(corpus,
                          x_score_df,
                          y_score_df,
                          x_label,
                          y_label,
                          statistic_column='cohens_d',
                          p_value_column='cohens_d_p',
                          statistic_name='d',
                          use_non_text_features=False,
                          pick_color=pick_color,
                          axis_scaler=scale_neg_1_to_1_with_zero_mean,
                          distance_measure=EuclideanDistance,
                          semiotic_square_labels=None,
                          x_tooltip_label=None,
                          y_tooltip_label=None,
                          **kwargs):
    '''

    :param corpus: Corpus
    :param x_score_df: pd.DataFrame, contains effect_size_column, p_value_column. outputted by CohensD
    :param y_score_df: pd.DataFrame, contains effect_size_column, p_value_column. outputted by CohensD
    :param x_label: str
    :param y_label: str
    :param statistic_column: str, column in x_score_df, y_score_df giving statistics, default cohens_d
    :param p_value_column: str, column in x_score_df, y_score_df giving effect sizes, default cohens_d_p
    :param statistic_name: str, column which corresponds to statistic name, defauld d
    :param use_non_text_features: bool, default True
    :param pick_color: func, returns color, default is pick_color
    :param axis_scaler: func, scaler default is scale_neg_1_to_1_with_zero_mean
    :param distance_measure: DistanceMeasureBase, default EuclideanDistance
        This is how parts of the square are populated
    :param semiotic_square_labels: dict, semiotic square position labels
    :param x_tooltip_label: str, if None, x_label
    :param y_tooltip_label: str, if None, y_label
    :param kwargs: dict, other arguments
    :return: str, html
    '''

    if use_non_text_features:
        terms = corpus.get_metadata()
    else:
        terms = corpus.get_terms()

    axes = pd.DataFrame({'x': x_score_df[statistic_column],
                         'y': y_score_df[statistic_column]}).loc[terms]
    merged_scores = pd.merge(x_score_df, y_score_df, left_index=True, right_index=True).loc[terms]

    x_tooltip_label = x_label if x_tooltip_label is None else x_tooltip_label
    y_tooltip_label = y_label if y_tooltip_label is None else y_tooltip_label

    def generate_term_metadata(term_struct):
        if p_value_column + '_corr_x' in term_struct:
            x_p = term_struct[p_value_column + '_corr_x']
        elif p_value_column + '_x' in term_struct:
            x_p = term_struct[p_value_column + '_x']
        else:
            x_p = None
        if p_value_column + '_corr_y' in term_struct:
            y_p = term_struct[p_value_column + '_corr_y']
        elif p_value_column + '_y' in term_struct:
            y_p = term_struct[p_value_column + '_y']
        else:
            y_p = None
        if x_p is not None:
            x_p = min(x_p, 1. - x_p)
        if y_p is not None:
            y_p = min(y_p, 1. - y_p)

        x_d = term_struct[statistic_column + '_x']
        y_d = term_struct[statistic_column + '_y']

        tooltip = '%s: %s: %0.3f' % (x_tooltip_label, statistic_name, x_d)
        if x_p is not None:
            tooltip += '; p: %0.4f' % x_p
        tooltip += '<br/>'
        tooltip += '%s: %s: %0.3f' % (y_tooltip_label, statistic_name, y_d)
        if y_p is not None:
            tooltip += '; p: %0.4f' % y_p

        return {'tooltip': tooltip, 'color': pick_color(x_p, y_p, np.abs(x_d), np.abs(y_d))}

    explanations = merged_scores.apply(generate_term_metadata, axis=1)

    semiotic_square = SemioticSquareFromAxes(corpus,
                                             axes,
                                             x_axis_name=x_label,
                                             y_axis_name=y_label,
                                             labels=semiotic_square_labels,
                                             distance_measure=distance_measure)

    get_tooltip_content = kwargs.get('get_tooltip_content',
                                     '''(function(d) {return d.term + "<br/> " + d.etc.tooltip})''')
    color_func = kwargs.get('color_func', '''(function(d) {return d.etc.color})''')

    html = produce_scattertext_explorer(corpus,
                                        category=corpus.get_categories()[0],
                                        sort_by_dist=False,
                                        x_coords=axis_scaler(axes['x']),
                                        y_coords=axis_scaler(axes['y']),
                                        original_x=axes['x'],
                                        original_y=axes['y'],
                                        show_characteristic=False,
                                        show_top_terms=False,
                                        show_category_headings=True,
                                        x_label=x_label,
                                        y_label=y_label,
                                        semiotic_square=semiotic_square,
                                        get_tooltip_content=get_tooltip_content,
                                        x_axis_values=None,
                                        y_axis_values=None,
                                        unified_context=True,
                                        color_func=color_func,
                                        show_axes=False,
                                        term_metadata=explanations.to_dict(),
                                        use_non_text_features=use_non_text_features,
                                        **kwargs)
    return html


    :param corpus: Corpus
    :param x_score_df: pd.DataFrame, contains effect_size_column, p_value_column. outputted by CohensD
    :param y_score_df: pd.DataFrame, contains effect_size_column, p_value_column. outputted by CohensD
    :param x_label: str
    :param y_label: str
    :param statistic_column: str, column in x_score_df, y_score_df giving statistics, default cohens_d
    :param p_value_column: str, column in x_score_df, y_score_df giving effect sizes, default cohens_d_p
    :param statistic_name: str, column which corresponds to statistic name, defauld d
    :param use_non_text_features: bool, default True
    :param pick_color: func, returns color, default is pick_color
    :param axis_scaler: func, scaler default is scale_neg_1_to_1_with_zero_mean
    :param distance_measure: DistanceMeasureBase, default EuclideanDistance
        This is how parts of the square are populated
    :param semiotic_square_labels: dict, semiotic square position labels
    :param x_tooltip_label: str, if None, x_label
    :param y_tooltip_label: str, if None, y_label
    :param kwargs: dict, other arguments
    :return: str, html
    
scattertext/__init__.py