matplotlib和seaborn是python的两大核心可视化库,seaborn是matplotlib的进一步封装。由于matplotlib库比较复杂,这里记录一下使用两个库协同作图的过程。使用的data大致格式如下:
结果如下图:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
'''sns.set() 是figure的全局预设, 总共提供了包括white, dark, whitegrid, darkgrid, ticks在内的5中预设'''
sns.set(style='darkgrid')
# title格式的字典
titleFontdict={'family':'Times New Roman', 'size': 25}
# 轴标签格式的字典
axesFontdict={'family':'Times New Roman', 'size': 20}
# 染色体在x轴上的排列顺序
chromsmOrder=list('123456789')+['10','11','12','13','14','15','16','17','18','19','20','21','22','23','24','25','26','27',
'28','29','X','MT','UK']
# 第一步, 建立画布,设置长宽
fig = plt.figure(figsize=[16,6])
'''第二步, 规划画布,使用GridSpace比subplots更为灵活的原因是,subplots只能设定相同长宽的多个子图,而GridSpace是把figure分为很多矩阵的网格后,对网格索引选取来获得指定长宽的子画布。其nrows=8, ncols=8 两个参数把画布分割成了8行8列,hspace控制任意两个子画布的垂直间隔, wspace控制任意两个子画布的水平间隔'''
grid=plt.GridSpec(nrows=8, ncols=8,hspace=0, wspace=0.4)
'''第三步, grid函数在第二步得到的画布上选定一个区域, 然后在这个区域上安放第一个xy坐标轴,并作图, note:在xy轴上只能使用seborn的axes-level函数, 不能使用figure-level函数,因为figure-level函数,如relplot,catplot,heatplot,clusterplot等是高度封装,失去了灵活性,只能在整张画布上作图'''
mainAx=fig.add_subplot(grid[0:7,0:7])
sns.swarmplot(data=df, x='chromsome', y = 'length', hue='exonInteval', order=chromsmOrder, ax=mainAx,s=2.5,
hue_order=['[2, 5)','[5, 8)', '[8, 11)', '[11, 14)', '[14, 17)', '[17, 20)', '[20, 25]'])
plt.legend(loc='upper left', ncol=3, title='Exon number intervals',markerscale=0.5, framealpha=0.001, fontsize=12)
plt.title('Characterization of unknown intergenic transcripts', titleFontdict)
plt.xlabel("")
plt.ylabel('Transcript length', axesFontdict)
plt.yticks( size = 15, family='Times New Roman')
# 第四步,grid函数重新选定一个区域,然后在这个区域上安放第二个xy坐标轴,并作图
belowAx = fig.add_subplot(grid[7:8, 0:7])
sns.countplot(x='chromsome', data=df, order=chromsmOrder, color='RoyalBlue')
plt.xlabel('Chromosome', axesFontdict)
plt.ylabel('Count', axesFontdict)
plt.xticks(size = 15, family='Times New Roman')
plt.yticks(size = 15, family='Times New Roman')
# 第五步, grid函数重新选定一个区域,然后在这个区域上安放第三个xy坐标轴,并作图
right = fig.add_subplot(grid[0:7,7:8], sharey = mainAx)
sns.distplot(df.length, vertical=True, color='Royalblue')
plt.title('length distribution', axesFontdict)
plt.ylabel("")
plt.xticks([0,0.0005],['0','0.0005'])
# 第六部, 设置这些图在画布边缘的位置,
plt.subplots_adjust(left=0.08, right=0.95, top=0.9, bottom=0.15)
plt.savefig('xxx.pdf', dpi=600)
plt.show()