見出し画像

酵素活性データを例にした棒グラフの描画その2(Matplotlib, Seaborn)

前回に引き続き今回は酵素1-3の酵素活性について,阻害剤のある場合ない場合に分け,3回繰り返し測定したデータ例を用意。
平均値,標準偏差を計算後,matplotlib, seabornの両方で棒グラフを描いてみる。
なお,このデータではEnzyme2にのみ阻害剤が効果的に効き酵素活性が低下しているという結果を想定している。

前回


仮想データの準備

# 仮想データの準備
a,b,c,d,e,f = [],[],[],[],[],[]

for i in range(1,4):
    np.random.seed(i)
    a.append(np.random.uniform(5,15))
    b.append(np.random.uniform(20,40))
    c.append(np.random.uniform(35,50))
    d.append(np.random.uniform(5,15))
    e.append(np.random.uniform(1,5))
    f.append(np.random.uniform(35,50))

#  阻害剤を入れていない実験群
mock_df =pd.DataFrame({'experiment':[1,2,3],'inhibitor':['-','-','-'],
                       'enzyme1':a,'enzyme2':b,'enzyme3':c})

#  阻害剤を入れた実験群
inhibitor_df =pd.DataFrame({'experiment':[1,2,3],'inhibitor':['+','+','+'],
                            'enzyme1':d,'enzyme2':e,'enzyme3':f})

print("enzyme1-3の酵素活性測定結果(mock_df):")
display(mock_df)    
print("阻害剤を入れたenzyme1-3の酵素活性測定結果(inhibitor_df):")
display(inhibitor_df)

mean, sdの計算

mock_meansd = mock_df.describe().drop('experiment', axis =1).loc[['mean','std'],:]
inhibitor_meansd = inhibitor_df.describe().drop('experiment', axis =1).loc[['mean','std'],:]

print("mock_meansd(enzyme1-3, inhibitor(-)):")
display(mock_meansd)    
print("inhibitor_meansd(enzyme1-3, inhibitor(+)):")
display(inhibitor_meansd)

Matplotlibの Axes.barで棒グラフを描画

# axe.bar で描画
sns.set_style('darkgrid', {"axes.facecolor": ".9"})
sns.set_context('talk')
name = mock_meansd.columns
y_mock = mock_meansd.loc['mean',:]
y_inh = inhibitor_meansd.loc['mean',:]

mock_err = mock_meansd.loc['std',:]
inh_err = inhibitor_meansd.loc['std',:]

length = np.arange(len(y_mock))  
width =0.35

fig,ax = plt.subplots(figsize = (8,10))

ax.bar(length-width/2, y_mock, width, yerr = mock_err, 
           edgecolor = "black", error_kw=dict(lw=1, capsize=8, capthick=1), label = 'inhibitor (–)')
ax.bar(length+width/2, y_inh, width, yerr = inh_err,
       edgecolor = "black", error_kw=dict(lw=1, capsize=8, capthick=1), label = 'inhibitor (+)')

ax.set(xticks = length, xticklabels = name, ylabel = 'Activity (%)' )

#yticksを10刻みに
from matplotlib import ticker
ax.yaxis.set_major_locator(ticker.MultipleLocator(10))
ax.legend()

Seabornの sns.barplot()でグラフを描画

まず阻害剤(-)と阻害剤(+)のデータを縦に'pd.concat'で繋げる

df_conc = pd.concat([mock_df,inhibitor_df], axis = 0)
df_conc

sns.barplotで描画

#  sns.barplotで描画
sns.set()
sns.set_style('darkgrid',{"axes.facecolor": ".9"})
sns.set_context('talk')
fig, ax = plt.subplots(figsize = (8, 10))
ax =sns.barplot(x= 'samples', y = 'activity', hue = 'inhibitor', data = df_melt,
           ci = 'sd', edgecolor = 'black', capsize=.1, errwidth=1)

ax.set(ylabel = 'Activity (%)', xlabel = "")

#  yticksを10刻みに
ax.yaxis.set_major_locator(ticker.MultipleLocator(10)) 
・edgecolor:棒グラフの枠線を指定
・capsize :エラーバーの横棒部分の長さを指定
・errwidth: エラーバーの線の太さを指定

(一応)groupbyとaggでmeltしたdataからmeanとsdを計算

df_melt.groupby(['samples','inhibitor'],as_index=False).agg({'activity':[np.mean, np.std]})

おしまい

この記事が気に入ったらサポートをしてみませんか?