最近需要用python做几个可视化分析,但是之前没怎么用过,决定借助这个机会学习一下,同时写批博客记录这个过程。
1. 建立画布
1. 建立画布,子图布局
import pandas as pd
import matplotlib.pyplot as plt,seaborn as snsfig,ax = plt.subplots(1,3,figsize=(15,5))
subplots是matplotlib中用于将多个图画在一个平面上的工具,可以用于组合图表。其中fig是画布对象,ax应该是一个包含有3个plot的numpy数组。
重要参数:
- nrows:1,代表一行,这样得到的ax是一个一维子图数组,以此类推
- ncols: 3,代表该行中有三个子图,默认是平均分配的。
- figsize:(x,y),代表整个画布的大小,暂时没有搞清楚数值是如何计算得到的。
- sharex,sharey:可以填写参数包括'col',每列共线相同的x或y轴;'row',同一行使用相同x或y轴;'all'所有图使用相同的x轴或y轴;True,等同于'all';Flase,各子图间相互独立
- width_ratios 设置相对宽度,输入一个包含相对比例的列表,默认是各子图宽度均等
- height_ratios 设置相对高度,输入一个包含相对比例的列表,默认是各子图高度均等
1.2 调整子图间距
plt.subplots_adjust(left=0,bottom=0,top=1,right=1,wspace=0.2,hspace=0.2)
参数:
- 通过left,top,bottom,right4个参数控制子图四个边缘的距离,参数值为浮点数,该距离算在子图内部 ;数值代表的含义是图像占据的空间,1-value才等于留出的空白;由于坐标原点位于子图的左下方,通常只调整top和right的坐标,调控left和bottom可能会导致子图重叠
- wspace和hspace代表子图间的列距和行距,行距和列距占据画布的总空间,因此调整行距和列距会影响子图的大小。
2. 绘制核密度曲线图
2.1 使用kdeplot绘制
示例代码
df=pd.read_csv(ksfile,index_col=None)
#### 构建数据
dSyn=df["dS-yn"].values
dSng=df["dS-ng"].values
#### 绘制密度曲线
sns.kdeplot(a=dSyn,label="dS-yn",ax=ax[0])
sns.kdeplot(a=dSng,label="dS-ng",ax=ax[0])
#### 设置行列标签、图例、标题
ax[0].set_xlabel("KS")
ax[0].set_ylabel("Density")
ax[0].legend(loc="best")
ax[0].set_title("Synonymous substitution rate")
#### 视图范围优化
ax[0].set_xlim(-0.2,1)
ax[0].set_ylim()
参数:
- 输入数据结构:df或者numpy.ndarray数组
- label:设置密度曲线标签,不设置的话无法打印图例
- ax:指定子图
结果
3. 盒型图和小提琴图
3.1 箱线图
关键词:
- Q1:1/4值
- median:中值
- Q3:3/4值
- IQR:Q1到Q3的距离
- 1.5xIQR:箱须到Q1或者Q3的距离
- fliers:箱须外的点
3.1.1 绘制箱线图图
ax[0,1].boxplot(df[[x[0],x[2]]].values,labels=[x[0],x[2]],patch_artist=False,showfliers=False)
ax[0,1].set_xlabel("KS KA distribution")
ax[0,1].set_ylim(0,0.8)
ax[1,1].set_ylim(-0.2,1)
ax[1,1].boxplot([df[x[1]]/df[x[0]].values,df[x[3]]/df[x[2]].values],labels=["dN/dS-yn","dN/dS-ng"],patch_artist=False,showfliers=False)
重要参数:
- x(输入数据):如果是二维数组,则为 x 中的每一列绘制一个箱线图。 如果是一维数组序列,则为 x 中的每个数组绘制箱线图。
- notch:选择箱子形状,通过布尔值控制,绘制有缺口的箱线图 (True) 或矩形箱线图 (False),有缺口的箱线图缺口表示中位数的置信区间;
- sym:fliers的形状,通过字符串来控制,字符串为""时隐藏fliers
- whis:控制箱须的长度,通过float值控制,为箱须长度value*IQR
- vert:控制箱型图的方向,为True绘制垂直箱型图,为False绘制横向箱型图
- bootstrap:通过整数指定,计算中位线置信区间是采用的重采样次数,为None时将采用基于高斯的渐近近似计算缺口;建议取值范围为
1000-10000。
- usermedians:指定中位数,填充数据为和箱型图数量相等的类数组数据,内部的值被指定为中位数;如果元素为
None
,箱体V型凹槽的位置由其他参数计算。 - conf_intervals:是否指定置信区间。类型为类数组结构,形状为 (len(x), 2)。可选参数。如果元素不为None,则将该值强制设置为箱体V型凹槽位置(只有当notch参数为True时绘制);如果元素为None,箱体V型凹槽的位置由其他参数计算,例如bootstrap。
positions
:指定箱体的位置。刻度和极值会自动匹配箱体位置。类型为类数组结构。可选参数。默认值为range(1, N+1)
,N
为箱线图的个数。widths
:箱体的宽度。类型为浮点数或类数组结构。默认值为0.5
或0.15*极值间的距离
。patch_artist
:控制箱体的生成对象。类型为布尔值,默认值为False;通过该选项可以调控箱体的颜色填充,为True时填充箱体颜色。
labels
:每个数据集的标签,默认值为'None'
。类型为序列。可选参数。manage_ticks
:控制刻度和标签位置,类型为布尔值,取值为True
时,刻度和标签位置自动匹配箱线图的位置;当manage_tricks为False时,labels的标签将不会展示。meanline
:均值显示为线还是点。类型为布尔值,默认值为False
。可选参数。当取值为True
,且showmeans
、shownotches
参数均为True
,时显示为线,线条属性受meanprops
参数控制;否则显示为点。- autorange:(不理解,没有看出True和Flase的效果差异)
- zorder:用来控制绘图顺序,其值越大,画上去越晚,用于控制线条叠加顺序,在箱线图暂时没看出用处在哪。
其他样式控制参数:
- showcaps:是否显示箱须两端的横杠。类型为布尔值,默认值为True。可选参数。
- showbox:是否显示箱体。类型为布尔值,默认值为True。可选参数。
- showfliers:是否显示离群值。类型为布尔值,默认值为True。可选参数。
- showmeans:是否显示算术平均值。类型为布尔值,默认值为False。可选参数。
- capprops:箱须横杠的样式。类型为字典,默认值为None。可选参数。
- boxprops:箱体的样式。类型为字典,默认值为None。可选参数。
- whiskerprops:箱须的样式。类型为字典,默认值为None。可选参数。
- flierprops:离群点的样式。类型为字典,默认值为None。可选参数。
- medianprops:中位数的样式。类型为字典,默认值为None。可选参数。
- meanprops:算术平均值的样式。类型为字典,默认值为None。可选参数。
3.1.2 颜色调整
a=ax[1,1].boxplot([df[x[1]]/df[x[0]].values,df[x[3]]/df[x[2]].values],labels=["dN/dS-yn","dN/dS-ng"],patch_artist=True,showfliers=False)
a["boxes"][0].set_facecolor("lightblue")
a["boxes"][1].set_facecolor("lightblue")
a[boxes]是一个包含line2D实例的列表,在将patch_artist值设置为True后,可以内部的实例由line2D替换为Patch,然后通过Patch类的set_facecolor方法直接填充颜色。
3.2 小提琴图
3.2.1 绘制提琴图
def set_axis_style(ax, labels):
ax.xaxis.set_tick_params(direction='out')
ax.xaxis.set_ticks_position('bottom')
ax.set_xticks(np.arange(1, len(labels) + 1), labels=labels)
ax.set_xlim(0.25, len(labels) + 0.75)
ax.set_xlabel('Sample name')violin1=ax[0,2].violinplot(df[[x[0],x[2]]].values)
ax[0,2].set_xlabel("Ks calculation algorithm")
ax[0,2].set_ylabel("Ks values")
set_axis_style(ax[0,2],[x[0],x[2]])
ax[0,2].set_title("KS")
violin1=ax[1,2].violinplot([df[x[1]]/df[x[0]].values,df[x[3]]/df[x[2]].values])
ax[1,2].set_xlabel("Ks calculation algorithm")
ax[1,2].set_ylabel("Ka/Ks values")
set_axis_style(ax[1,2],[x[1],x[3]])
ax[1,2].set_title("Ka/Ks")
重要参数:
dataset:输入数据,类型通箱型图
vert:同箱型图
position:同箱型图
widths:小提琴图的最大宽度
showmeans,showmedians,showextrema:是否展示均值、中位数和极值。
quantiles:指定分位数线,根据个人需要,可以绘制多条。
points:int数据类型,定义用于评估每个高斯核密度估计的点数(这个不理解)。
bw_method:输入类型为字符串,绘制kde线的时候需要
data:略
注意:matplotlib.pyplot官网关于小提琴图没有提供刻度标签绘制的参数,可以通过example中提供的set_axis_style函数进行绘制。
4. 图片保存
fig.savefig('group1KS.png')
plt.close()
最终结果: