jitter plot

一つの調査項目に対して、複数サンプルが調査され、中には同じ値が得られる場合がある。このようなデータを点グラフで表すと、同じ値は同じ所にプロットされる。そのため、点と点が重なってデータの数を確認できなくなる。そこで、このようなデータに微小な値を足したり、引いたりして、本来の値から少しだけずらすことで、点が重ならないような点グラフを描けるようになる。

このような jitter プロットは seaborn ライブラリーの stripplot メソッドを使用して描ける。入力データとして、Pandas のデータフレーム型のデータを与える。

import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
import seaborn as sns

plt.style.use('default')
sns.set()
sns.set_style('whitegrid')
sns.set_palette('Set3')

np.random.seed(2018)

df = pd.DataFrame({
    'leaf': np.random.normal(10, 2, 20),
    'stem': np.random.normal(15, 3, 20),
    'root': np.random.normal(5, 1, 20)
})

df_melt = pd.melt(df)
print(df_melt.head())
##   variable      value
## 0     leaf   9.446465
## 1     leaf  11.163702
## 2     leaf  14.296799
## 3     leaf   7.441026
## 4     leaf  11.004554

fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)

sns.stripplot(x='variable', y='value', data=df_melt, jitter=True, color='black', ax=ax)

ax.set_xlabel('tissue')
ax.set_ylabel('dry weight [g]')
ax.set_ylim(0, 20)

plt.show()
matplotlib/seaborn pyplot.stripplot を利用して作成したjitter プロット

複数カテゴリを持つようなデータに対しても同様に jitter プロットを描くことができる。このとき、入力データとして、Pandas のデータフレーム型のデータを与える。

import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
import seaborn as sns

plt.style.use('default')
sns.set()
sns.set_style('whitegrid')
sns.set_palette('Set3')

np.random.seed(2018)

# data of Ta (T. aestivum) group
dfTa = pd.DataFrame({
    'leaf': np.random.normal(10, 2, 20),
    'stem': np.random.normal(15, 3, 20),
    'root': np.random.normal(5, 1, 20)
})

# data of At (A. tauschii) group
dfAt = pd.DataFrame({
    'leaf': np.random.normal(12, 3, 20),
    'stem': np.random.normal(12, 3, 20),
    'root': np.random.normal(6, 2, 20)
})


dfTa_melt = pd.melt(dfTa)
dfTa_melt['species'] = 'T. aestivum'
dfAt_melt = pd.melt(dfAt)
dfAt_melt['species'] = 'A. tauschii'

df = pd.concat([dfAt_melt, dfTa_melt], axis=0)

fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)

sns.stripplot(x='variable', y='value', data=df, hue='species', dodge=True,
              jitter=True, color='black', palette='Dark2', ax=ax)

ax.set_xlabel('tissue')
ax.set_ylabel('dry weight [g]')
ax.set_ylim(0, 20)

plt.show()
matplotlib/seaborn pyplot.stripplot を利用して作成したjitter プロット(複数属性)