#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.