火山图可以直观展示组间差异及差异的确信程度。已知的R中ggplot2可以完成火山图的绘制,python中也已经有一些程序包可以用于绘制火山图。直观来看,火山图其实就是复杂一点的散点图。可以尝试利用scatter绘制散点图的方法,手动将火山图绘制出来。
利用plt.scatter绘制火山图
目的:从头绘制横坐标为FoldChange,纵坐标为pvalue的火山图,同时将pvalue<=0.05, FC>=3/2的点标记为红色(显著上升),将pvalue<=0.05, FC<=2/3的点标记为蓝色(显著下降)。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
df=pd.read_csv('./cyp71.txt',sep='\t')#读取数据表格
df['cyp71-2/Col-0']=df['cyp71-2']/df['Col-0']#计算foldchange
##############cyp71-2######################
c2part1=df[(df['pvalue_cyp71-2']<=0.05)&(df['cyp71-2/Col-0']>=3/2)]#上调的点,标记为红色
c2part2=df[(df['pvalue_cyp71-2']<=0.05)&(df['cyp71-2/Col-0']<=2/3)]#下调的点,标记为蓝色
c2part3=df[(df['pvalue_cyp71-2']>0.05)|((df['cyp71-2/Col-0']<3/2)&(df['cyp71-2/Col-0']>2/3))]#不显著的点,标记为灰色
plt.axhline(-np.log10(0.05),color='grey',linestyle='--')#绘制水平虚线,标记出pvalue=0.05的位置
plt.axvline(np.log2(3/2),color='grey',linestyle='--')#绘制竖直虚线,标记出比值为3/2的位置
plt.axvline(np.log2(2/3),color='grey',linestyle='--')#绘制竖直虚线,标记出比值为2/3的位置
plt.scatter(np.log2(c2part1['cyp71-2/Col-0']),-np.log10(c2part1['pvalue_cyp71-2']),color='r')#绘制上调的点
plt.scatter(np.log2(c2part2['cyp71-2/Col-0']),-np.log10(c2part2['pvalue_cyp71-2']),color='b')#绘制下调的点
plt.scatter(np.log2(c2part3['cyp71-2/Col-0']),-np.log10(c2part3['pvalue_cyp71-2']),color='grey')#绘制不显著变化的点
plt.xlim((-4,4))#设置横坐标范围
plt.ylim((0,3))#设置纵坐标范围
plt.savefig('volcano_cyp71-2.pdf')
plt.show()
最终的绘制结果为: