我有两组14823个基因(疾病和对照)的数据,我想绘制一个vulcano图。我已经计算出p值,但是如何用倍数变化绘制它呢?如果我尝试散点图,则x和y的大小不相同。
在下面的示例中,我模拟了一些数据,在两组数据之间进行了t检验,并计算了倍数变化和p值,然后将所有这些数组都放入了data.frame中。
X = np.random.poisson(10,size=(10000,5))
Y = np.concatenate((np.random.poisson(5,size=(1000,5)),
np.random.poisson(10,size=(8000,5)),
np.random.poisson(20,size=(1000,5))))
test= stats.ttest_ind(X,Y,axis=1)
l2fc = np.log2(np.mean(X,axis=1) / np.mean(Y,axis=1))
df = pd.DataFrame({'gene':['gene'+str(i) for i in range(10000)],
'l2fc':l2fc,
'stat':test.statistic,
'pvalue':test.pvalue
})
df['log10P'] = -np.log10(df['pvalue'])
我还在最后一步中计算了-log10(pvalue)。因此数据框如下所示:
gene l2fc stat pvalue log10P
0 gene0 1.289507 5.200000 0.000822 3.084916
1 gene1 0.455679 2.525343 0.035512 1.449625
2 gene2 0.665581 2.039184 0.075770 1.120505
3 gene3 1.424498 2.897144 0.019979 1.699426
4 gene4 1.231326 4.180039 0.003079 2.511526
在这种情况下,如果我们想在某些标签上加上-log10P> 5:
df[df.log10P>6]
gene l2fc stat pvalue log10P
9231 gene9231 -0.888969 -15.777870 2.602345e-07 6.584635
9302 gene9302 -1.330149 -17.666667 1.077465e-07 6.967597
9531 gene9531 -1.239827 -13.492385 8.734624e-07 6.058756
9596 gene9596 -1.550197 -19.091883 5.867840e-08 7.231522
现在我们可以使用seaborn进行绘图:
plt.figure(figsize = (6,8))
ax = sns.scatterplot(data=df,x='l2fc',y='log10P')
labelgenes = df.gene[df.log10P>6]
for gene in labelgenes:
row = df['gene']== gene
ax.text(df.l2fc[row]+0.04, df.log10P[row], gene)