|
之前我們介紹過這樣的plot(復現(xiàn)《nature communications》圖表(二):一勞永逸,R語言一鍵畫表達量箱線圖并添加顯著性),關(guān)于基因表達箱線圖并添加顯著性標記的作圖,小伙伴希望能有python版本,所以這里在python中展示一下,其實在之前的(【1:1復刻R版】python版火山圖函數(shù)一鍵出圖,【1:1復刻Cell】python版單細胞多組差異基因火山圖可視化函數(shù))就說過,要想達到R的ggplot2效果,python中matplotlib結(jié)合seaborn就是它的平替。這里我們將復現(xiàn)過程包裝在一個函數(shù)中了,如果您自己需要單獨理解,拆解函數(shù)即可,很多參數(shù)都是默認,比如字體什么的,自行調(diào)整即可。
加載庫: #導入庫import seaborn as snsimport matplotlib.pyplot as pltimport pandas as pdimport numpy as npimport itertoolsfrom scipy.stats import ttest_indfrom statannotations.Annotator import Annotator df = pd.read_csv('./Exp.csv')df.head()函數(shù),plot主體使用的是seaborn,本函數(shù)檢驗使用的是兩兩t檢驗!def ks_boxplot_exp(df, group_col, value_col, order=None, figsize=(3,3), palette="Set2", x_angle=45, log=False,tick_size=3,frame=True ): """ df : pd.DataFrame,寬表格式數(shù)據(jù),包含group,不同基因表達量 group_col : str,分組列名 #gene_cols : list,要繪制的基因名列表 order : list,分組順序設(shè)置 palette : 分組顏色設(shè)置,可以是列表,也可以是固定每組顏色的字典 figsize : 整體大圖大小尺寸 x_angle:x軸標簽文字角度 log:是否需要對數(shù)據(jù)進行對數(shù)轉(zhuǎn)化處理,默認False """
if order is None: order = df[group_col].unique().tolist() plot_df = df.copy() #數(shù)據(jù)做一下log轉(zhuǎn)化 if log: plot_df[value_col] = np.log2(plot_df[value_col] + 1) plt.figure(figsize=figsize, dpi=300) # 箱線圖 ax = sns.boxplot( data=plot_df, x=group_col, y=value_col, order=order, palette=palette, fliersize=0, width=0.6 ) # 帶抖動散點 sns.stripplot( data=plot_df, x=group_col, y=value_col, order=order, jitter=True, size=2, alpha=0.7, palette=palette, dodge=False, ax=ax ) # 兩兩組合 t 檢驗 pairs = list(itertools.combinations(order, 2)) p_values = [] for g1, g2 in pairs: vals1 = plot_df.loc[plot_df[group_col]==g1, value_col].dropna() vals2 = plot_df.loc[plot_df[group_col]==g2, value_col].dropna() stat, p = ttest_ind(vals1, vals2, equal_var=False) p_values.append(p) # 顯著性標記 annotator = Annotator(ax, pairs, data=plot_df, x=group_col, y=value_col, order=order) annotator.configure(test=None, text_format='star', loc='inside', verbose=0,fontsize=4) annotator.set_pvalues(p_values) annotator.annotate()
for line in ax.lines: line.set_color('black') line.set_linewidth(0.5) # 設(shè)置標題和坐標軸 ax.set_title(value_col, fontsize=6) ax.set_ylabel("") ax.set_xlabel("") plt.xticks(rotation=x_angle)
ax.tick_params(axis='both', which='major', labelsize=tick_size)
if frame: ax.spines['top'].set_visible(True) ax.spines['right'].set_visible(True) else: ax.spines['top'].set_visible(False) ax.spines['right'].set_visible(False) plt.tight_layout() plt.show()
ks_boxplot_exp(df=df, group_col='Type', value_col='CXCL8', log=True, figsize=(1.5,2.5), x_angle=90, tick_size=5) ks_boxplot_exp(df=df, group_col='Type', value_col='CXCL8', log=True, figsize=(1.5,2.5), x_angle=90, tick_size=5, frame=False) ks_boxplot_exp(df=df, group_col='Type', value_col='CXCL8', log=True, figsize=(1.5,2.5), x_angle=90, tick_size=5, frame=False, order=['Critical', 'Severe', 'Mild','Asymptomatic']) 循環(huán)批量出圖:因為考慮到很多人有不同的排版以及對于圖形調(diào)整的需求,所以函數(shù)只能畫一個基因,不能一次性畫多個基因并進行排布,畫多個基因可以利用循環(huán)。#循環(huán)plot多個基因gene_cols = ['CXCL8','MMP8','TLR4']for gene in gene_cols: ks_boxplot_exp(df=df, group_col='Type', value_col=gene, log=True, figsize=(1.5,2.5), x_angle=90, tick_size=5)
|