включение значения p в график коробки или скрипки

#matplotlib #statistics #seaborn

Вопрос:

Я сделал сюжет для скрипки с кодом ниже (см. Рисунок для сюжета). Мне интересно, можно ли получить p-значения различий между образцами по оси x. Это может быть любой статистический тест, который показывает значение p, поэтому, если в графике скрипки наблюдается глобальный сдвиг, можно увидеть разницу.

сюжет для скрипки

Редактировать:

Для ясности я надеялся добавить что-то подобное, чтобы показать pvals между образцами:

 for i,p in enumerate(pvals):
    if p>=0.05:
        displaystring = r'n.s.'
    elif p<0.0001:
        displaystring = r'***'
    elif p<0.001:
        displaystring = r'**'
    else:
        displaystring = r'*'
 

Код на Python для создания скрипичного сюжета:

 #!/usr/bin/env python

"""
Usage: Run script in ~/snakemake_eclip/scripts, use help function to see which parameters are needed.

This script takes in the all_reads_matrix made by merge_matrix.py and creates a violin plot.
"""

import pandas as pd
import argparse
import matplotlib.pyplot as plt
import os
import seaborn as sns
import numpy as np
plt.switch_backend('agg')
from scipy import stats
import numpy as np

def make_violin(in_matrix, save_path):

    df = pd.read_csv(str(in_matrix), index_col=False)

    # remove outliers

    Q1 = df.quantile(0.25)
    Q3 = df.quantile(0.75)
    IQR = Q3 - Q1

    df = df[~((df < (Q1 - 1.5 * IQR)) | (df > (Q3   1.5 * IQR))).any(axis=1)]

    # drop zeros

    df = df[(df != 0).all(1)]

    df = df.iloc[:, 1:].transform(lambda x: np.log(x / x.sum()))

    print(df)

    plt.figure(figsize=(20, 10), dpi=300)

    sns.violinplot(data=df)

    plt.plot()

    plt.title("Read Counts of Individual ENSG")
    plt.xlabel("Samples")
    plt.ylabel("Log Transformed Normalized Read Count")

    plt.savefig(os.path.join(str(save_path), 'all_reads_matrix_violin_plot_norm_log.pdf'))

if __name__ == '__main__':

    parser = argparse.ArgumentParser(description='Create a violin plot from all_reads_matrix.csv')

    parser.add_argument("--in_matrix",
                        help='name of input matrix')

    parser.add_argument("--save_path",
                        help='path to save')

    # parse out arguments

    args = parser.parse_args()

    # mutate matrix columns

    make_violin(args.in_matrix, args.save_path)
 

Комментарии:

1. Вы можете использовать plt.text для добавления значений p поверх рисунка, или, если у вас есть одно значение p на образец, вы можете изменить метки xticklabels, чтобы они содержали ваши звездочки.

2. Мне нужно найти способ автоматизировать генерацию этих значений p. При каждом запуске программы будет создаваться новая фигура, поэтому я не могу вручную добавлять их с помощью plt.text.

3. Вы спрашиваете, как рассчитать p-значения или как построить p-значения после их создания?

4. в обоих случаях я бы подумал, что в matplotlib встроена функция, которую я мог бы применить.

5. Matplotlib не занимается статистикой; вам нужно будет вычислить p-значения отдельно. Как только они у вас появятся, вы сможете записать их на сюжет, используя plt.text.