基因组数据绘图

【可视化】matplotlib入门之bar图断轴

2020-08-06  本文已影响0人  XuningFan
image.png

进行轴的破断,一般实属无奈,主要是因为很多时候数据分别分散在较高的值范围区间和较低的值范围区间。如果不进行轴的破断,如果不进行轴的断裂,往往很难突出不同层级数据的比较。
而如果实现轴的断裂,在matplotlib中,实际上是通过构建两个子图共享x坐标设置ylim来完成的。
那么我们就举个例子来说明断轴的绘制。
示例数据stat如下:

distance    samA    samB
dis1    0.6790112967848988  0.660274606277646
dis2    0.04681356878281352 0.040788283695716195
dis3    0.05235007001593365 0.047893246913247325
dis4    0.06391873701142113 0.06573913372077489
dis5    0.0342810952562591  0.039306155660338
dis6    0.024587811660709127    0.027530954616041138
dis7    0.020484490998321093    0.02107539414028462
dis8    0.011294846989083502    0.011378185815316648
dis9    0.008133887951979783    0.008329914206552479
dis10   0.0064500160117160225   0.006760516085783134
dis11   0.02080922282354933 0.024131877454252205
dis12   0.019726656586632738    0.026527772403233462
dis13   0.008434331956239357    0.013396557034664053
dis14   0.0037039671704428402   0.0068674019761498705

step1:导入matplotlib 四件套

import numpy as np
import pandas as pd
import matplotlib as  mpl
mpl.use('Agg')
from matplotlib import pyplot as plt
plt.style.use('ggplot')
import seaborn as sns

step2 设置一上一下两个子图,子图ax1,子图 ax2

ax1=fig.add_axes([0.15,0.1,0.8,0.5],axisbg='w')
ax2=fig.add_axes([0.15,0.62,0.8,0.28],axisbg='w')
ax1.tick_params(left='off',bottom='off',top='off',right='off')
ax2.tick_params(left='off',bottom='off',top='off',right='off')
for loc in ['left','right','bottom']:
    ax1.spines[loc].set_color('k')
    ax1.spines[loc].set_linewidth(1)

for loc in ['left','right','top']:
    ax2.spines[loc].set_color('k')
    ax2.spines[loc].set_linewidth(1)

step3 读取数据

ratio_stat_df=pd.read_table(stat,header=0)
index=ratio_stat_df.index #用于设置X坐标位置

step4 在子图1绘制bar图,设置低的ylim(0,0.1)突出下层级别的数据:

bar_width=0.35
ax1.bar(index+1,ratio_stat_df['samA'],bar_width,align="center",linewidth=0.5, color='#C4DEB9',edgecolor='k',label='samA')
ax1.bar(index+1.5,ratio_stat_df['samB'],bar_width,align="center",linewidth=0.5,color='#CBE6F7',edgecolor='k',label='samB')
ax1.set_xlim(0,15)
ax1.set_ylim(0,0.1)

step4 在子图1绘制bar图,设置高的ylim(0.5,0.75)突出上层级别的数据:

ax2.bar(index+1,ratio_stat_df['samA'],bar_width,align="center",linewidth=0.5, color='#C4DEB9',edgecolor='k',label='samA')
ax2.bar(index+1.5,ratio_stat_df['samB'],bar_width,align="center",linewidth=0.5,color='#CBE6F7',edgecolor='k',label='samB')
ax2.set_ylim(0.5,0.75)
ax2.set_xlim(0,15)

设置ticks:

ax1.set_xticks([x+0.25 for x in list(range(1,15))])
ax1.set_xticklabels(list(ratio_stat_df['distance']))
ax2.set_xticks([])
ax1.set_ylabel('Ratio',fontsize=20)
ax1.set_xlabel("Distance",fontsize=16)

在坐标位置绘制横线标志断轴:

kwargs1 = dict(transform=ax1.transAxes, color='#57A3C3', clip_on=False)
kwargs2 = dict(transform=ax2.transAxes, color='#57A3C3', clip_on=False)
ax1.plot([-0.01,0.01],[1,1],**kwargs1)
ax2.plot([-0.01,0.01],[0,0],**kwargs2)
ax1.plot([0.99,1.01],[1,1],**kwargs1)
ax2.plot([0.99,1.01],[0,0],**kwargs2)

绘制legend:

frame=ax2.legend(loc='upper right',prop={'size':16}).get_frame()
frame.set_edgecolor('white')
frame.set_facecolor('white')

经过简单的几步,即可绘制断轴bar图

结果展示如下:

image.png
上一篇 下一篇

猜你喜欢

热点阅读